Skip to content

Commit d6ae9ce

Browse files
authored
Merge pull request #29 from Icinga/utilize-ipl-stdlib-filter
Utilize \ipl\Stdlib\Filter
2 parents 006f86a + 21b2fb7 commit d6ae9ce

3 files changed

Lines changed: 71 additions & 33 deletions

File tree

src/Compat/FilterProcessor.php

Lines changed: 43 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,25 @@
22

33
namespace 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;
105
use InvalidArgumentException;
116
use ipl\Sql\Expression;
7+
use ipl\Sql\Filter\Exists;
8+
use ipl\Sql\Filter\NotExists;
129
use ipl\Sql\Sql;
10+
use ipl\Stdlib\Filter;
1311

1412
class 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
}

src/Filter/Exists.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace ipl\Sql\Filter;
4+
5+
use ipl\Sql\Select;
6+
use ipl\Stdlib\Filter;
7+
8+
class Exists extends Filter\Condition
9+
{
10+
public function __construct(Select $select)
11+
{
12+
parent::__construct('', $select);
13+
}
14+
}

src/Filter/NotExists.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace ipl\Sql\Filter;
4+
5+
use ipl\Sql\Select;
6+
use ipl\Stdlib\Filter;
7+
8+
class NotExists extends Filter\Condition
9+
{
10+
public function __construct(Select $select)
11+
{
12+
parent::__construct('', $select);
13+
}
14+
}

0 commit comments

Comments
 (0)