Skip to content

Commit 04d7d1e

Browse files
authored
Merge pull request #51 from ensi-platform/v7-cardinality
Cardinality Aggragations
2 parents 9936cc0 + ec828aa commit 04d7d1e

File tree

3 files changed

+55
-0
lines changed

3 files changed

+55
-0
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
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 CardinalityAggregation implements Aggregation
10+
{
11+
public function __construct(protected string $name, protected string $field)
12+
{
13+
Assert::stringNotEmpty(trim($name));
14+
Assert::stringNotEmpty(trim($field));
15+
}
16+
17+
public function name(): string
18+
{
19+
return $this->name;
20+
}
21+
22+
public function parseResults(array $response): array
23+
{
24+
return [$this->name => Result::parseValue($response[$this->name]) ?? 0];
25+
}
26+
27+
public function toDSL(): array
28+
{
29+
return [
30+
$this->name => [
31+
'cardinality' => [
32+
'field' => $this->field,
33+
],
34+
],
35+
];
36+
}
37+
}

src/Concerns/ConstructsAggregations.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use Ensi\LaravelElasticQuery\Aggregating\Bucket\NestedAggregation;
99
use Ensi\LaravelElasticQuery\Aggregating\Bucket\TermsAggregation;
1010
use Ensi\LaravelElasticQuery\Aggregating\CompositeAggregationBuilder;
11+
use Ensi\LaravelElasticQuery\Aggregating\Metrics\CardinalityAggregation;
1112
use Ensi\LaravelElasticQuery\Aggregating\Metrics\MinMaxAggregation;
1213
use Ensi\LaravelElasticQuery\Aggregating\Metrics\ValueCountAggregation;
1314
use Ensi\LaravelElasticQuery\Contracts\Aggregation;
@@ -56,6 +57,13 @@ public function count(string $name, string $field): static
5657
return $this;
5758
}
5859

60+
public function cardinality(string $name, string $field): static
61+
{
62+
$this->aggregations->add(new CardinalityAggregation($name, $this->absolutePath($field)));
63+
64+
return $this;
65+
}
66+
5967
public function nested(string $path, Closure $callback): static
6068
{
6169
$name = $this->aggregations->generateUniqueName($this->name());

tests/Functional/Aggregating/AggregationQueryTest.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,16 @@ public function testComposite(): void
6161
);
6262
}
6363

64+
public function testCardinality(): void
65+
{
66+
$this->testing->cardinality('cardinality', 'active');
67+
68+
$results = $this->testing->get();
69+
70+
// true and false
71+
$this->assertEquals(2, $results->get('cardinality'));
72+
}
73+
6474
public function testCountAll(): void
6575
{
6676
$this->testing->count('product_count', 'product_id');

0 commit comments

Comments
 (0)