blitz_query_cpp
136 строк · 4.7 Кб
1#include "data/sql/sql_expr.hpp"
2#include <algorithm>
3#include <string_view>
4
5namespace blitz_query_cpp::sql
6{
7sql_expr_t &sql_expr_t::add_child(sql_expr_type t, std::string_view val)
8{
9return children.emplace_back(t, val);
10}
11
12sql_expr_t &create_or_get_child_with_type(sql_expr_t &node, sql_expr_type type, std::string_view val = {})
13{
14auto res = std::find_if(node.children.rbegin(), node.children.rend(), [type](auto &v)
15{ return v.type <= type; });
16
17if (res == node.children.rend() || res->type != type)
18{
19return *node.children.emplace(res.base(), type, val);
20}
21
22return *res;
23}
24
25sql_expr_t &create_child_with_type(sql_expr_t &node, sql_expr_type type, std::string_view val = {})
26{
27auto res = std::find_if(node.children.rbegin(), node.children.rend(), [type](auto &v)
28{ return v.type <= type; });
29
30return *node.children.emplace(res.base(), type, val);
31}
32
33sql_expr_t select(std::span<const std::string_view> columns)
34{
35sql_expr_t res{sql_expr_type::Select};
36auto &selection = res.add_child(sql_expr_type::SelectColumns);
37for (auto col : columns)
38{
39selection.add_child(sql_expr_type::Column, col);
40}
41return res;
42}
43
44sql_expr_t &operator|(sql_expr_t &expr, from_expr_t &&from_expr)
45{
46auto &res = create_or_get_child_with_type(expr, sql_expr_type::From);
47res.children.emplace_back(std::move(from_expr.expr));
48return expr;
49}
50
51sql_expr_t &operator|(sql_expr_t &expr, where_expr_t &&cond)
52{
53sql_expr_t &where_node = create_or_get_child_with_type(expr, sql_expr_type::Where);
54where_node.children.emplace_back(std::move(cond.expr));
55return expr;
56}
57
58sql_expr_t &operator|(sql_expr_t &expr, or_expr_t &&cond)
59{
60sql_expr_t &where_node = create_or_get_child_with_type(expr, sql_expr_type::Where);
61sql_expr_t *op_parent_node = &where_node;
62
63if (where_node.children.size() > 0)
64{
65sql_expr_t or_op{sql_expr_type::Or};
66if (where_node.children.size() > 1)
67{
68auto &and_node = or_op.add_child(sql_expr_type::And);
69and_node.children = std::move(where_node.children);
70}
71else
72{
73or_op.children = std::move(where_node.children);
74}
75op_parent_node = &where_node.children.emplace_back(std::move(or_op));
76}
77
78op_parent_node->children.emplace_back(std::move(cond.expr));
79return expr;
80}
81
82sql_expr_t binary_operation(binary_op op, sql_expr_t &&a, sql_expr_t &&b)
83{
84sql_expr_t res{get_expr_type(op)};
85res.children.emplace_back(std::move(a));
86res.children.emplace_back(std::move(b));
87return res;
88}
89
90sql_expr_t binary_operation(binary_op op, const sql_expr_t &a, const sql_expr_t &b)
91{
92sql_expr_t res{get_expr_type(op)};
93res.children.emplace_back(a);
94res.children.emplace_back(b);
95return res;
96}
97
98sql_expr_t &operator|(sql_expr_t &expr, order_by_t &¶m)
99{
100sql_expr_t &order_node = create_or_get_child_with_type(expr, sql_expr_type::Order);
101order_node.children.emplace_back(param.ascending ? sql_expr_type::Asc : sql_expr_type::Desc, "", std::move(param.column));
102return expr;
103}
104
105sql_expr_t &operator|(sql_expr_t &expr, limit_t param)
106{
107sql_expr_t &node = create_or_get_child_with_type(expr, sql_expr_type::Limit);
108node.value = std::to_string(param.value);
109return expr;
110}
111
112sql_expr_t &operator|(sql_expr_t &expr, offset_t param)
113{
114sql_expr_t &node = create_or_get_child_with_type(expr, sql_expr_type::Offset);
115node.value = std::to_string(param.value);
116return expr;
117}
118
119sql_expr_t &operator|(sql_expr_t &expr, join_t &¶m)
120{
121sql_expr_t &join_node = create_child_with_type(expr, get_expr_type(param.kind));
122join_node.children.emplace_back(std::move(param.expr));
123sql_expr_t &on_node = join_node.add_child(sql_expr_type::On);
124on_node.children.emplace_back(std::move(param.column1));
125on_node.children.emplace_back(std::move(param.column2));
126return expr;
127}
128
129sql_expr_t &operator|(sql_expr_t &expr, column_t &¶m)
130{
131auto &columns = create_or_get_child_with_type(expr, sql_expr_type::SelectColumns);
132columns.children.emplace_back(std::move(param.expr));
133return expr;
134}
135
136}