Issues (111)

src/AQL/HasQueryClauses.php (6 issues)

1
<?php
2
3
declare(strict_types=1);
4
5
namespace LaravelFreelancerNL\FluentAQL\AQL;
6
7
use LaravelFreelancerNL\FluentAQL\Clauses\AggregateClause;
8
use LaravelFreelancerNL\FluentAQL\Clauses\CollectClause;
9
use LaravelFreelancerNL\FluentAQL\Clauses\FilterClause;
10
use LaravelFreelancerNL\FluentAQL\Clauses\ForClause;
11
use LaravelFreelancerNL\FluentAQL\Clauses\IntoClause;
12
use LaravelFreelancerNL\FluentAQL\Clauses\KeepClause;
13
use LaravelFreelancerNL\FluentAQL\Clauses\LimitClause;
14
use LaravelFreelancerNL\FluentAQL\Clauses\OptionsClause;
15
use LaravelFreelancerNL\FluentAQL\Clauses\ReturnClause;
16
use LaravelFreelancerNL\FluentAQL\Clauses\SearchClause;
17
use LaravelFreelancerNL\FluentAQL\Clauses\SortClause;
18
use LaravelFreelancerNL\FluentAQL\Clauses\WindowClause;
19
use LaravelFreelancerNL\FluentAQL\Clauses\WithCountClause;
20
use LaravelFreelancerNL\FluentAQL\Expressions\Expression;
21
use LaravelFreelancerNL\FluentAQL\QueryBuilder;
22
23
/**
24
 * Trait hasQueryClauses
25
 * API calls to add clause commands to the builder.
26
 */
27
trait HasQueryClauses
28
{
29
    abstract public function addCommand($command);
30
31
    /**
32
     * Create a for clause.
33
     *
34
     * @link https://www.arangodb.com/docs/stable/aql/operations-for.html
35
     *
36
     * @param string|array<string|Expression>|Expression $variableName
37
     * @param string|array<mixed>|QueryBuilder|Expression|null $in
38
     */
39 31
    public function for(
40
        string|array|Expression $variableName,
41
        string|array|QueryBuilder|Expression $in = null
42
    ): self {
43 31
        if (!is_array($variableName)) {
0 ignored issues
show
The condition is_array($variableName) is always true.
Loading history...
44 28
            $variableName = [$variableName];
45
        }
46
47 31
        $this->addCommand(new ForClause($variableName, $in));
48
49 31
        return $this;
50
    }
51
52
    /**
53
     * Filter results from a for clause.
54
     *
55
     * @link https://www.arangodb.com/docs/stable/aql/operations-filter.html
56
     *
57
     * @param object|array<mixed>|string|int|float|bool|null $leftOperand
58
     * @param object|array<mixed>|string|int|float|bool|null $rightOperand
59
     */
60 14
    public function filter(
61
        object|array|string|int|float|bool|null $leftOperand,
62
        string $comparisonOperator = null,
63
        object|array|string|int|float|bool|null $rightOperand = null,
64
        string $logicalOperator = null
65
    ): self {
66 14
        $predicates = $leftOperand;
67 14
        if (! is_array($predicates)) {
0 ignored issues
show
The condition is_array($predicates) is always true.
Loading history...
68 10
            $predicates = [[$leftOperand, $comparisonOperator, $rightOperand, $logicalOperator]];
69
        }
70
71 14
        $this->addCommand(new FilterClause($predicates));
72
73 14
        return $this;
74
    }
75
76
    /**
77
     * Search a view.
78
     *
79
     * @link https://www.arangodb.com/docs/stable/aql/operations-search.html
80
     *
81
     * @param object|array<mixed>|string|int|float|bool|null $leftOperand
82
     * @param object|array<mixed>|string|int|float|bool|null $rightOperand
83
     */
84 1
    public function search(
85
        object|array|string|int|float|bool|null $leftOperand,
86
        string $comparisonOperator = null,
87
        object|array|string|int|float|bool|null $rightOperand = null,
88
        string $logicalOperator = null
89
    ): self {
90 1
        $predicates = $leftOperand;
91 1
        if (! is_array($predicates)) {
0 ignored issues
show
The condition is_array($predicates) is always true.
Loading history...
92 1
            $predicates = [$predicates];
93
        }
94 1
        if (is_string($comparisonOperator)) {
95 1
            $predicates = [[$leftOperand, $comparisonOperator, $rightOperand, $logicalOperator]];
96
        }
97
98 1
        $this->addCommand(new SearchClause($predicates));
99
100 1
        return $this;
101
    }
102
103
    /**
104
     * Collect clause.
105
     *
106
     * @link https://www.arangodb.com/docs/stable/aql/operations-collect.html
107
     *
108
     * @param array<array-key, array<array-key, string>>|string|null $variableName
0 ignored issues
show
Documentation Bug introduced by
The doc comment array<array-key, array<a...y, string>>|string|null at position 2 could not be parsed: Unknown type name 'array-key' at position 2 in array<array-key, array<array-key, string>>|string|null.
Loading history...
109
     */
110 2
    public function collect(
111
        string|array $variableName = null,
112
        string $expression = null
113
    ): self {
114 2
        $groups = [];
115 2
        if (is_string($variableName)) {
0 ignored issues
show
The condition is_string($variableName) is always false.
Loading history...
116 1
            $groups[0][0] = $variableName;
117 1
            $groups[0][1] = $expression;
118
        }
119 2
        if (is_array($variableName)) {
120 1
            $groups =  $variableName;
121
        }
122
123 2
        $this->addCommand(new CollectClause($groups));
124
125 2
        return $this;
126
    }
127
128
    /**
129
     * Group clause:
130
     * Creates the INTO clause of a collect clause.
131
     *
132
     * @link https://www.arangodb.com/docs/stable/aql/operations-collect.html#grouping-syntaxes
133
     */
134 1
    public function into(
135
        string|QueryBuilder|Expression $groupsVariable,
136
        mixed $projectionExpression = null
137
    ): self {
138 1
        $this->addCommand(new IntoClause($groupsVariable, $projectionExpression));
139
140 1
        return $this;
141
    }
142
143
    /**
144
     * Keep clause
145
     * Limits the attributes of the data that is grouped.
146
     *
147
     * @link https://www.arangodb.com/docs/stable/aql/operations-collect.html#discarding-obsolete-variables
148
     */
149 1
    public function keep(
150
        string|QueryBuilder|Expression $keepVariable
151
    ): self {
152 1
        $this->addCommand(new KeepClause($keepVariable));
153
154 1
        return $this;
155
    }
156
157
    /**
158
     * withCount clause
159
     * Count the collected and grouped data.
160
     * withCount can only be used after an into clause.
161
     *
162
     * @link https://www.arangodb.com/docs/stable/aql/operations-collect.html#group-length-calculation
163
     */
164 1
    public function withCount(
165
        string|QueryBuilder|Expression $countVariableName
166
    ): self {
167 1
        $this->addCommand(new WithCountClause($countVariableName));
168
169 1
        return $this;
170
    }
171
172
    /**
173
     * Aggregate clause
174
     * Creates the INTO clause of a collect clause.
175
     *
176
     * @link https://www.arangodb.com/docs/stable/aql/operations-collect.html#aggregation
177
     */
178 1
    public function aggregate(
179
        string|QueryBuilder|Expression $variableName,
180
        string|QueryBuilder|Expression $aggregateExpression
181
    ): self {
182 1
        $this->addCommand(new AggregateClause($variableName, $aggregateExpression));
183
184 1
        return $this;
185
    }
186
187
    /**
188
     * Sort documents to return.
189
     *
190
     * @link https://www.arangodb.com/docs/stable/aql/operations-sort.html
191
     *
192
     * @param mixed ...$references
193
     */
194 2
    public function sort(...$references): self
195
    {
196 2
        $this->addCommand(new SortClause($references));
197
198 2
        return $this;
199
    }
200
201
    /**
202
     * Limit results.
203
     *
204
     * @link https://www.arangodb.com/docs/stable/aql/operations-limit.html
205
     */
206 1
    public function limit(
207
        int|QueryBuilder|Expression $offsetOrCount,
208
        int|QueryBuilder|Expression $count = null
209
    ): self {
210 1
        $this->addCommand(new LimitClause($offsetOrCount, $count));
211
212 1
        return $this;
213
    }
214
215
    /**
216
     * Return data.
217
     *
218
     * @link https://www.arangodb.com/docs/stable/aql/operations-return.html
219
     *
220
     * @SuppressWarnings(PHPMD.BooleanArgumentFlag)
221
     */
222 13
    public function return(
223
        mixed $expression,
224
        bool $distinct = false
225
    ): self {
226 13
        $this->addCommand(new ReturnClause($expression, $distinct));
227
228 13
        return $this;
229
    }
230
231
    /**
232
     * @param array<mixed>|object $options
233
     */
234 1
    public function options(array|object $options): self
235
    {
236 1
        $this->addCommand(new OptionsClause($options));
237
238 1
        return $this;
239
    }
240
241
    /**
242
     * Aggregate adjacent documents or value ranges with a sliding window to calculate
243
     * running totals, rolling averages, and other statistical properties
244
     *
245
     * @link https://www.arangodb.com/docs/stable/aql/operations-window.html
246
     *
247
     * @param array<array-key, string>|object $offsets
0 ignored issues
show
Documentation Bug introduced by
The doc comment array<array-key, string>|object at position 2 could not be parsed: Unknown type name 'array-key' at position 2 in array<array-key, string>|object.
Loading history...
248
     */
249 4
    public function window(
250
        array|object $offsets,
251
        string|QueryBuilder|Expression $rangeValue = null
252
    ): self {
253 4
        $this->addCommand(new WindowClause($offsets, $rangeValue));
254
255 4
        return $this;
256
    }
257
}
258