Skip to content

Commit 1056aea

Browse files
committed
Added bulkDistinct() and relations for distinct()
1 parent a3afcaf commit 1056aea

4 files changed

Lines changed: 51 additions & 22 deletions

File tree

src/Eloquent/Builder.php

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -456,22 +456,26 @@ public function withTable($table)
456456
public function distinct(mixed $columns = [], bool $includeCount = false): ElasticCollection
457457
{
458458
$elasticQueryCollection = $this->query->distinct($columns, $includeCount);
459+
$builder = $this->applyScopes();
459460
$eloquentCollection = $this->model->hydrate(
460461
$elasticQueryCollection->all()
461462
);
463+
$modelsCollection = ElasticCollection::loadCollection($eloquentCollection)->loadMeta($elasticQueryCollection->getQueryMeta());
464+
$models = $modelsCollection->all();
465+
$models = $this->loadRelations($models, $builder);
462466

463-
return ElasticCollection::loadCollection($eloquentCollection)->loadMeta($elasticQueryCollection->getQueryMeta());
467+
return ElasticCollection::loadCollection($builder->getModel()->newCollection($models))->loadMeta($modelsCollection->getQueryMeta());
464468
}
465469

466-
// public function bulkDistinct(array $columns = [], bool $includeCount = false)
467-
// {
468-
// $elasticQueryCollection = $this->query->bulkDistinct($columns, $includeCount);
469-
// $eloquentCollection = $this->model->hydrate(
470-
// $elasticQueryCollection->all()
471-
// );
472-
//
473-
// return ElasticCollection::loadCollection($eloquentCollection)->loadMeta($elasticQueryCollection->getQueryMeta());
474-
// }
470+
public function bulkDistinct(array $columns = [], bool $includeCount = false): ElasticCollection
471+
{
472+
$elasticQueryCollection = $this->query->bulkDistinct($columns, $includeCount);
473+
$eloquentCollection = $this->model->hydrate(
474+
$elasticQueryCollection->all()
475+
);
476+
477+
return ElasticCollection::loadCollection($eloquentCollection)->loadMeta($elasticQueryCollection->getQueryMeta());
478+
}
475479

476480
public function min($column, array $options = [])
477481
{

src/Eloquent/Docs/ModelDocs.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,13 +203,15 @@
203203
* @method static bool chunkById($count, $callback, $column = '_id', $alias = null)
204204
* -----------------------------------
205205
* @method static ElasticCollection distinct($columns = [], $includeCount = false)
206+
* @method static ElasticCollection bulkDistinct($columns = [], $includeCount = false)
206207
*===========================================
207208
* Aggregators Methods
208209
*===========================================
209210
* @method static int|array sum($columns)
210211
* @method static int|array min($columns)
211212
* @method static int|array max($columns)
212213
* @method static int|array avg($columns)
214+
* @method static int|array average($columns)
213215
* @method static mixed agg(array $functions, $column)
214216
*-----------------------------------
215217
* @method static mixed boxplot($columns, $options = [])
@@ -219,7 +221,7 @@
219221
* @method static mixed medianAbsoluteDeviation($columns, $options = [])
220222
* @method static mixed percentiles($columns, $options = [])
221223
* @method static mixed stats($columns, $options = [])
222-
* @method static mixed stringStats( $columns, $options = [])
224+
* @method static mixed stringStats($columns, $options = [])
223225
*-----------------------------------
224226
* @method static array getAggregationResults()
225227
* @method static array getRawAggregationResults()

src/Query/Concerns/ProcessesDistinctAggregations.php

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,31 @@ trait ProcessesDistinctAggregations
88
{
99
public function processDistinctAggregations($index, $result, $columns, $withCount): Collection
1010
{
11-
if (! empty($result['hits']['hits']) && is_array($result['hits']['hits'])) {
12-
$last = collect($result['hits']['hits'])->last();
13-
if (! empty($last['sort'])) {
14-
$this->query->getMetaTransfer()->set('after_key', $last['sort']);
15-
}
16-
}
11+
$this->pullAfterKey($result);
1712
$keys = [];
1813
foreach ($columns as $column) {
1914
$keys[] = 'by_'.$column;
2015
}
16+
$aggregations = $this->parseDistinctBucket($columns, $keys, $result['aggregations'], 0, $withCount);
17+
$aggregations = collect($aggregations);
2118

22-
$aggregations = collect($this->parseDistinctBucket($columns, $keys, $result['aggregations'], 0, $withCount));
19+
return $aggregations->map(function ($aggregation) use ($index) {
20+
return $this->liftToMeta($aggregation, ['_index' => $index], ['doc_count']);
21+
});
22+
}
23+
24+
public function processBulkDistinctAggregations($index, $result, $columns, $withCount): Collection
25+
{
26+
$this->pullAfterKey($result);
27+
$aggregations = [];
28+
foreach ($columns as $column) {
29+
$keys = ['by_'.$column];
30+
$aggregations = [
31+
...$aggregations,
32+
...$this->parseDistinctBucket([$column], $keys, $result['aggregations'], 0, $withCount),
33+
];
34+
}
35+
$aggregations = collect($aggregations);
2336

2437
return $aggregations->map(function ($aggregation) use ($index) {
2538
return $this->liftToMeta($aggregation, ['_index' => $index], ['doc_count']);
@@ -54,4 +67,14 @@ protected function parseDistinctBucket($columns, $keys, $response, $index, $incl
5467

5568
return $data;
5669
}
70+
71+
protected function pullAfterKey($result)
72+
{
73+
if (! empty($result['hits']['hits']) && is_array($result['hits']['hits'])) {
74+
$last = collect($result['hits']['hits'])->last();
75+
if (! empty($last['sort'])) {
76+
$this->query->getMetaTransfer()->set('after_key', $last['sort']);
77+
}
78+
}
79+
}
5780
}

src/Query/Processor.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,10 +111,10 @@ public function processSelect(BaseBuilder|Builder $query, $results): array|Colle
111111
if ($this->query->bulkDistinct) {
112112
$query->getMetaTransfer()->set('query', 'bulkDistinct');
113113
$index = $query->inferIndex();
114-
// $documents = $this->processDistinctAggregations($index, $response, $query->columns, $query->distinctCount ?? false);
115-
// $query->getMetaTransfer()->set('total', $documents->count());
116-
//
117-
// return $documents->all();
114+
$documents = $this->processBulkDistinctAggregations($index, $response, $query->columns, $query->distinctCount ?? false);
115+
$query->getMetaTransfer()->set('total', $documents->count());
116+
117+
return $documents->all();
118118
}
119119

120120
$this->aggregations = $response['aggregations'] ?? [];

0 commit comments

Comments
 (0)