ItemFilterResolver::queryResolver()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 1
eloc 1
c 1
b 0
f 1
nc 1
nop 1
dl 0
loc 3
rs 10
1
<?php declare(strict_types = 1);
2
3
namespace Apicart\FQL\Tests\Integration\Generator\SQL\Resolver;
4
5
use Apicart\FQL\Generator\SQL\Resolver\AbstractFilterResolver;
6
use Apicart\FQL\Token\Token\Range;
7
use DateTime;
8
9
final class ItemFilterResolver extends AbstractFilterResolver
10
{
11
12
    protected function getResolvers(): array
13
    {
14
        return [
15
            'q' => function (string $value): string {
16
                return $this->queryResolver($value);
17
            },
18
            'introducedAt' => function (Range $range): string {
19
                return $this->introducedAtResolver($range);
20
            },
21
            'type' => function (string $value): string {
22
                return $this->typeResolver($value);
23
            },
24
            'price' => function (Range $range): string {
25
                return $this->priceResolver($range);
26
            },
27
        ];
28
    }
29
30
31
    private function queryResolver(string $value): string
32
    {
33
        return "name ILIKE '%${value}%'";
34
    }
35
36
37
    private function introducedAtResolver(Range $range): string
38
    {
39
        $rangeFrom = new DateTime((string) $range->getStartValue());
40
        $rangeTo = new DateTime((string) $range->getEndValue());
41
42
        return sprintf(
43
            "introduced_at %s '%s' AND introduced_at %s '%s'",
44
            $range->getStartSign(),
45
            $rangeFrom->format(DateTime::ATOM),
46
            $range->getEndSign(),
47
            $rangeTo->format(DateTime::ATOM)
48
        );
49
    }
50
51
52
    private function typeResolver(string $value): string
53
    {
54
        return "type = '${value}'";
55
    }
56
57
58
    private function priceResolver(Range $range): string
59
    {
60
        $condition = '';
61
        if ($range->isStartDefined()) {
62
            $condition .= sprintf('price %s %s', $range->getStartSign(), $range->getStartValue());
63
        }
64
65
        if ($range->isEndDefined()) {
66
            if ($condition !== '') {
67
                $condition .= ' AND ';
68
            }
69
            $condition .= sprintf('price %s %s', $range->getEndSign(), $range->getEndValue());
70
        }
71
72
        return $condition;
73
    }
74
75
}
76