1717 * b) Logical Operators: -, NOT
1818 * f) Comparisons: affirmation, negation
1919 * a) Number of conditions: multiple
20- * b) Logical Operators: AND, OR, NOT
20+ * b) Logical Operators: AND, OR, NOT(AND), NOT(OR)
2121 * c) Number of relations: single
2222 * d) Columns: same
2323 * e) Operators: same
4040 * Every test contains at least one proof of concept using a manually crafted SQL query. (Not necessarily the same way
4141 * the ORM constructs it) Such must not fail. If they do, the dataset has changed. The ORM query must return the same
4242 * results.
43+ *
44+ * @todo NOT(OR) cases are missing
4345 */
4446class RelationFilterTest extends TestCase
4547{
@@ -128,7 +130,7 @@ public function testSingleNegativeCondition(Connection $db)
128130 /**
129131 * Search for offices where Donald doesn't work
130132 *
131- * @equivalenceClass a:single, b:NOT, f:affirmation
133+ * @equivalenceClass a:single, b:NOT(AND) , f:affirmation
132134 * @dataProvider databases
133135 *
134136 * @param Connection $db
@@ -173,7 +175,7 @@ public function testSingleAffirmativeConditionWithNotOperator(Connection $db)
173175 /**
174176 * Search for offices where Donald works
175177 *
176- * @equivalenceClass a:single, b:NOT, f:negation
178+ * @equivalenceClass a:single, b:NOT(AND) , f:negation
177179 * @dataProvider databases
178180 *
179181 * @param Connection $db
@@ -483,7 +485,7 @@ public function testAndChainTargetingASingleRelationColumnWithDifferentOperators
483485 /**
484486 * Search for offices where either Donald or Huey doesn't work
485487 *
486- * @equivalenceClass a:multiple, b:NOT, c:single, d:same, e:same, f:affirmation
488+ * @equivalenceClass a:multiple, b:NOT(AND) , c:single, d:same, e:same, f:affirmation
487489 * @dataProvider databases
488490 *
489491 * @param Connection $db
@@ -511,10 +513,10 @@ public function testNotChainTargetingASingleRelationColumnWithTheSameAffirmative
511513 $ offices = Office::on ($ db )
512514 ->columns (['office.city ' ])
513515 ->orderBy ('office.id ' )
514- ->filter (Filter::none (
516+ ->filter (Filter::none (Filter:: all (
515517 Filter::equal ('employee.name ' , 'Donald ' ),
516518 Filter::equal ('employee.name ' , 'Huey ' )
517- ));
519+ ))) ;
518520 $ results = iterator_to_array ($ offices );
519521 $ sql = $ this ->getSql ($ offices );
520522
@@ -528,8 +530,10 @@ public function testNotChainTargetingASingleRelationColumnWithTheSameAffirmative
528530 /**
529531 * Search for offices where Donald and Huey work
530532 *
531- * @equivalenceClass a:multiple, b:NOT, c:single, d:same, e:same, f:negation
533+ * @equivalenceClass a:multiple, b:NOT(AND) , c:single, d:same, e:same, f:negation
532534 * @dataProvider databases
535+ * @todo Finds the exact opposite of {@see testAndChainTargetingASingleRelationColumnWithTheSameNegativeOperator}.
536+ * No wonder, actually. But monitoring doesn't behave the same way :'(
533537 *
534538 * @param Connection $db
535539 */
@@ -558,10 +562,10 @@ public function testNotChainTargetingASingleRelationColumnWithTheSameNegativeOpe
558562 $ offices = Office::on ($ db )
559563 ->columns (['office.city ' ])
560564 ->orderBy ('office.id ' )
561- ->filter (Filter::none (
565+ ->filter (Filter::none (Filter:: all (
562566 Filter::unequal ('employee.name ' , 'Donald ' ),
563567 Filter::unequal ('employee.name ' , 'Huey ' )
564- ));
568+ ))) ;
565569 $ results = iterator_to_array ($ offices );
566570 $ sql = $ this ->getSql ($ offices );
567571
@@ -574,7 +578,7 @@ public function testNotChainTargetingASingleRelationColumnWithTheSameNegativeOpe
574578 /**
575579 * Search for offices where either Donald doesn't work or Huey does
576580 *
577- * @equivalenceClass a:multiple, b:NOT, c:single, d:same, e:different
581+ * @equivalenceClass a:multiple, b:NOT(AND) , c:single, d:same, e:different
578582 * @dataProvider databases
579583 *
580584 * @param Connection $db
@@ -604,10 +608,10 @@ public function testNotChainTargetingASingleRelationColumnWithDifferentOperators
604608 $ offices = Office::on ($ db )
605609 ->columns (['office.city ' ])
606610 ->orderBy ('office.id ' )
607- ->filter (Filter::none (
611+ ->filter (Filter::none (Filter:: all (
608612 Filter::equal ('employee.name ' , 'Donald ' ),
609613 Filter::unequal ('employee.name ' , 'Huey ' )
610- ));
614+ ))) ;
611615 $ results = iterator_to_array ($ offices );
612616 $ sql = $ this ->getSql ($ offices );
613617
@@ -786,8 +790,10 @@ public function testOrChainTargetingASingleRelationButDifferentColumnsWithTheSam
786790 /**
787791 * Search for offices where not just Huey works or only as a manager
788792 *
789- * @equivalenceClass a:multiple, b:NOT, c:single, d:different, e:different
793+ * @equivalenceClass a:multiple, b:NOT(AND) , c:single, d:different, e:different
790794 * @dataProvider databases
795+ * @todo Finds the exact opposite of {@see testAndChainTargetingASingleRelationButDifferentColumnsWithDifferentOperators}.
796+ * No wonder, actually. But monitoring doesn't behave the same way :'(
791797 *
792798 * @param Connection $db
793799 */
@@ -814,10 +820,10 @@ public function testNotChainTargetingASingleRelationButDifferentColumnsWithDiffe
814820 $ offices = Office::on ($ db )
815821 ->columns (['office.city ' ])
816822 ->orderBy ('office.id ' )
817- ->filter (Filter::none (
823+ ->filter (Filter::none (Filter:: all (
818824 Filter::equal ('employee.name ' , 'Huey ' ),
819825 Filter::unequal ('employee.role ' , 'Manager ' )
820- ));
826+ ))) ;
821827 $ results = iterator_to_array ($ offices );
822828 $ sql = $ this ->getSql ($ offices );
823829
@@ -832,8 +838,9 @@ public function testNotChainTargetingASingleRelationButDifferentColumnsWithDiffe
832838 /**
833839 * Search for offices where not just Donald works or not as manager
834840 *
835- * @equivalenceClass a:multiple, b:NOT, c:single, d:different, e:same
841+ * @equivalenceClass a:multiple, b:NOT(AND) , c:single, d:different, e:same
836842 * @dataProvider databases
843+ * @todo Finds Cuxhaven instead of Baghdad. Not wrong, actually. Why does monitoring behave differently?
837844 *
838845 * @param Connection $db
839846 */
@@ -861,10 +868,10 @@ public function testNotChainTargetingASingleRelationButDifferentColumnsWithTheSa
861868 $ offices = Office::on ($ db )
862869 ->columns (['office.city ' ])
863870 ->orderBy ('office.id ' )
864- ->filter (Filter::none (
871+ ->filter (Filter::none (Filter:: all (
865872 Filter::equal ('employee.name ' , 'Donald ' ),
866873 Filter::equal ('employee.role ' , 'Manager ' )
867- ));
874+ ))) ;
868875 $ results = iterator_to_array ($ offices );
869876 $ sql = $ this ->getSql ($ offices );
870877
@@ -1162,7 +1169,7 @@ public function testOrChainTargetingMultipleRelationsWithDifferentOperators(Conn
11621169 /**
11631170 * Search for offices where Donald doesn't work in the accounting department
11641171 *
1165- * @equivalenceClass a:multiple, b:NOT, c:multiple, e:same, f:affirmation
1172+ * @equivalenceClass a:multiple, b:NOT(AND) , c:multiple, e:same, f:affirmation
11661173 * @dataProvider databases
11671174 *
11681175 * @param Connection $db
@@ -1193,10 +1200,10 @@ public function testNotChainTargetingMultipleRelationsWithTheSameAffirmativeOper
11931200 $ offices = Office::on ($ db )
11941201 ->columns (['office.city ' ])
11951202 ->orderBy ('office.id ' )
1196- ->filter (Filter::none (
1203+ ->filter (Filter::none (Filter:: all (
11971204 Filter::equal ('employee.name ' , 'Donald ' ),
11981205 Filter::equal ('employee.department.name ' , 'Accounting ' )
1199- ));
1206+ ))) ;
12001207 $ results = iterator_to_array ($ offices );
12011208 $ sql = $ this ->getSql ($ offices );
12021209
@@ -1212,7 +1219,7 @@ public function testNotChainTargetingMultipleRelationsWithTheSameAffirmativeOper
12121219 *
12131220 * Or for your convenience: Where Donald works
12141221 *
1215- * @equivalenceClass a:multiple, b:NOT, c:multiple, e:same, f:negation
1222+ * @equivalenceClass a:multiple, b:NOT(AND) , c:multiple, e:same, f:negation
12161223 * @dataProvider databases
12171224 * @todo Just take a look at the POC and wonder how that would ever be automatically generated.
12181225 * Especially if you consider adding another comparison into the mix. This is way too
@@ -1250,10 +1257,10 @@ public function testNotChainTargetingMultipleRelationsWithTheSameNegativeOperato
12501257 $ offices = Office::on ($ db )
12511258 ->columns (['office.city ' ])
12521259 ->orderBy ('office.id ' )
1253- ->filter (Filter::none (
1260+ ->filter (Filter::none (Filter:: all (
12541261 Filter::unequal ('employee.name ' , 'Donald ' ),
12551262 Filter::unequal ('employee.department.name ' , 'Accounting ' )
1256- ));
1263+ ))) ;
12571264 $ results = iterator_to_array ($ offices );
12581265 $ sql = $ this ->getSql ($ offices );
12591266
@@ -1266,7 +1273,7 @@ public function testNotChainTargetingMultipleRelationsWithTheSameNegativeOperato
12661273 /**
12671274 * Search for offices where Donald doesn't work or in the accounting department
12681275 *
1269- * @equivalenceClass a:multiple, b:NOT, c:multiple, e:different
1276+ * @equivalenceClass a:multiple, b:NOT(AND) , c:multiple, e:different
12701277 * @dataProvider databases
12711278 *
12721279 * @param Connection $db
@@ -1298,10 +1305,10 @@ public function testNotChainTargetingMultipleRelationsWithDifferentOperators(Con
12981305 $ offices = Office::on ($ db )
12991306 ->columns (['office.city ' ])
13001307 ->orderBy ('office.id ' )
1301- ->filter (Filter::none (
1308+ ->filter (Filter::none (Filter:: all (
13021309 Filter::equal ('employee.name ' , 'Donald ' ),
13031310 Filter::unequal ('employee.department.name ' , 'Accounting ' )
1304- ));
1311+ ))) ;
13051312 $ results = iterator_to_array ($ offices );
13061313 $ sql = $ this ->getSql ($ offices );
13071314
0 commit comments