summary refs log tree commit diff stats
path: root/lib/filter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/filter.cpp')
-rw-r--r--lib/filter.cpp201
1 files changed, 166 insertions, 35 deletions
diff --git a/lib/filter.cpp b/lib/filter.cpp index ecff8ac..c201618 100644 --- a/lib/filter.cpp +++ b/lib/filter.cpp
@@ -5,7 +5,6 @@
5#include "word.h" 5#include "word.h"
6#include "frame.h" 6#include "frame.h"
7#include "part.h" 7#include "part.h"
8#include "lemma.h"
9#include "form.h" 8#include "form.h"
10#include "pronunciation.h" 9#include "pronunciation.h"
11 10
@@ -73,6 +72,14 @@ namespace verbly {
73 72
74 break; 73 break;
75 } 74 }
75
76 case comparison::field_equals:
77 case comparison::field_does_not_equal:
78 {
79 new(&singleton_.compareField) field(other.singleton_.compareField);
80
81 break;
82 }
76 } 83 }
77 84
78 break; 85 break;
@@ -112,6 +119,7 @@ namespace verbly {
112 std::string tempStringValue; 119 std::string tempStringValue;
113 int tempIntValue; 120 int tempIntValue;
114 bool tempBoolValue; 121 bool tempBoolValue;
122 field tempCompareField;
115 std::list<filter> tempChildren; 123 std::list<filter> tempChildren;
116 bool tempOrlogic; 124 bool tempOrlogic;
117 125
@@ -173,6 +181,14 @@ namespace verbly {
173 181
174 break; 182 break;
175 } 183 }
184
185 case comparison::field_equals:
186 case comparison::field_does_not_equal:
187 {
188 tempCompareField = std::move(first.singleton_.compareField);
189
190 break;
191 }
176 } 192 }
177 193
178 break; 194 break;
@@ -249,6 +265,14 @@ namespace verbly {
249 265
250 break; 266 break;
251 } 267 }
268
269 case comparison::field_equals:
270 case comparison::field_does_not_equal:
271 {
272 new(&first.singleton_.compareField) field(std::move(second.singleton_.compareField));
273
274 break;
275 }
252 } 276 }
253 277
254 break; 278 break;
@@ -325,6 +349,14 @@ namespace verbly {
325 349
326 break; 350 break;
327 } 351 }
352
353 case comparison::field_equals:
354 case comparison::field_does_not_equal:
355 {
356 new(&second.singleton_.compareField) field(std::move(tempCompareField));
357
358 break;
359 }
328 } 360 }
329 361
330 break; 362 break;
@@ -391,6 +423,14 @@ namespace verbly {
391 423
392 break; 424 break;
393 } 425 }
426
427 case comparison::field_equals:
428 case comparison::field_does_not_equal:
429 {
430 singleton_.compareField.~field();
431
432 break;
433 }
394 } 434 }
395 435
396 break; 436 break;
@@ -446,6 +486,8 @@ namespace verbly {
446 case comparison::does_not_match: 486 case comparison::does_not_match:
447 case comparison::hierarchally_matches: 487 case comparison::hierarchally_matches:
448 case comparison::does_not_hierarchally_match: 488 case comparison::does_not_hierarchally_match:
489 case comparison::field_equals:
490 case comparison::field_does_not_equal:
449 { 491 {
450 throw std::invalid_argument("Invalid comparison for integer field"); 492 throw std::invalid_argument("Invalid comparison for integer field");
451 } 493 }
@@ -490,6 +532,8 @@ namespace verbly {
490 case comparison::does_not_match: 532 case comparison::does_not_match:
491 case comparison::hierarchally_matches: 533 case comparison::hierarchally_matches:
492 case comparison::does_not_hierarchally_match: 534 case comparison::does_not_hierarchally_match:
535 case comparison::field_equals:
536 case comparison::field_does_not_equal:
493 { 537 {
494 throw std::invalid_argument("Invalid comparison for string field"); 538 throw std::invalid_argument("Invalid comparison for string field");
495 } 539 }
@@ -534,6 +578,8 @@ namespace verbly {
534 case comparison::does_not_match: 578 case comparison::does_not_match:
535 case comparison::hierarchally_matches: 579 case comparison::hierarchally_matches:
536 case comparison::does_not_hierarchally_match: 580 case comparison::does_not_hierarchally_match:
581 case comparison::field_equals:
582 case comparison::field_does_not_equal:
537 { 583 {
538 throw std::invalid_argument("Invalid comparison for boolean field"); 584 throw std::invalid_argument("Invalid comparison for boolean field");
539 } 585 }
@@ -576,6 +622,8 @@ namespace verbly {
576 case comparison::does_not_match: 622 case comparison::does_not_match:
577 case comparison::hierarchally_matches: 623 case comparison::hierarchally_matches:
578 case comparison::does_not_hierarchally_match: 624 case comparison::does_not_hierarchally_match:
625 case comparison::field_equals:
626 case comparison::field_does_not_equal:
579 { 627 {
580 throw std::invalid_argument("Incorrect constructor for given comparison"); 628 throw std::invalid_argument("Incorrect constructor for given comparison");
581 } 629 }
@@ -596,6 +644,7 @@ namespace verbly {
596 case field::type::join: 644 case field::type::join:
597 case field::type::join_where: 645 case field::type::join_where:
598 case field::type::join_through: 646 case field::type::join_through:
647 case field::type::join_through_where:
599 { 648 {
600 switch (filterType) 649 switch (filterType)
601 { 650 {
@@ -624,6 +673,8 @@ namespace verbly {
624 case comparison::is_not_null: 673 case comparison::is_not_null:
625 case comparison::hierarchally_matches: 674 case comparison::hierarchally_matches:
626 case comparison::does_not_hierarchally_match: 675 case comparison::does_not_hierarchally_match:
676 case comparison::field_equals:
677 case comparison::field_does_not_equal:
627 { 678 {
628 throw std::invalid_argument("Incorrect constructor for given comparison"); 679 throw std::invalid_argument("Incorrect constructor for given comparison");
629 } 680 }
@@ -661,6 +712,8 @@ namespace verbly {
661 case comparison::is_not_null: 712 case comparison::is_not_null:
662 case comparison::matches: 713 case comparison::matches:
663 case comparison::does_not_match: 714 case comparison::does_not_match:
715 case comparison::field_equals:
716 case comparison::field_does_not_equal:
664 { 717 {
665 throw std::invalid_argument("Incorrect constructor for given comparison"); 718 throw std::invalid_argument("Incorrect constructor for given comparison");
666 } 719 }
@@ -679,6 +732,57 @@ namespace verbly {
679 } 732 }
680 } 733 }
681 734
735 filter::filter(
736 field filterField,
737 comparison filterType,
738 field compareField) :
739 type_(type::singleton)
740 {
741 switch (filterType)
742 {
743 case comparison::field_equals:
744 case comparison::field_does_not_equal:
745 {
746 if (filterField.getType() != compareField.getType())
747 {
748 throw std::invalid_argument("Cannot compare two fields of different types");
749 }
750
751 if (filterField.isJoin())
752 {
753 throw std::domain_error("Cannot compare join fields");
754 }
755
756 new(&singleton_.filterField) field(std::move(filterField));
757 singleton_.filterType = filterType;
758 new(&singleton_.compareField) field(std::move(compareField));
759
760 break;
761 }
762
763 case comparison::int_equals:
764 case comparison::int_does_not_equal:
765 case comparison::int_is_at_least:
766 case comparison::int_is_greater_than:
767 case comparison::int_is_at_most:
768 case comparison::int_is_less_than:
769 case comparison::boolean_equals:
770 case comparison::string_equals:
771 case comparison::string_does_not_equal:
772 case comparison::string_is_like:
773 case comparison::string_is_not_like:
774 case comparison::is_null:
775 case comparison::is_not_null:
776 case comparison::matches:
777 case comparison::does_not_match:
778 case comparison::hierarchally_matches:
779 case comparison::does_not_hierarchally_match:
780 {
781 throw std::domain_error("Incorrect constructor for given comparison");
782 }
783 }
784 }
785
682 field filter::getField() const 786 field filter::getField() const
683 { 787 {
684 if (type_ == type::singleton) 788 if (type_ == type::singleton)
@@ -726,6 +830,8 @@ namespace verbly {
726 case comparison::boolean_equals: 830 case comparison::boolean_equals:
727 case comparison::is_null: 831 case comparison::is_null:
728 case comparison::is_not_null: 832 case comparison::is_not_null:
833 case comparison::field_equals:
834 case comparison::field_does_not_equal:
729 { 835 {
730 throw std::domain_error("This filter does not have a join condition"); 836 throw std::domain_error("This filter does not have a join condition");
731 } 837 }
@@ -762,6 +868,8 @@ namespace verbly {
762 case comparison::does_not_match: 868 case comparison::does_not_match:
763 case comparison::hierarchally_matches: 869 case comparison::hierarchally_matches:
764 case comparison::does_not_hierarchally_match: 870 case comparison::does_not_hierarchally_match:
871 case comparison::field_equals:
872 case comparison::field_does_not_equal:
765 { 873 {
766 throw std::domain_error("This filter does not have a string argument"); 874 throw std::domain_error("This filter does not have a string argument");
767 } 875 }
@@ -798,6 +906,8 @@ namespace verbly {
798 case comparison::does_not_match: 906 case comparison::does_not_match:
799 case comparison::hierarchally_matches: 907 case comparison::hierarchally_matches:
800 case comparison::does_not_hierarchally_match: 908 case comparison::does_not_hierarchally_match:
909 case comparison::field_equals:
910 case comparison::field_does_not_equal:
801 { 911 {
802 throw std::domain_error("This filter does not have an integer argument"); 912 throw std::domain_error("This filter does not have an integer argument");
803 } 913 }
@@ -817,6 +927,47 @@ namespace verbly {
817 } 927 }
818 } 928 }
819 929
930 field filter::getCompareField() const
931 {
932 if (type_ != type::singleton)
933 {
934 throw std::domain_error("This filter does not have a compare field");
935 }
936
937 switch (singleton_.filterType)
938 {
939 case comparison::field_equals:
940 case comparison::field_does_not_equal:
941 {
942 return singleton_.compareField;
943
944 break;
945 }
946
947 case comparison::int_equals:
948 case comparison::int_does_not_equal:
949 case comparison::int_is_at_least:
950 case comparison::int_is_greater_than:
951 case comparison::int_is_at_most:
952 case comparison::int_is_less_than:
953 case comparison::boolean_equals:
954 case comparison::string_equals:
955 case comparison::string_does_not_equal:
956 case comparison::string_is_like:
957 case comparison::string_is_not_like:
958 case comparison::is_null:
959 case comparison::is_not_null:
960 case comparison::matches:
961 case comparison::does_not_match:
962 case comparison::hierarchally_matches:
963 case comparison::does_not_hierarchally_match:
964 {
965 throw std::domain_error("This filter doesn't have a compare field");
966 }
967 }
968
969 }
970
820 filter::filter(bool orlogic) : type_(type::group) 971 filter::filter(bool orlogic) : type_(type::group)
821 { 972 {
822 new(&group_.children) std::list<filter>(); 973 new(&group_.children) std::list<filter>();
@@ -970,6 +1121,16 @@ namespace verbly {
970 { 1121 {
971 return filter(singleton_.filterField, comparison::hierarchally_matches, *singleton_.join); 1122 return filter(singleton_.filterField, comparison::hierarchally_matches, *singleton_.join);
972 } 1123 }
1124
1125 case comparison::field_equals:
1126 {
1127 return filter(singleton_.filterField, comparison::field_does_not_equal, singleton_.compareField);
1128 }
1129
1130 case comparison::field_does_not_equal:
1131 {
1132 return filter(singleton_.filterField, comparison::field_equals, singleton_.compareField);
1133 }
973 } 1134 }
974 } 1135 }
975 1136
@@ -1111,7 +1272,6 @@ namespace verbly {
1111 case object::word: 1272 case object::word:
1112 case object::frame: 1273 case object::frame:
1113 case object::part: 1274 case object::part:
1114 case object::lemma:
1115 case object::form: 1275 case object::form:
1116 case object::pronunciation: 1276 case object::pronunciation:
1117 { 1277 {
@@ -1141,11 +1301,10 @@ namespace verbly {
1141 return (verbly::word::frames %= *this); 1301 return (verbly::word::frames %= *this);
1142 } 1302 }
1143 1303
1144 case object::lemma:
1145 case object::form: 1304 case object::form:
1146 case object::pronunciation: 1305 case object::pronunciation:
1147 { 1306 {
1148 return (verbly::word::lemmas %= *this); 1307 return (verbly::word::forms(inflection::base) %= *this);
1149 } 1308 }
1150 } 1309 }
1151 1310
@@ -1161,7 +1320,6 @@ namespace verbly {
1161 1320
1162 case object::notion: 1321 case object::notion:
1163 case object::word: 1322 case object::word:
1164 case object::lemma:
1165 case object::form: 1323 case object::form:
1166 case object::pronunciation: 1324 case object::pronunciation:
1167 { 1325 {
@@ -1188,7 +1346,6 @@ namespace verbly {
1188 case object::notion: 1346 case object::notion:
1189 case object::word: 1347 case object::word:
1190 case object::frame: 1348 case object::frame:
1191 case object::lemma:
1192 case object::form: 1349 case object::form:
1193 case object::pronunciation: 1350 case object::pronunciation:
1194 { 1351 {
@@ -1197,32 +1354,6 @@ namespace verbly {
1197 } 1354 }
1198 } 1355 }
1199 1356
1200 case object::lemma:
1201 {
1202 switch (singleton_.filterField.getObject())
1203 {
1204 case object::notion:
1205 case object::word:
1206 case object::frame:
1207 case object::part:
1208 {
1209 return verbly::lemma::words %= *this;
1210 }
1211
1212 case object::undefined:
1213 case object::lemma:
1214 {
1215 return *this;
1216 }
1217
1218 case object::form:
1219 case object::pronunciation:
1220 {
1221 return (verbly::lemma::forms(inflection::base) %= *this);
1222 }
1223 }
1224 }
1225
1226 case object::form: 1357 case object::form:
1227 { 1358 {
1228 switch (singleton_.filterField.getObject()) 1359 switch (singleton_.filterField.getObject())
@@ -1231,9 +1362,8 @@ namespace verbly {
1231 case object::word: 1362 case object::word:
1232 case object::frame: 1363 case object::frame:
1233 case object::part: 1364 case object::part:
1234 case object::lemma:
1235 { 1365 {
1236 return verbly::form::lemmas %= *this; 1366 return verbly::form::words(inflection::base) %= *this;
1237 } 1367 }
1238 1368
1239 case object::undefined: 1369 case object::undefined:
@@ -1257,7 +1387,6 @@ namespace verbly {
1257 case object::word: 1387 case object::word:
1258 case object::frame: 1388 case object::frame:
1259 case object::part: 1389 case object::part:
1260 case object::lemma:
1261 case object::form: 1390 case object::form:
1262 { 1391 {
1263 return verbly::pronunciation::forms %= *this; 1392 return verbly::pronunciation::forms %= *this;
@@ -1354,6 +1483,8 @@ namespace verbly {
1354 case comparison::string_is_not_like: 1483 case comparison::string_is_not_like:
1355 case comparison::is_null: 1484 case comparison::is_null:
1356 case comparison::is_not_null: 1485 case comparison::is_not_null:
1486 case comparison::field_equals:
1487 case comparison::field_does_not_equal:
1357 { 1488 {
1358 result += std::move(normalized); 1489 result += std::move(normalized);
1359 1490