diff options
Diffstat (limited to 'lib/field.h')
-rw-r--r-- | lib/field.h | 61 |
1 files changed, 33 insertions, 28 deletions
diff --git a/lib/field.h b/lib/field.h index bec0618..f799900 100644 --- a/lib/field.h +++ b/lib/field.h | |||
@@ -19,6 +19,7 @@ namespace verbly { | |||
19 | join, | 19 | join, |
20 | join_where, | 20 | join_where, |
21 | join_through, | 21 | join_through, |
22 | join_through_where, | ||
22 | hierarchal_join | 23 | hierarchal_join |
23 | }; | 24 | }; |
24 | 25 | ||
@@ -100,11 +101,11 @@ namespace verbly { | |||
100 | object obj, | 101 | object obj, |
101 | const char* name, | 102 | const char* name, |
102 | object joinWith, | 103 | object joinWith, |
103 | const field& conditionField, | 104 | const char* conditionColumn, |
104 | int conditionValue, | 105 | int conditionValue, |
105 | bool nullable = false) | 106 | bool nullable = false) |
106 | { | 107 | { |
107 | return field(obj, type::join_where, name, nullable, 0, joinWith, 0, 0, 0, &conditionField, conditionValue); | 108 | return field(obj, type::join_where, name, nullable, 0, joinWith, 0, 0, 0, conditionColumn, conditionValue); |
108 | } | 109 | } |
109 | 110 | ||
110 | static field joinThrough( | 111 | static field joinThrough( |
@@ -129,6 +130,19 @@ namespace verbly { | |||
129 | return field(obj, type::join_through, name, true, joinTable, joinWith, foreignColumn, joinColumn, foreignJoinColumn); | 130 | return field(obj, type::join_through, name, true, joinTable, joinWith, foreignColumn, joinColumn, foreignJoinColumn); |
130 | } | 131 | } |
131 | 132 | ||
133 | static field joinThroughWhere( | ||
134 | object obj, | ||
135 | const char* name, | ||
136 | object joinWith, | ||
137 | const char* joinTable, | ||
138 | const char* foreignColumn, | ||
139 | const char* conditionColumn, | ||
140 | int conditionValue, | ||
141 | bool nullable = false) | ||
142 | { | ||
143 | return field(obj, type::join_through_where, name, nullable, joinTable, joinWith, foreignColumn, name, foreignColumn, conditionColumn, conditionValue); | ||
144 | } | ||
145 | |||
132 | static field selfJoin( | 146 | static field selfJoin( |
133 | object obj, | 147 | object obj, |
134 | const char* name, | 148 | const char* name, |
@@ -166,6 +180,7 @@ namespace verbly { | |||
166 | return ((type_ == type::join) | 180 | return ((type_ == type::join) |
167 | || (type_ == type::join_where) | 181 | || (type_ == type::join_where) |
168 | || (type_ == type::join_through) | 182 | || (type_ == type::join_through) |
183 | || (type_ == type::join_through_where) | ||
169 | || (type_ == type::hierarchal_join)); | 184 | || (type_ == type::hierarchal_join)); |
170 | } | 185 | } |
171 | 186 | ||
@@ -195,7 +210,7 @@ namespace verbly { | |||
195 | { | 210 | { |
196 | return (type_ == type::hierarchal_join) | 211 | return (type_ == type::hierarchal_join) |
197 | ? object_ | 212 | ? object_ |
198 | : ((type_ == type::join) || (type_ == type::join_where) || (type_ == type::join_through)) | 213 | : ((type_ == type::join) || (type_ == type::join_where) || (type_ == type::join_through) || (type_ == type::join_through_where)) |
199 | ? joinObject_ | 214 | ? joinObject_ |
200 | : throw std::domain_error("Non-join fields don't have join objects"); | 215 | : throw std::domain_error("Non-join fields don't have join objects"); |
201 | } | 216 | } |
@@ -205,40 +220,40 @@ namespace verbly { | |||
205 | const char* getForeignColumn() const | 220 | const char* getForeignColumn() const |
206 | { | 221 | { |
207 | // We ignore hierarchal joins because they are always self joins. | 222 | // We ignore hierarchal joins because they are always self joins. |
208 | return (type_ == type::join_through) | 223 | return ((type_ == type::join_through) || (type_ == type::join_through_where)) |
209 | ? foreignColumn_ | 224 | ? foreignColumn_ |
210 | : throw std::domain_error("Only many-to-many join fields have a foreign column"); | 225 | : throw std::domain_error("Only many-to-many join fields have a foreign column"); |
211 | } | 226 | } |
212 | 227 | ||
213 | const char* getJoinColumn() const | 228 | const char* getJoinColumn() const |
214 | { | 229 | { |
215 | return ((type_ == type::join_through) || (type_ == type::hierarchal_join)) | 230 | return ((type_ == type::join_through) || (type_ == type::join_through_where) || (type_ == type::hierarchal_join)) |
216 | ? joinColumn_ | 231 | ? joinColumn_ |
217 | : throw std::domain_error("Only many-to-many join fields have a join column"); | 232 | : throw std::domain_error("Only many-to-many join fields have a join column"); |
218 | } | 233 | } |
219 | 234 | ||
220 | const char* getForeignJoinColumn() const | 235 | const char* getForeignJoinColumn() const |
221 | { | 236 | { |
222 | return ((type_ == type::join_through) || (type_ == type::hierarchal_join)) | 237 | return ((type_ == type::join_through) || (type_ == type::join_through_where) || (type_ == type::hierarchal_join)) |
223 | ? foreignJoinColumn_ | 238 | ? foreignJoinColumn_ |
224 | : throw std::domain_error("Only many-to-many join fields have a foreign join column"); | 239 | : throw std::domain_error("Only many-to-many join fields have a foreign join column"); |
225 | } | 240 | } |
226 | 241 | ||
227 | // Condition joins | 242 | // Condition joins |
228 | 243 | ||
229 | const field& getConditionField() const | 244 | const char* getConditionColumn() const |
230 | { | 245 | { |
231 | if (type_ == type::join_where) | 246 | if ((type_ == type::join_where) || (type_ == type::join_through_where)) |
232 | { | 247 | { |
233 | return *conditionField_; | 248 | return conditionColumn_; |
234 | } else { | 249 | } else { |
235 | throw std::domain_error("Only condition join fields have a condition field"); | 250 | throw std::domain_error("Only condition join fields have a condition column"); |
236 | } | 251 | } |
237 | } | 252 | } |
238 | 253 | ||
239 | int getConditionValue() const | 254 | int getConditionValue() const |
240 | { | 255 | { |
241 | return (type_ == type::join_where) | 256 | return ((type_ == type::join_where) || (type_ == type::join_through_where)) |
242 | ? conditionValue_ | 257 | ? conditionValue_ |
243 | : throw std::domain_error("Only condition join fields have a condition value"); | 258 | : throw std::domain_error("Only condition join fields have a condition value"); |
244 | } | 259 | } |
@@ -254,13 +269,8 @@ namespace verbly { | |||
254 | // table (hypernymy); however, they have different join columns. For | 269 | // table (hypernymy); however, they have different join columns. For |
255 | // condition joins, the condition field and condition value are also | 270 | // condition joins, the condition field and condition value are also |
256 | // significant. | 271 | // significant. |
257 | if (conditionField_) | 272 | return std::tie(object_, column_, table_, joinColumn_, conditionColumn_, conditionValue_) |
258 | { | 273 | < std::tie(other.object_, other.column_, other.table_, other.joinColumn_, other.conditionColumn_, other.conditionValue_); |
259 | return std::tie(object_, column_, table_, joinColumn_, *conditionField_, conditionValue_) | ||
260 | < std::tie(other.object_, other.column_, other.table_, other.joinColumn_, *other.conditionField_, other.conditionValue_); | ||
261 | } else { | ||
262 | return std::tie(object_, column_, table_, joinColumn_) < std::tie(other.object_, other.column_, other.table_, other.joinColumn_); | ||
263 | } | ||
264 | } | 274 | } |
265 | 275 | ||
266 | // Equality | 276 | // Equality |
@@ -268,13 +278,8 @@ namespace verbly { | |||
268 | bool operator==(const field& other) const | 278 | bool operator==(const field& other) const |
269 | { | 279 | { |
270 | // See operator<() for documentation. | 280 | // See operator<() for documentation. |
271 | if (conditionField_) | 281 | return std::tie(object_, column_, table_, joinColumn_, conditionColumn_, conditionValue_) |
272 | { | 282 | == std::tie(other.object_, other.column_, other.table_, other.joinColumn_, other.conditionColumn_, other.conditionValue_); |
273 | return std::tie(object_, column_, table_, joinColumn_, *conditionField_, conditionValue_) | ||
274 | == std::tie(other.object_, other.column_, other.table_, other.joinColumn_, *other.conditionField_, other.conditionValue_); | ||
275 | } else { | ||
276 | return std::tie(object_, column_, table_, joinColumn_) == std::tie(other.object_, other.column_, other.table_, other.joinColumn_); | ||
277 | } | ||
278 | } | 283 | } |
279 | 284 | ||
280 | // Filter construction | 285 | // Filter construction |
@@ -325,7 +330,7 @@ namespace verbly { | |||
325 | const char* foreignColumn = 0, | 330 | const char* foreignColumn = 0, |
326 | const char* joinColumn = 0, | 331 | const char* joinColumn = 0, |
327 | const char* foreignJoinColumn = 0, | 332 | const char* foreignJoinColumn = 0, |
328 | const field* conditionField = 0, | 333 | const char* conditionColumn = 0, |
329 | int conditionValue = 0) : | 334 | int conditionValue = 0) : |
330 | object_(obj), | 335 | object_(obj), |
331 | type_(datatype), | 336 | type_(datatype), |
@@ -336,7 +341,7 @@ namespace verbly { | |||
336 | foreignColumn_(foreignColumn), | 341 | foreignColumn_(foreignColumn), |
337 | joinColumn_(joinColumn), | 342 | joinColumn_(joinColumn), |
338 | foreignJoinColumn_(foreignJoinColumn), | 343 | foreignJoinColumn_(foreignJoinColumn), |
339 | conditionField_(conditionField), | 344 | conditionColumn_(conditionColumn), |
340 | conditionValue_(conditionValue) | 345 | conditionValue_(conditionValue) |
341 | { | 346 | { |
342 | } | 347 | } |
@@ -359,7 +364,7 @@ namespace verbly { | |||
359 | const char* foreignJoinColumn_ = 0; | 364 | const char* foreignJoinColumn_ = 0; |
360 | 365 | ||
361 | // Condition joins | 366 | // Condition joins |
362 | const field* conditionField_ = 0; | 367 | const char* conditionColumn_ = 0; |
363 | int conditionValue_ = 0; | 368 | int conditionValue_ = 0; |
364 | 369 | ||
365 | }; | 370 | }; |