From da88070b9b5d80e57e9ed57c3dc316c5732dccac Mon Sep 17 00:00:00 2001 From: Steve Bauman Date: Thu, 10 Jun 2021 10:42:14 -0400 Subject: [PATCH 1/5] Re-push remove from Scout queue fix https://github.com/laravel/scout/pull/479 --- src/Jobs/RemoveFromSearch.php | 23 ++++++++++-- src/Jobs/RemoveableScoutCollection.php | 25 +++++++++++++ .../Fixtures/SearchableModelWithCustomKey.php | 28 ++++++++++++++ tests/Unit/RemoveFromSearchTest.php | 37 ++++++++++++++++++- 4 files changed, 109 insertions(+), 4 deletions(-) create mode 100644 src/Jobs/RemoveableScoutCollection.php create mode 100644 tests/Fixtures/SearchableModelWithCustomKey.php diff --git a/src/Jobs/RemoveFromSearch.php b/src/Jobs/RemoveFromSearch.php index e53ae2fc..c162fce3 100644 --- a/src/Jobs/RemoveFromSearch.php +++ b/src/Jobs/RemoveFromSearch.php @@ -2,6 +2,7 @@ namespace Laravel\Scout\Jobs; +use Illuminate\Support\Str; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Database\Eloquent\Collection as EloquentCollection; @@ -14,7 +15,7 @@ class RemoveFromSearch implements ShouldQueue /** * The models to be removed from the search index. * - * @var \Illuminate\Database\Eloquent\Collection + * @var RemoveableScoutCollection */ public $models; @@ -26,7 +27,7 @@ class RemoveFromSearch implements ShouldQueue */ public function __construct($models) { - $this->models = $models; + $this->models = RemoveableScoutCollection::make($models); } /** @@ -56,9 +57,25 @@ protected function restoreCollection($value) return new EloquentCollection( collect($value->id)->map(function ($id) use ($value) { return tap(new $value->class, function ($model) use ($id) { - $model->forceFill([$model->getKeyName() => $id]); + $keyName = $this->getUnqualifiedScoutKeyName( + $model->getScoutKeyName() + ); + + $model->forceFill([$keyName => $id]); }); }) ); } + + /** + * Get the unqualified Scout key name. + * + * @param string $keyName + * + * @return string + */ + protected function getUnqualifiedScoutKeyName($keyName) + { + return Str::afterLast($keyName, '.'); + } } diff --git a/src/Jobs/RemoveableScoutCollection.php b/src/Jobs/RemoveableScoutCollection.php new file mode 100644 index 00000000..38a2816a --- /dev/null +++ b/src/Jobs/RemoveableScoutCollection.php @@ -0,0 +1,25 @@ +isEmpty()) { + return []; + } + + return in_array(Searchable::class, class_uses_recursive($this->first())) + ? $this->map->getScoutKey()->all() + : parent::getQueueableIds(); + } +} diff --git a/tests/Fixtures/SearchableModelWithCustomKey.php b/tests/Fixtures/SearchableModelWithCustomKey.php new file mode 100644 index 00000000..62d66716 --- /dev/null +++ b/tests/Fixtures/SearchableModelWithCustomKey.php @@ -0,0 +1,28 @@ +other_id; + } + + public function getScoutKeyName() + { + return $this->qualifyColumn('other_id'); + } +} diff --git a/tests/Unit/RemoveFromSearchTest.php b/tests/Unit/RemoveFromSearchTest.php index 428953b8..9d89febe 100644 --- a/tests/Unit/RemoveFromSearchTest.php +++ b/tests/Unit/RemoveFromSearchTest.php @@ -4,8 +4,10 @@ use Illuminate\Database\Eloquent\Collection; use Illuminate\Support\Facades\Config; +use Laravel\Scout\Jobs\RemoveableScoutCollection; use Laravel\Scout\Jobs\RemoveFromSearch; use Laravel\Scout\Tests\Fixtures\SearchableModel; +use Laravel\Scout\Tests\Fixtures\SearchableModelWithCustomKey; use Mockery as m; use PHPUnit\Framework\TestCase; @@ -34,7 +36,7 @@ public function test_handle_passes_the_collection_to_engine() public function test_models_are_deserialized_without_the_database() { - $job = new RemoveFromSearch($collection = Collection::make([ + $job = new RemoveFromSearch(Collection::make([ $model = new SearchableModel(['id' => 1234]), ])); @@ -46,4 +48,37 @@ public function test_models_are_deserialized_without_the_database() $this->assertTrue($model->is($job->models->first())); $this->assertEquals(1234, $job->models->first()->getScoutKey()); } + + public function test_models_are_deserialized_without_the_database_using_custom_scout_key() + { + $job = new RemoveFromSearch(Collection::make([ + $model = new SearchableModelWithCustomKey(['other_id' => 1234]), + ])); + + $job = unserialize(serialize($job)); + + $this->assertInstanceOf(Collection::class, $job->models); + $this->assertCount(1, $job->models); + $this->assertInstanceOf(SearchableModelWithCustomKey::class, $job->models->first()); + $this->assertTrue($model->is($job->models->first())); + $this->assertEquals(1234, $job->models->first()->getScoutKey()); + $this->assertEquals('searchable_model_with_custom_keys.other_id', $job->models->first()->getScoutKeyName()); + } + + public function test_removeable_scout_collection_returns_scout_keys() + { + $collection = RemoveableScoutCollection::make([ + new SearchableModelWithCustomKey(['other_id' => 1234]), + new SearchableModelWithCustomKey(['other_id' => 2345]), + new SearchableModel(['id' => 3456]), + new SearchableModel(['id' => 7891]), + ]); + + $this->assertEquals([ + 1234, + 2345, + 3456, + 7891, + ], $collection->getQueueableIds()); + } } From 04caf2e77ad777f7e059ee2729644d85060119ec Mon Sep 17 00:00:00 2001 From: Steve Bauman Date: Thu, 10 Jun 2021 11:09:42 -0400 Subject: [PATCH 2/5] Fix test --- tests/Unit/RemoveFromSearchTest.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/Unit/RemoveFromSearchTest.php b/tests/Unit/RemoveFromSearchTest.php index 9d89febe..43ba0e4d 100644 --- a/tests/Unit/RemoveFromSearchTest.php +++ b/tests/Unit/RemoveFromSearchTest.php @@ -25,11 +25,15 @@ protected function tearDown(): void public function test_handle_passes_the_collection_to_engine() { - $job = new RemoveFromSearch($collection = Collection::make([ + $job = new RemoveFromSearch(Collection::make([ $model = m::mock(), ])); - $model->shouldReceive('searchableUsing->delete')->with($collection); + $model->shouldReceive('searchableUsing->delete')->with( + m::on(function ($collection) use ($model) { + return $collection instanceof RemoveableScoutCollection && $collection->first() === $model; + }) + ); $job->handle(); } From 8ae149e62e9625e524d63e8129f171e39174a154 Mon Sep 17 00:00:00 2001 From: Steve Bauman Date: Thu, 10 Jun 2021 11:11:17 -0400 Subject: [PATCH 3/5] StyleCI fixes --- src/Jobs/RemoveFromSearch.php | 2 +- src/Jobs/RemoveableScoutCollection.php | 2 +- tests/Unit/RemoveFromSearchTest.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Jobs/RemoveFromSearch.php b/src/Jobs/RemoveFromSearch.php index c162fce3..564c15cf 100644 --- a/src/Jobs/RemoveFromSearch.php +++ b/src/Jobs/RemoveFromSearch.php @@ -2,11 +2,11 @@ namespace Laravel\Scout\Jobs; -use Illuminate\Support\Str; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Database\Eloquent\Collection as EloquentCollection; use Illuminate\Queue\SerializesModels; +use Illuminate\Support\Str; class RemoveFromSearch implements ShouldQueue { diff --git a/src/Jobs/RemoveableScoutCollection.php b/src/Jobs/RemoveableScoutCollection.php index 38a2816a..2939704e 100644 --- a/src/Jobs/RemoveableScoutCollection.php +++ b/src/Jobs/RemoveableScoutCollection.php @@ -2,8 +2,8 @@ namespace Laravel\Scout\Jobs; -use Laravel\Scout\Searchable; use Illuminate\Database\Eloquent\Collection; +use Laravel\Scout\Searchable; class RemoveableScoutCollection extends Collection { diff --git a/tests/Unit/RemoveFromSearchTest.php b/tests/Unit/RemoveFromSearchTest.php index 43ba0e4d..07cfa924 100644 --- a/tests/Unit/RemoveFromSearchTest.php +++ b/tests/Unit/RemoveFromSearchTest.php @@ -60,7 +60,7 @@ public function test_models_are_deserialized_without_the_database_using_custom_s ])); $job = unserialize(serialize($job)); - + $this->assertInstanceOf(Collection::class, $job->models); $this->assertCount(1, $job->models); $this->assertInstanceOf(SearchableModelWithCustomKey::class, $job->models->first()); From a94087ad8baac64209e6a55e538cb2938b3ecbc4 Mon Sep 17 00:00:00 2001 From: Steve Bauman Date: Thu, 10 Jun 2021 11:23:10 -0400 Subject: [PATCH 4/5] Update src/Jobs/RemoveFromSearch.php Co-authored-by: Dries Vints --- src/Jobs/RemoveFromSearch.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Jobs/RemoveFromSearch.php b/src/Jobs/RemoveFromSearch.php index 564c15cf..21954652 100644 --- a/src/Jobs/RemoveFromSearch.php +++ b/src/Jobs/RemoveFromSearch.php @@ -71,7 +71,6 @@ protected function restoreCollection($value) * Get the unqualified Scout key name. * * @param string $keyName - * * @return string */ protected function getUnqualifiedScoutKeyName($keyName) From 38ff2d32145735e715ee51c62cc66fe61a777882 Mon Sep 17 00:00:00 2001 From: Steve Bauman Date: Thu, 10 Jun 2021 11:23:45 -0400 Subject: [PATCH 5/5] Update RemoveFromSearch.php --- src/Jobs/RemoveFromSearch.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Jobs/RemoveFromSearch.php b/src/Jobs/RemoveFromSearch.php index 564c15cf..8d5101d3 100644 --- a/src/Jobs/RemoveFromSearch.php +++ b/src/Jobs/RemoveFromSearch.php @@ -15,7 +15,7 @@ class RemoveFromSearch implements ShouldQueue /** * The models to be removed from the search index. * - * @var RemoveableScoutCollection + * @var \Illuminate\Database\Eloquent\Collection */ public $models;