Skip to content

Commit f2bbeb3

Browse files
tobz-nzdriesvints
andauthored
[10.x] Add search engine meta data to results (#780)
* Add meilisearch meta data to results add result meta data to the return models with `withScoutMetadata` * Update src/Engines/MeilisearchEngine.php * add engine metadata to AlgoliaEngine * move adding model meta data to after filtering * Add assertions to test scoutMetadata value for both Aloglia and Meilisearch engines * Add metadata to lazyMap() for both engines as well * codestyle fixes --------- Co-authored-by: Dries Vints <[email protected]>
1 parent 03c94ec commit f2bbeb3

File tree

5 files changed

+69
-17
lines changed

5 files changed

+69
-17
lines changed

src/Engines/AlgoliaEngine.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,16 @@ public function map(Builder $builder, $results, $model)
210210
$builder, $objectIds
211211
)->filter(function ($model) use ($objectIds) {
212212
return in_array($model->getScoutKey(), $objectIds);
213+
})->map(function ($model) use ($results, $objectIdPositions) {
214+
$result = $results['hits'][$objectIdPositions[$model->getScoutKey()]] ?? [];
215+
216+
foreach ($result as $key => $value) {
217+
if (substr($key, 0, 1) === '_') {
218+
$model->withScoutMetadata($key, $value);
219+
}
220+
}
221+
222+
return $model;
213223
})->sortBy(function ($model) use ($objectIdPositions) {
214224
return $objectIdPositions[$model->getScoutKey()];
215225
})->values();
@@ -236,6 +246,16 @@ public function lazyMap(Builder $builder, $results, $model)
236246
$builder, $objectIds
237247
)->cursor()->filter(function ($model) use ($objectIds) {
238248
return in_array($model->getScoutKey(), $objectIds);
249+
})->map(function ($model) use ($results, $objectIdPositions) {
250+
$result = $results['hits'][$objectIdPositions[$model->getScoutKey()]] ?? [];
251+
252+
foreach ($result as $key => $value) {
253+
if (substr($key, 0, 1) === '_') {
254+
$model->withScoutMetadata($key, $value);
255+
}
256+
}
257+
258+
return $model;
239259
})->sortBy(function ($model) use ($objectIdPositions) {
240260
return $objectIdPositions[$model->getScoutKey()];
241261
})->values();

src/Engines/MeilisearchEngine.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,16 @@ public function map(Builder $builder, $results, $model)
293293
$builder, $objectIds
294294
)->filter(function ($model) use ($objectIds) {
295295
return in_array($model->getScoutKey(), $objectIds);
296+
})->map(function ($model) use ($results, $objectIdPositions) {
297+
$result = $results['hits'][$objectIdPositions[$model->getScoutKey()]] ?? [];
298+
299+
foreach ($result as $key => $value) {
300+
if (substr($key, 0, 1) === '_') {
301+
$model->withScoutMetadata($key, $value);
302+
}
303+
}
304+
305+
return $model;
296306
})->sortBy(function ($model) use ($objectIdPositions) {
297307
return $objectIdPositions[$model->getScoutKey()];
298308
})->values();
@@ -319,6 +329,16 @@ public function lazyMap(Builder $builder, $results, $model)
319329
$builder, $objectIds
320330
)->cursor()->filter(function ($model) use ($objectIds) {
321331
return in_array($model->getScoutKey(), $objectIds);
332+
})->map(function ($model) use ($results, $objectIdPositions) {
333+
$result = $results['hits'][$objectIdPositions[$model->getScoutKey()]] ?? [];
334+
335+
foreach ($result as $key => $value) {
336+
if (substr($key, 0, 1) === '_') {
337+
$model->withScoutMetadata($key, $value);
338+
}
339+
}
340+
341+
return $model;
322342
})->sortBy(function ($model) use ($objectIdPositions) {
323343
return $objectIdPositions[$model->getScoutKey()];
324344
})->values();

tests/Fixtures/SearchableModel.php

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,10 @@ class SearchableModel extends Model
1414
*
1515
* @var array
1616
*/
17-
protected $fillable = ['id'];
17+
protected $fillable = ['id', 'name'];
1818

1919
public function searchableAs()
2020
{
2121
return 'table';
2222
}
23-
24-
public function scoutMetadata()
25-
{
26-
return [];
27-
}
2823
}

tests/Unit/AlgoliaEngineTest.php

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -156,17 +156,23 @@ public function test_map_correctly_maps_results_to_models()
156156
$engine = new AlgoliaEngine($client);
157157

158158
$model = m::mock(stdClass::class);
159+
159160
$model->shouldReceive('getScoutModelsByIds')->andReturn($models = Collection::make([
160-
new SearchableModel(['id' => 1]),
161+
new SearchableModel(['id' => 1, 'name' => 'test']),
161162
]));
162163

163164
$builder = m::mock(Builder::class);
164165

165-
$results = $engine->map($builder, ['nbHits' => 1, 'hits' => [
166-
['objectID' => 1, 'id' => 1],
167-
]], $model);
166+
$results = $engine->map($builder, [
167+
'nbHits' => 1,
168+
'hits' => [
169+
['objectID' => 1, 'id' => 1, '_rankingInfo' => ['nbTypos' => 0]],
170+
],
171+
], $model);
168172

169173
$this->assertCount(1, $results);
174+
$this->assertEquals(['id' => 1, 'name' => 'test'], $results->first()->toArray());
175+
$this->assertEquals(['_rankingInfo' => ['nbTypos' => 0]], $results->first()->scoutMetaData());
170176
}
171177

172178
public function test_map_method_respects_order()
@@ -210,16 +216,18 @@ public function test_lazy_map_correctly_maps_results_to_models()
210216

211217
$model = m::mock(stdClass::class);
212218
$model->shouldReceive('queryScoutModelsByIds->cursor')->andReturn($models = LazyCollection::make([
213-
new SearchableModel(['id' => 1]),
219+
new SearchableModel(['id' => 1, 'name' => 'test']),
214220
]));
215221

216222
$builder = m::mock(Builder::class);
217223

218224
$results = $engine->lazyMap($builder, ['nbHits' => 1, 'hits' => [
219-
['objectID' => 1, 'id' => 1],
225+
['objectID' => 1, 'id' => 1, '_rankingInfo' => ['nbTypos' => 0]],
220226
]], $model);
221227

222228
$this->assertCount(1, $results);
229+
$this->assertEquals(['id' => 1, 'name' => 'test'], $results->first()->toArray());
230+
$this->assertEquals(['_rankingInfo' => ['nbTypos' => 0]], $results->first()->scoutMetaData());
223231
}
224232

225233
public function test_lazy_map_method_respects_order()

tests/Unit/MeilisearchEngineTest.php

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -286,17 +286,22 @@ public function test_map_correctly_maps_results_to_models()
286286

287287
$model = m::mock(stdClass::class);
288288
$model->shouldReceive(['getScoutKeyName' => 'id']);
289-
$model->shouldReceive('getScoutModelsByIds')->andReturn($models = Collection::make([new SearchableModel(['id' => 1])]));
289+
$model->shouldReceive('getScoutModelsByIds')->andReturn($models = Collection::make([
290+
new SearchableModel(['id' => 1, 'name' => 'test']),
291+
]));
292+
290293
$builder = m::mock(Builder::class);
291294

292295
$results = $engine->map($builder, [
293296
'totalHits' => 1,
294297
'hits' => [
295-
['id' => 1],
298+
['id' => 1, '_rankingScore' => 0.86],
296299
],
297300
], $model);
298301

299-
$this->assertEquals(1, count($results));
302+
$this->assertCount(1, $results);
303+
$this->assertEquals(['id' => 1, 'name' => 'test'], $results->first()->toArray());
304+
$this->assertEquals(['_rankingScore' => 0.86], $results->first()->scoutMetadata());
300305
}
301306

302307
public function test_map_method_respects_order()
@@ -341,17 +346,21 @@ public function test_lazy_map_correctly_maps_results_to_models()
341346

342347
$model = m::mock(stdClass::class);
343348
$model->shouldReceive(['getScoutKeyName' => 'id']);
344-
$model->shouldReceive('queryScoutModelsByIds->cursor')->andReturn($models = LazyCollection::make([new SearchableModel(['id' => 1])]));
349+
$model->shouldReceive('queryScoutModelsByIds->cursor')->andReturn($models = LazyCollection::make([
350+
new SearchableModel(['id' => 1, 'name' => 'test']),
351+
]));
345352
$builder = m::mock(Builder::class);
346353

347354
$results = $engine->lazyMap($builder, [
348355
'totalHits' => 1,
349356
'hits' => [
350-
['id' => 1],
357+
['id' => 1, '_rankingScore' => 0.86],
351358
],
352359
], $model);
353360

354361
$this->assertEquals(1, count($results));
362+
$this->assertEquals(['id' => 1, 'name' => 'test'], $results->first()->toArray());
363+
$this->assertEquals(['_rankingScore' => 0.86], $results->first()->scoutMetadata());
355364
}
356365

357366
public function test_lazy_map_method_respects_order()

0 commit comments

Comments
 (0)