Skip to content

Commit 973da6c

Browse files
authored
Merge pull request #98 from ensi-platform/idbpr-2512-v7
IDBPR-2512 Add min and max v7
2 parents da5f084 + fc9abf2 commit 973da6c

File tree

7 files changed

+126
-7
lines changed

7 files changed

+126
-7
lines changed

src/Aggregating/Bucket/FiltersAggregation.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,20 @@
22

33
namespace Ensi\LaravelElasticQuery\Aggregating\Bucket;
44

5+
use Ensi\LaravelElasticQuery\Aggregating\AggregationCollection;
56
use Ensi\LaravelElasticQuery\Aggregating\BucketCollection;
67
use Ensi\LaravelElasticQuery\Aggregating\FiltersCollection;
78
use Ensi\LaravelElasticQuery\Aggregating\Result;
89
use Ensi\LaravelElasticQuery\Contracts\Aggregation;
10+
use Illuminate\Support\Collection;
911
use Webmozart\Assert\Assert;
1012

1113
class FiltersAggregation implements Aggregation
1214
{
1315
public function __construct(
1416
private string $name,
1517
private FiltersCollection $filters,
16-
private ?Aggregation $composite = null,
18+
private Aggregation|AggregationCollection|null $composite = null,
1719
private ?string $otherBucketKey = null,
1820
) {
1921
Assert::stringNotEmpty(trim($name));
@@ -45,6 +47,7 @@ public function parseResults(array $response): array
4547
$buckets = array_map(
4648
function (mixed $key, array $bucket) {
4749
$values = $this->isComposite() ? $this->composite->parseResults($bucket) : [];
50+
$values = $values instanceof Collection ? $values->toArray() : $values;
4851

4952
return Result::parseBucketWithKey($key, $bucket, $values);
5053
},

src/Aggregating/Bucket/TermsAggregation.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@
22

33
namespace Ensi\LaravelElasticQuery\Aggregating\Bucket;
44

5+
use Ensi\LaravelElasticQuery\Aggregating\AggregationCollection;
56
use Ensi\LaravelElasticQuery\Aggregating\BucketCollection;
67
use Ensi\LaravelElasticQuery\Aggregating\Result;
78
use Ensi\LaravelElasticQuery\Contracts\Aggregation;
89
use Ensi\LaravelElasticQuery\Search\Sorting\Sort;
10+
use Ensi\LaravelElasticQuery\Search\Sorting\SortCollection;
11+
use Illuminate\Support\Collection;
912
use Webmozart\Assert\Assert;
1013

1114
class TermsAggregation implements Aggregation
@@ -14,8 +17,8 @@ public function __construct(
1417
private string $name,
1518
private string $field,
1619
private ?int $size = null,
17-
private ?Sort $sort = null,
18-
private ?Aggregation $composite = null,
20+
private Sort|SortCollection|null $sort = null,
21+
private Aggregation|AggregationCollection|null $composite = null,
1922
) {
2023
Assert::stringNotEmpty(trim($name));
2124
Assert::stringNotEmpty(trim($field));
@@ -57,6 +60,7 @@ public function parseResults(array $response): array
5760
$buckets = array_map(
5861
function (array $bucket) {
5962
$values = $this->isComposite() ? $this->composite->parseResults($bucket) : [];
63+
$values = $values instanceof Collection ? $values->toArray() : $values;
6064

6165
return Result::parseBucket($bucket, $values);
6266
},
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
namespace Ensi\LaravelElasticQuery\Aggregating\Metrics;
4+
5+
use Ensi\LaravelElasticQuery\Aggregating\Result;
6+
use Ensi\LaravelElasticQuery\Contracts\Aggregation;
7+
use Webmozart\Assert\Assert;
8+
9+
class MaxAggregation implements Aggregation
10+
{
11+
public function __construct(
12+
private readonly string $name,
13+
private readonly string $field,
14+
private readonly mixed $missing = null,
15+
) {
16+
Assert::stringNotEmpty(trim($name));
17+
Assert::stringNotEmpty(trim($field));
18+
}
19+
20+
public function name(): string
21+
{
22+
return $this->name;
23+
}
24+
25+
public function toDSL(): array
26+
{
27+
$body['field'] = $this->field;
28+
29+
if ($this->missing) {
30+
$body['missing'] = $this->missing;
31+
}
32+
33+
return [
34+
$this->name => ['max' => $body],
35+
];
36+
}
37+
38+
public function parseResults(array $response): array
39+
{
40+
return [$this->name => Result::parseValue($response[$this->name]) ?? 0];
41+
}
42+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
namespace Ensi\LaravelElasticQuery\Aggregating\Metrics;
4+
5+
use Ensi\LaravelElasticQuery\Aggregating\Result;
6+
use Ensi\LaravelElasticQuery\Contracts\Aggregation;
7+
use Webmozart\Assert\Assert;
8+
9+
class MinAggregation implements Aggregation
10+
{
11+
public function __construct(
12+
private readonly string $name,
13+
private readonly string $field,
14+
private readonly mixed $missing = null,
15+
) {
16+
Assert::stringNotEmpty(trim($name));
17+
Assert::stringNotEmpty(trim($field));
18+
}
19+
20+
public function name(): string
21+
{
22+
return $this->name;
23+
}
24+
25+
public function toDSL(): array
26+
{
27+
$body['field'] = $this->field;
28+
29+
if ($this->missing) {
30+
$body['missing'] = $this->missing;
31+
}
32+
33+
return [
34+
$this->name => ['min' => $body],
35+
];
36+
}
37+
38+
public function parseResults(array $response): array
39+
{
40+
return [$this->name => Result::parseValue($response[$this->name]) ?? 0];
41+
}
42+
}

src/Concerns/ConstructsAggregations.php

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,15 @@
1111
use Ensi\LaravelElasticQuery\Aggregating\CompositeAggregationBuilder;
1212
use Ensi\LaravelElasticQuery\Aggregating\FiltersCollection;
1313
use Ensi\LaravelElasticQuery\Aggregating\Metrics\CardinalityAggregation;
14+
use Ensi\LaravelElasticQuery\Aggregating\Metrics\MaxAggregation;
15+
use Ensi\LaravelElasticQuery\Aggregating\Metrics\MinAggregation;
1416
use Ensi\LaravelElasticQuery\Aggregating\Metrics\MinMaxAggregation;
1517
use Ensi\LaravelElasticQuery\Aggregating\Metrics\ValueCountAggregation;
1618
use Ensi\LaravelElasticQuery\Contracts\Aggregation;
1719
use Ensi\LaravelElasticQuery\Contracts\Criteria;
1820
use Ensi\LaravelElasticQuery\Filtering\BoolQueryBuilder;
1921
use Ensi\LaravelElasticQuery\Search\Sorting\Sort;
22+
use Ensi\LaravelElasticQuery\Search\Sorting\SortCollection;
2023

2124
trait ConstructsAggregations
2225
{
@@ -30,8 +33,8 @@ public function terms(
3033
string $name,
3134
string $field,
3235
?int $size = null,
33-
?Sort $sort = null,
34-
?Aggregation $composite = null,
36+
Sort|SortCollection|null $sort = null,
37+
Aggregation|AggregationCollection|null $composite = null,
3538
): static {
3639
$this->aggregations->add(new TermsAggregation($name, $this->absolutePath($field), $size, $sort, $composite));
3740

@@ -48,7 +51,7 @@ public function filter(string $name, Criteria $criteria, AggregationCollection $
4851
public function filters(
4952
string $name,
5053
FiltersCollection $filters,
51-
?Aggregation $composite = null,
54+
Aggregation|AggregationCollection|null $composite = null,
5255
?string $otherBucketKey = null,
5356
): static {
5457
$this->aggregations->add(new FiltersAggregation($name, $filters, $composite, $otherBucketKey));
@@ -63,6 +66,20 @@ public function minmax(string $name, string $field): static
6366
return $this;
6467
}
6568

69+
public function min(string $name, string $field, mixed $missing = null): static
70+
{
71+
$this->aggregations->add(new MinAggregation($name, $this->absolutePath($field), $missing));
72+
73+
return $this;
74+
}
75+
76+
public function max(string $name, string $field, mixed $missing = null): static
77+
{
78+
$this->aggregations->add(new MaxAggregation($name, $this->absolutePath($field), $missing));
79+
80+
return $this;
81+
}
82+
6683
public function count(string $name, string $field): static
6784
{
6885
$this->aggregations->add(new ValueCountAggregation($name, $this->absolutePath($field)));

src/Contracts/AggregationsBuilder.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ public function terms(string $name, string $field, ?int $size = null): static;
1010

1111
public function minmax(string $name, string $field): static;
1212

13+
public function min(string $name, string $field, mixed $missing = null): static;
14+
15+
public function max(string $name, string $field, mixed $missing = null): static;
16+
1317
public function count(string $path, string $field): static;
1418

1519
public function nested(string $path, Closure $callback): static;

tests/IntegrationTests/AggregationQueryIntegrationTest.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,11 @@
2828
->count('product_count', 'product_id')
2929
->nested(
3030
'offers',
31-
fn (AggregationsBuilder $builder) => $builder->where('seller_id', 10)->minmax('price', 'price')
31+
fn (AggregationsBuilder $builder) => $builder
32+
->where('seller_id', 10)
33+
->minmax('price', 'price')
34+
->min('min_price', 'price')
35+
->max('max_price', 'price')
3236
)
3337
->get();
3438

@@ -38,6 +42,9 @@
3842
);
3943

4044
assertEquals(new MinMax(168.0, 611.0), $results->get('price'));
45+
assertEquals(168.0, $results->get('min_price'));
46+
assertEquals(611.0, $results->get('max_price'));
47+
4148
assertEquals(2, $results->get('product_count'));
4249
});
4350

0 commit comments

Comments
 (0)