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 | }; |
