summary refs log tree commit diff stats
path: root/lib/field.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/field.h')
-rw-r--r--lib/field.h61
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 };