From dd459eae3fae2b57be44e1176739db430f34c1cc Mon Sep 17 00:00:00 2001 From: Kapitanov Andrey Date: Fri, 9 Feb 2024 11:45:46 +0300 Subject: [PATCH] V7 Cardinality Aggregation --- .../Metrics/CardinalityAggregation.php | 37 +++++++++++++++++++ src/Concerns/ConstructsAggregations.php | 8 ++++ .../Aggregating/AggregationQueryTest.php | 10 +++++ 3 files changed, 55 insertions(+) create mode 100644 src/Aggregating/Metrics/CardinalityAggregation.php diff --git a/src/Aggregating/Metrics/CardinalityAggregation.php b/src/Aggregating/Metrics/CardinalityAggregation.php new file mode 100644 index 0000000..845695b --- /dev/null +++ b/src/Aggregating/Metrics/CardinalityAggregation.php @@ -0,0 +1,37 @@ +name; + } + + public function parseResults(array $response): array + { + return [$this->name => Result::parseValue($response[$this->name]) ?? 0]; + } + + public function toDSL(): array + { + return [ + $this->name => [ + 'cardinality' => [ + 'field' => $this->field, + ], + ], + ]; + } +} diff --git a/src/Concerns/ConstructsAggregations.php b/src/Concerns/ConstructsAggregations.php index 6636a9e..3265fd7 100644 --- a/src/Concerns/ConstructsAggregations.php +++ b/src/Concerns/ConstructsAggregations.php @@ -8,6 +8,7 @@ use Ensi\LaravelElasticQuery\Aggregating\Bucket\NestedAggregation; use Ensi\LaravelElasticQuery\Aggregating\Bucket\TermsAggregation; use Ensi\LaravelElasticQuery\Aggregating\CompositeAggregationBuilder; +use Ensi\LaravelElasticQuery\Aggregating\Metrics\CardinalityAggregation; use Ensi\LaravelElasticQuery\Aggregating\Metrics\MinMaxAggregation; use Ensi\LaravelElasticQuery\Aggregating\Metrics\ValueCountAggregation; use Ensi\LaravelElasticQuery\Contracts\Aggregation; @@ -56,6 +57,13 @@ public function count(string $name, string $field): static return $this; } + public function cardinality(string $name, string $field): static + { + $this->aggregations->add(new CardinalityAggregation($name, $this->absolutePath($field))); + + return $this; + } + public function nested(string $path, Closure $callback): static { $name = $this->aggregations->generateUniqueName($this->name()); diff --git a/tests/Functional/Aggregating/AggregationQueryTest.php b/tests/Functional/Aggregating/AggregationQueryTest.php index 4a3d904..2b10027 100644 --- a/tests/Functional/Aggregating/AggregationQueryTest.php +++ b/tests/Functional/Aggregating/AggregationQueryTest.php @@ -61,6 +61,16 @@ public function testComposite(): void ); } + public function testCardinality(): void + { + $this->testing->cardinality('cardinality', 'active'); + + $results = $this->testing->get(); + + // true and false + $this->assertEquals(2, $results->get('cardinality')); + } + public function testCountAll(): void { $this->testing->count('product_count', 'product_id');