22
33namespace ipl \Sql \Compat ;
44
5- use Icinga \Data \Filter \Filter ;
6- use Icinga \Data \Filter \FilterAnd ;
7- use Icinga \Data \Filter \FilterExpression ;
8- use Icinga \Data \Filter \FilterNot ;
9- use Icinga \Data \Filter \FilterOr ;
105use InvalidArgumentException ;
116use ipl \Sql \Expression ;
7+ use ipl \Sql \Filter \Exists ;
8+ use ipl \Sql \Filter \NotExists ;
129use ipl \Sql \Sql ;
10+ use ipl \Stdlib \Filter ;
1311
1412class FilterProcessor
1513{
16- public static function assembleFilter (Filter $ filter , $ level = 0 )
14+ public static function assembleFilter (Filter \ Rule $ filter , $ level = 0 )
1715 {
1816 $ condition = null ;
1917
20- if ($ filter-> isChain () ) {
21- if ($ filter instanceof FilterAnd ) {
18+ if ($ filter instanceof Filter \Chain ) {
19+ if ($ filter instanceof Filter \All ) {
2220 $ operator = Sql::ALL ;
23- } elseif ($ filter instanceof FilterOr ) {
21+ } elseif ($ filter instanceof Filter \Any ) {
2422 $ operator = Sql::ANY ;
25- } elseif ($ filter instanceof FilterNot ) {
23+ } elseif ($ filter instanceof Filter \None ) {
2624 $ operator = Sql::NOT_ALL ;
2725 }
2826
@@ -31,7 +29,7 @@ public static function assembleFilter(Filter $filter, $level = 0)
3129 }
3230
3331 if (! $ filter ->isEmpty ()) {
34- foreach ($ filter-> filters () as $ filterPart ) {
32+ foreach ($ filter as $ filterPart ) {
3533 $ part = static ::assembleFilter ($ filterPart , $ level + 1 );
3634 if ($ part ) {
3735 if ($ condition === null ) {
@@ -53,48 +51,60 @@ public static function assembleFilter(Filter $filter, $level = 0)
5351 // TODO(el): Explicitly return the empty string due to the FilterNot case?
5452 }
5553 } else {
56- /** @var FilterExpression $filter */
57- $ condition = [Sql::ALL ,
58- static ::assemblePredicate ($ filter ->getColumn (), $ filter ->getSign (), $ filter ->getExpression ())
59- ];
54+ /** @var Filter\Condition $filter */
55+ $ condition = [Sql::ALL , static ::assemblePredicate ($ filter )];
6056 }
6157
6258 return $ condition ;
6359 }
6460
65- public static function assemblePredicate ($ column , $ operator , $ expression )
61+ public static function assemblePredicate (Filter \ Condition $ filter )
6662 {
63+ $ column = $ filter ->getColumn ();
64+ $ expression = $ filter ->getValue ();
65+
6766 if (is_array ($ expression )) {
68- if ($ operator === '= ' ) {
69- return ["$ column IN (?) " => $ expression ];
70- } elseif ($ operator === '!= ' ) {
67+ if ($ filter instanceof Filter \UnEqual) {
7168 return ["( $ column NOT IN (?) OR $ column IS NULL) " => $ expression ];
69+ } elseif ($ filter instanceof Filter \Equal) {
70+ return ["$ column IN (?) " => $ expression ];
7271 }
7372
7473 throw new InvalidArgumentException (
7574 'Unable to render array expressions with operators other than equal or not equal '
7675 );
77- } elseif ($ operator === ' = ' && strpos ($ expression , '* ' ) !== false ) {
76+ } elseif ($ filter instanceof Filter \Equal && strpos ($ expression , '* ' ) !== false ) {
7877 if ($ expression === '* ' ) {
7978 // We'll ignore such filters as it prevents index usage and because "*" means anything. So whether we're
8079 // using a real column with a valid comparison here or just an expression which can only be evaluated to
8180 // true makes no difference, except for performance reasons
82- return [new Expression ('TRUE ' )];
83- }
84-
85- return ["$ column LIKE ? " => str_replace ('* ' , '% ' , $ expression )];
86- } elseif ($ operator === '!= ' && strpos ($ expression , '* ' ) !== false ) {
87- if ($ expression === '* ' ) {
88- // We'll ignore such filters as it prevents index usage and because "*" means nothing. So whether we're
89- // using a real column with a valid comparison here or just an expression which cannot be evaluated to
90- // true makes no difference, except for performance reasons
91- return [new Expression ('FALSE ' )];
81+ return [new Expression ($ filter instanceof Filter \Unequal ? 'FALSE ' : 'TRUE ' )];
82+ } elseif ($ filter instanceof Filter \Unequal) {
83+ return ["( $ column NOT LIKE ? OR $ column IS NULL) " => str_replace ('* ' , '% ' , $ expression )];
84+ } else {
85+ return ["$ column LIKE ? " => str_replace ('* ' , '% ' , $ expression )];
9286 }
93-
94- return ["( $ column NOT LIKE ? OR $ column IS NULL) " => str_replace ('* ' , '% ' , $ expression )];
95- } elseif ($ operator === '!= ' ) {
87+ } elseif ($ filter instanceof Filter \Unequal) {
9688 return ["( $ column != ? OR $ column IS NULL) " => $ expression ];
9789 } else {
90+ if ($ filter instanceof Filter \Equal) {
91+ $ operator = '= ' ;
92+ } elseif ($ filter instanceof Filter \GreaterThan) {
93+ $ operator = '> ' ;
94+ } elseif ($ filter instanceof Filter \GreaterThanOrEqual) {
95+ $ operator = '>= ' ;
96+ } elseif ($ filter instanceof Filter \LessThan) {
97+ $ operator = '< ' ;
98+ } elseif ($ filter instanceof Filter \LessThanOrEqual) {
99+ $ operator = '<= ' ;
100+ } elseif ($ filter instanceof Exists) {
101+ $ operator = 'EXISTS ' ;
102+ } elseif ($ filter instanceof NotExists) {
103+ $ operator = 'NOT EXISTS ' ;
104+ } else {
105+ throw new InvalidArgumentException (sprintf ('Cannot render filter: %s ' , get_class ($ filter )));
106+ }
107+
98108 return ["$ column $ operator ? " => $ expression ];
99109 }
100110 }
0 commit comments