|
7 | 7 |
|
8 | 8 | class SortClause extends Clause
|
9 | 9 | {
|
10 |
| - protected $attributes; |
| 10 | + /** |
| 11 | + * @var array $references |
| 12 | + */ |
| 13 | + protected $references; |
11 | 14 |
|
12 |
| - public function __construct($attributes) |
| 15 | + public function __construct($references) |
13 | 16 | {
|
14 | 17 | parent::__construct();
|
15 | 18 |
|
16 |
| - $this->attributes = $attributes; |
| 19 | + $this->references = $references; |
17 | 20 | }
|
18 | 21 |
|
19 | 22 | public function compile(QueryBuilder $queryBuilder): string
|
20 | 23 | {
|
21 |
| - //Structure input of reference + direction to the regular sort Expressions |
22 |
| - if ( |
23 |
| - count($this->attributes) == 2 |
24 |
| - && is_string($this->attributes[1]) |
25 |
| - && $queryBuilder->grammar->isSortDirection($this->attributes[1]) |
26 |
| - ) { |
27 |
| - $this->attributes = [[$this->attributes[0], $this->attributes[1]]]; |
| 24 | + if (empty($this->references[0])) { |
| 25 | + return 'SORT null'; |
28 | 26 | }
|
29 | 27 |
|
30 |
| - if (empty($this->attributes)) { |
31 |
| - $this->attributes = [null]; |
32 |
| - } |
33 |
| - |
34 |
| - $this->attributes = $this->normalizeSortExpressions($queryBuilder, $this->attributes); |
35 |
| - |
36 |
| - //Generate query output |
37 |
| - $sortExpressionOutput = array_map(function ($sortBy) use ($queryBuilder) { |
38 |
| - if ($sortBy instanceof ExpressionInterface) { |
39 |
| - return $sortBy->compile($queryBuilder); |
40 |
| - } |
41 |
| - |
42 |
| - $output = $sortBy[0]->compile($queryBuilder); |
43 |
| - if (isset($sortBy[1])) { |
44 |
| - $output .= ' ' . $sortBy[1]; |
| 28 | + $this->references = array_map(function ($reference) use ($queryBuilder) { |
| 29 | + if (!$queryBuilder->grammar->isSortDirection($reference)) { |
| 30 | + return $queryBuilder->normalizeArgument($reference, ['Reference', 'Null', 'Query', 'Bind']); |
45 | 31 | }
|
46 |
| - return $output; |
47 |
| - }, $this->attributes); |
| 32 | + return $reference; |
| 33 | + }, $this->references); |
48 | 34 |
|
49 |
| - return 'SORT ' . implode(', ', $sortExpressionOutput); |
50 |
| - } |
51 |
| - |
52 |
| - protected function normalizeSortExpressions(QueryBuilder $queryBuilder, array $attributes) |
53 |
| - { |
54 |
| - return array_map(function ($sortBy) use ($queryBuilder) { |
55 |
| - if (is_string($sortBy) || $sortBy === null) { |
56 |
| - return $queryBuilder->normalizeArgument($sortBy, ['Null', 'Reference', 'Function', 'Bind']); |
| 35 | + $output = ''; |
| 36 | + foreach ($this->references as $value) { |
| 37 | + if ($value instanceof ExpressionInterface) { |
| 38 | + $output .= ', ' . $value->compile($queryBuilder); |
57 | 39 | }
|
58 |
| - $sortBy[0] = $queryBuilder->normalizeArgument($sortBy[0], ['Null', 'Reference', 'Function', 'Bind']); |
59 |
| - if (isset($sortBy[1]) && ! $queryBuilder->grammar->isSortDirection($sortBy[1])) { |
60 |
| - unset($sortBy[1]); |
| 40 | + if (is_string($value)) { |
| 41 | + $output .= ' ' . $value; |
61 | 42 | }
|
62 |
| - return $sortBy; |
63 |
| - }, $this->attributes); |
| 43 | + } |
| 44 | + |
| 45 | + return 'SORT ' . ltrim($output, ', '); |
64 | 46 | }
|
65 | 47 | }
|
0 commit comments