eis/mix_cc/sql/set.h

92 lines
2.9 KiB
C
Raw Normal View History

/**
* @file mix_cc/sql/set.h
* @brief
* @author Cat (null.null.null@qq.com)
* @version 0.1
* @date 2021-09-17
*
* Copyright: Baosight Co. Ltd.
* DO NOT COPY/USE WITHOUT PERMISSION
*
*/
#pragma once
#include "mix_cc/sql/public.h"
#include "mix_cc/sql/statement.h"
#include "mix_cc/sql/where.h"
#include <algorithm>
#include <string>
namespace mix_cc {
namespace sql {
namespace detail {
template <typename PrevStatement, typename Enable, typename... Values>
struct set_t_impl;
template <typename PrevStatement, typename... Values>
struct set_t_impl<
PrevStatement,
std::enable_if_t<PrevStatement::s_text == op::cmd_t::insert_into>,
Values...> : public prev_statement_t<PrevStatement>,
public statement_t {
static constexpr auto s_text = op::cmd_t::set;
constexpr explicit set_t_impl(PrevStatement prev_st, Values... values)
: prev_statement_t<PrevStatement>(prev_st),
values_(hana::make_tuple(values...)) {}
constexpr auto get_command() {
std::string op1_str = "VALUES";
auto col_names =
hana::transform(values_, [](auto val) { return val.get_col_name(); });
auto r_str_c = hana::fold_left(
col_names, [](auto col1, auto col2) { return col1 + "," + col2; });
auto vals =
hana::transform(values_, [](auto val) { return val.get_value(); });
auto r_str_c2 = hana::fold_left(
vals, [](auto val1, auto val2) { return val1 + "," + val2; });
return std::string("(") + r_str_c + ")" + op1_str + "(" + r_str_c2 + ")";
}
public:
hana::tuple<Values...> values_;
};
template <typename PrevStatement, typename... Values>
struct set_t_impl<PrevStatement,
std::enable_if_t<PrevStatement::s_text == op::cmd_t::update>,
Values...> : public prev_statement_t<PrevStatement>,
public statement_t {
static constexpr auto s_text = op::cmd_t::set;
constexpr explicit set_t_impl(PrevStatement prev_st, Values... values)
: prev_statement_t<PrevStatement>(prev_st),
values_(hana::make_tuple(values...)) {}
constexpr auto get_command() {
auto vals_str =
hana::transform(values_, [](auto val) { return val.get_str(); });
auto r_str_c = hana::fold_left(
vals_str, [](auto val1, auto val2) { return val1 + "," + val2; });
return std::string(" ") + s_text.c_str() + " " + r_str_c;
}
template <typename... Conditions>
auto where(Conditions... conditions) {
return where_t(*this, conditions...);
}
public:
hana::tuple<Values...> values_;
};
} // namespace detail
template <typename PrevStatement, typename... Values>
struct set_t : public detail::set_t_impl<PrevStatement, void, Values...> {
constexpr explicit set_t(PrevStatement prev_st, Values... values)
: detail::set_t_impl<PrevStatement, void, Values...>(prev_st, values...) {
}
};
} // namespace sql
} // namespace mix_cc