diff options
Diffstat (limited to 'lib/statement.h')
-rw-r--r-- | lib/statement.h | 96 |
1 files changed, 55 insertions, 41 deletions
diff --git a/lib/statement.h b/lib/statement.h index 2fadf05..6c2e42e 100644 --- a/lib/statement.h +++ b/lib/statement.h | |||
@@ -4,8 +4,8 @@ | |||
4 | #include <string> | 4 | #include <string> |
5 | #include <list> | 5 | #include <list> |
6 | #include <map> | 6 | #include <map> |
7 | #include <set> | 7 | #include <hkutil/database.h> |
8 | #include "binding.h" | 8 | #include <variant.hpp> |
9 | #include "enums.h" | 9 | #include "enums.h" |
10 | #include "field.h" | 10 | #include "field.h" |
11 | #include "filter.h" | 11 | #include "filter.h" |
@@ -15,14 +15,28 @@ namespace verbly { | |||
15 | class filter; | 15 | class filter; |
16 | class order; | 16 | class order; |
17 | 17 | ||
18 | using field_binding = | ||
19 | std::tuple<std::string, std::string>; | ||
20 | |||
21 | using binding = | ||
22 | mpark::variant< | ||
23 | mpark::monostate, | ||
24 | std::string, | ||
25 | int, | ||
26 | field_binding>; | ||
27 | |||
18 | class statement { | 28 | class statement { |
19 | public: | 29 | public: |
20 | 30 | ||
21 | statement(object context, filter queryFilter); | 31 | statement(object context, filter queryFilter); |
22 | 32 | ||
23 | std::string getQueryString(std::list<std::string> select, order sortOrder, int limit, bool debug = false) const; | 33 | std::string getQueryString( |
34 | std::list<std::string> select, | ||
35 | order sortOrder, | ||
36 | int limit, | ||
37 | bool debug = false) const; | ||
24 | 38 | ||
25 | std::list<binding> getBindings() const; | 39 | std::list<hatkirby::binding> getBindings() const; |
26 | 40 | ||
27 | private: | 41 | private: |
28 | 42 | ||
@@ -108,23 +122,6 @@ namespace verbly { | |||
108 | is_null | 122 | is_null |
109 | }; | 123 | }; |
110 | 124 | ||
111 | // Copy and move constructors | ||
112 | |||
113 | condition(const condition& other); | ||
114 | condition(condition&& other); | ||
115 | |||
116 | // Assignment | ||
117 | |||
118 | condition& operator=(condition other); | ||
119 | |||
120 | // Swap | ||
121 | |||
122 | friend void swap(condition& first, condition& second); | ||
123 | |||
124 | // Destructor | ||
125 | |||
126 | ~condition(); | ||
127 | |||
128 | // Accessors | 125 | // Accessors |
129 | 126 | ||
130 | type getType() const | 127 | type getType() const |
@@ -134,13 +131,21 @@ namespace verbly { | |||
134 | 131 | ||
135 | // Empty | 132 | // Empty |
136 | 133 | ||
137 | condition(); | 134 | condition() = default; |
138 | 135 | ||
139 | // Singleton | 136 | // Singleton |
140 | 137 | ||
141 | condition(std::string table, std::string column, bool isNull); | 138 | condition( |
139 | std::string table, | ||
140 | std::string column, | ||
141 | bool isNull); | ||
142 | 142 | ||
143 | condition(std::string table, std::string column, comparison comp, binding value, object parentObject = object::undefined); | 143 | condition( |
144 | std::string table, | ||
145 | std::string column, | ||
146 | comparison comp, | ||
147 | binding value, | ||
148 | object parentObject = object::undefined); | ||
144 | 149 | ||
145 | // Group | 150 | // Group |
146 | 151 | ||
@@ -156,30 +161,39 @@ namespace verbly { | |||
156 | 161 | ||
157 | std::string toSql(bool toplevel, bool debug = false) const; | 162 | std::string toSql(bool toplevel, bool debug = false) const; |
158 | 163 | ||
159 | std::list<binding> flattenBindings() const; | 164 | std::list<hatkirby::binding> flattenBindings() const; |
160 | 165 | ||
161 | condition flatten() const; | 166 | condition flatten() const; |
162 | 167 | ||
163 | condition resolveCompareFields(object context, std::string tableName) const; | 168 | condition resolveCompareFields( |
169 | object context, | ||
170 | std::string tableName) const; | ||
164 | 171 | ||
165 | private: | 172 | private: |
166 | union { | 173 | |
167 | struct { | 174 | struct singleton_type { |
168 | std::string table_; | 175 | std::string table; |
169 | std::string column_; | 176 | std::string column; |
170 | comparison comparison_; | 177 | comparison comparison; |
171 | binding value_; | 178 | binding value; |
172 | object parentObject_; | 179 | object parentObject; |
173 | } singleton_; | ||
174 | struct { | ||
175 | std::list<condition> children_; | ||
176 | bool orlogic_; | ||
177 | } group_; | ||
178 | }; | 180 | }; |
179 | type type_; | ||
180 | }; | ||
181 | 181 | ||
182 | friend void swap(condition& first, condition& second); | 182 | struct group_type { |
183 | std::list<condition> children; | ||
184 | bool orlogic; | ||
185 | }; | ||
186 | |||
187 | using variant_type = | ||
188 | mpark::variant< | ||
189 | mpark::monostate, | ||
190 | singleton_type, | ||
191 | group_type>; | ||
192 | |||
193 | variant_type variant_; | ||
194 | |||
195 | type type_ = type::empty; | ||
196 | }; | ||
183 | 197 | ||
184 | class with { | 198 | class with { |
185 | public: | 199 | public: |