From 8878eac0b664d589b023d8353a41c86e2eb64b35 Mon Sep 17 00:00:00 2001 From: wychoong <67364036+wychoong@users.noreply.github.com> Date: Mon, 20 Apr 2026 20:39:05 +0800 Subject: [PATCH 1/5] Optimize variants loading in ProductIndexer --- packages/core/src/Search/ProductIndexer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/Search/ProductIndexer.php b/packages/core/src/Search/ProductIndexer.php index 1ae577b5e3..73ab4aae8c 100644 --- a/packages/core/src/Search/ProductIndexer.php +++ b/packages/core/src/Search/ProductIndexer.php @@ -30,7 +30,7 @@ public function makeAllSearchableUsing(Builder $query): Builder { return $query->with([ 'thumbnail', - 'variants', + 'variants' => fn ($query) => $query->select('id', 'sku', 'product_id'), 'productType', 'brand', ]); From cd9b410332b5cbf38a452c5eb19e39b6f22bb167 Mon Sep 17 00:00:00 2001 From: wychoong <67364036+wychoong@users.noreply.github.com> Date: Tue, 19 May 2026 12:02:53 +0800 Subject: [PATCH 2/5] scope more fields in Customer, Order, Product indexer --- packages/core/src/Search/CustomerIndexer.php | 2 +- packages/core/src/Search/OrderIndexer.php | 29 ++++++++++++++++---- packages/core/src/Search/ProductIndexer.php | 4 +-- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/packages/core/src/Search/CustomerIndexer.php b/packages/core/src/Search/CustomerIndexer.php index 17ccfaf1a6..f7750a890b 100644 --- a/packages/core/src/Search/CustomerIndexer.php +++ b/packages/core/src/Search/CustomerIndexer.php @@ -29,7 +29,7 @@ public function getFilterableFields(): array public function makeAllSearchableUsing(Builder $query): Builder { return $query->with([ - 'users', + 'users' => fn ($query) => $query->select('id', 'email'), ]); } diff --git a/packages/core/src/Search/OrderIndexer.php b/packages/core/src/Search/OrderIndexer.php index 6bd113161d..76c42444df 100644 --- a/packages/core/src/Search/OrderIndexer.php +++ b/packages/core/src/Search/OrderIndexer.php @@ -35,11 +35,30 @@ public function getFilterableFields(): array public function makeAllSearchableUsing(Builder $query): Builder { return $query->with([ - 'channel', - 'transactions', - 'productLines', - 'addresses', - 'tags', + 'channel' => fn ($query) => $query->select('id', 'name'), + 'transactions' => fn ($query) => $query->select('id', 'order_id', 'reference'), + 'productLines' => fn ($query) => $query->select('id', 'order_id', 'description', 'identifier'), + 'addresses' => fn ($query) => $query->select( + 'id', + 'order_id', + 'country_id', + 'type', + 'first_name', + 'last_name', + 'company_name', + 'tax_identifier', + 'line_one', + 'line_two', + 'line_three', + 'city', + 'state', + 'postcode', + 'contact_email', + 'contact_phone', + )->with([ + 'country' => fn ($query) => $query->select('id', 'name'), + ]), + 'tags' => fn ($query) => $query->select('id', 'value'), ]); } diff --git a/packages/core/src/Search/ProductIndexer.php b/packages/core/src/Search/ProductIndexer.php index 73ab4aae8c..35fc8140c7 100644 --- a/packages/core/src/Search/ProductIndexer.php +++ b/packages/core/src/Search/ProductIndexer.php @@ -31,8 +31,8 @@ public function makeAllSearchableUsing(Builder $query): Builder return $query->with([ 'thumbnail', 'variants' => fn ($query) => $query->select('id', 'sku', 'product_id'), - 'productType', - 'brand', + 'productType' => fn ($query) => $query->select('id', 'name'), + 'brand' => fn ($query) => $query->select('id', 'name'), ]); } From b9c8ec865d19fd99271ccefa85cf01c111926a15 Mon Sep 17 00:00:00 2001 From: wychoong <67364036+wychoong@users.noreply.github.com> Date: Tue, 19 May 2026 12:33:26 +0800 Subject: [PATCH 3/5] tighten tests --- packages/core/src/Search/CustomerIndexer.php | 5 ++- packages/core/src/Search/OrderIndexer.php | 5 ++- tests/core/Unit/Search/OrderIndexerTest.php | 45 +++++++++++++++++++ tests/core/Unit/Search/ProductIndexerTest.php | 1 + 4 files changed, 54 insertions(+), 2 deletions(-) diff --git a/packages/core/src/Search/CustomerIndexer.php b/packages/core/src/Search/CustomerIndexer.php index f7750a890b..52ce758c91 100644 --- a/packages/core/src/Search/CustomerIndexer.php +++ b/packages/core/src/Search/CustomerIndexer.php @@ -29,7 +29,10 @@ public function getFilterableFields(): array public function makeAllSearchableUsing(Builder $query): Builder { return $query->with([ - 'users' => fn ($query) => $query->select('id', 'email'), + 'users' => fn ($query) => $query->select( + $query->getModel()->qualifyColumn('id'), + $query->getModel()->qualifyColumn('email'), + ), ]); } diff --git a/packages/core/src/Search/OrderIndexer.php b/packages/core/src/Search/OrderIndexer.php index 76c42444df..8885d26452 100644 --- a/packages/core/src/Search/OrderIndexer.php +++ b/packages/core/src/Search/OrderIndexer.php @@ -58,7 +58,10 @@ public function makeAllSearchableUsing(Builder $query): Builder )->with([ 'country' => fn ($query) => $query->select('id', 'name'), ]), - 'tags' => fn ($query) => $query->select('id', 'value'), + 'tags' => fn ($query) => $query->select( + $query->getModel()->qualifyColumn('id'), + $query->getModel()->qualifyColumn('value'), + ), ]); } diff --git a/tests/core/Unit/Search/OrderIndexerTest.php b/tests/core/Unit/Search/OrderIndexerTest.php index 4e748cb365..500aa652ec 100644 --- a/tests/core/Unit/Search/OrderIndexerTest.php +++ b/tests/core/Unit/Search/OrderIndexerTest.php @@ -1,8 +1,13 @@ true, ]); + $country = Country::factory()->create([ + 'name' => 'United Kingdom', + ]); + $order = Order::factory()->create([ 'user_id' => null, 'placed_at' => now(), @@ -24,9 +33,45 @@ ], ]); + $transaction = Transaction::factory()->create([ + 'order_id' => $order->id, + ]); + + $line = OrderLine::factory()->create([ + 'order_id' => $order->id, + 'type' => 'physical', + ]); + + OrderLine::factory()->create([ + 'order_id' => $order->id, + 'type' => 'shipping', + ]); + + $address = OrderAddress::factory()->create([ + 'order_id' => $order->id, + 'country_id' => $country->id, + 'type' => 'shipping', + ]); + + $tag = Tag::factory()->create([ + 'value' => 'vip', + ]); + + $order->tags()->attach($tag); + $data = app(OrderIndexer::class)->toSearchableArray($order); expect($data['currency_code'])->toEqual('GBP'); expect($data['channel'])->toEqual($order->channel->name); expect($data['total'])->toEqual($order->total->value); + expect($data['charges']->pluck('reference')->all())->toBe([$transaction->reference]); + expect($data['lines'])->toEqual([[ + 'description' => $line->description, + 'identifier' => $line->identifier, + ]]); + expect($data['shipping_first_name'])->toEqual($address->first_name); + expect($data['shipping_last_name'])->toEqual($address->last_name); + expect($data['shipping_country'])->toEqual($country->name); + expect($data['shipping_fullname'])->toEqual($address->first_name.' '.$address->last_name); + expect($data['tags'])->toBe(['vip']); }); diff --git a/tests/core/Unit/Search/ProductIndexerTest.php b/tests/core/Unit/Search/ProductIndexerTest.php index 38251dca3d..10d91cd8f9 100644 --- a/tests/core/Unit/Search/ProductIndexerTest.php +++ b/tests/core/Unit/Search/ProductIndexerTest.php @@ -60,6 +60,7 @@ ]); $data = app(ProductIndexer::class)->toSearchableArray($product); + expect($data)->toHaveKey('id'); expect($data['skus'])->toBe([$variant->sku]); expect($data['status'])->toEqual($product->status); From 75148a653bfdc652180954c547d773c6018b5fd6 Mon Sep 17 00:00:00 2001 From: wychoong <67364036+wychoong@users.noreply.github.com> Date: Tue, 19 May 2026 12:38:17 +0800 Subject: [PATCH 4/5] improve product option indexer --- packages/core/src/Search/ProductOptionIndexer.php | 4 +++- tests/core/Unit/Search/ProductOptionIndexerTest.php | 11 ++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/core/src/Search/ProductOptionIndexer.php b/packages/core/src/Search/ProductOptionIndexer.php index 14ee25e874..05959bea28 100644 --- a/packages/core/src/Search/ProductOptionIndexer.php +++ b/packages/core/src/Search/ProductOptionIndexer.php @@ -24,7 +24,9 @@ public function getFilterableFields(): array public function makeAllSearchableUsing(Builder $query): Builder { - return $query; + return $query->with([ + 'values' => fn ($query) => $query->select('id', 'product_option_id', 'name'), + ]); } public function toSearchableArray(Model $model): array diff --git a/tests/core/Unit/Search/ProductOptionIndexerTest.php b/tests/core/Unit/Search/ProductOptionIndexerTest.php index 785c687279..9aa0efcae9 100644 --- a/tests/core/Unit/Search/ProductOptionIndexerTest.php +++ b/tests/core/Unit/Search/ProductOptionIndexerTest.php @@ -2,6 +2,7 @@ use Illuminate\Foundation\Testing\RefreshDatabase; use Lunar\Models\ProductOption; +use Lunar\Models\ProductOptionValue; use Lunar\Search\ProductOptionIndexer; use Lunar\Tests\Core\TestCase; @@ -12,8 +13,16 @@ test('can return correct searchable data', function () { $productOption = ProductOption::factory()->create(); + $value = ProductOptionValue::factory()->create([ + 'product_option_id' => $productOption->id, + 'name' => [ + 'en' => 'Small', + ], + ]); + $data = app(ProductOptionIndexer::class)->toSearchableArray($productOption); expect($data['name_en'])->toEqual($productOption->name->en) - ->and($data['label_en'])->toEqual($productOption->label->en); + ->and($data['label_en'])->toEqual($productOption->label->en) + ->and($data['option_'.$value->id.'_en'])->toEqual('Small'); }); From 30380df66354bcdeecc190bbba664b03fae32763 Mon Sep 17 00:00:00 2001 From: wychoong <67364036+wychoong@users.noreply.github.com> Date: Tue, 19 May 2026 12:43:09 +0800 Subject: [PATCH 5/5] cleanup --- tests/core/Unit/Search/BrandIndexerTest.php | 5 ++--- tests/core/Unit/Search/CustomerIndexerTest.php | 2 +- tests/core/Unit/Search/OrderIndexerTest.php | 2 +- tests/core/Unit/Search/ProductIndexerTest.php | 2 +- tests/core/Unit/Search/ProductOptionIndexerTest.php | 2 +- tests/core/Unit/Search/ScoutIndexerTest.php | 2 +- 6 files changed, 7 insertions(+), 8 deletions(-) diff --git a/tests/core/Unit/Search/BrandIndexerTest.php b/tests/core/Unit/Search/BrandIndexerTest.php index 7f9dfbd7e5..46163068db 100644 --- a/tests/core/Unit/Search/BrandIndexerTest.php +++ b/tests/core/Unit/Search/BrandIndexerTest.php @@ -9,7 +9,7 @@ use Lunar\Search\BrandIndexer; use Lunar\Tests\Core\TestCase; -uses(TestCase::class); +uses(TestCase::class)->group('search', 'indexer'); uses(RefreshDatabase::class); @@ -64,5 +64,4 @@ ->and($data)->not()->toHaveKey($attributeC->handle) ->and($data)->toHaveKey($attributeD->handle.'_en') ->and($data)->toHaveKey($attributeD->handle.'_dk'); - -})->group('foo'); +}); diff --git a/tests/core/Unit/Search/CustomerIndexerTest.php b/tests/core/Unit/Search/CustomerIndexerTest.php index 0c33b1973b..6be7d49e94 100644 --- a/tests/core/Unit/Search/CustomerIndexerTest.php +++ b/tests/core/Unit/Search/CustomerIndexerTest.php @@ -10,7 +10,7 @@ use Lunar\Tests\Core\Stubs\User; use Lunar\Tests\Core\TestCase; -uses(TestCase::class); +uses(TestCase::class)->group('search', 'indexer'); uses(RefreshDatabase::class); diff --git a/tests/core/Unit/Search/OrderIndexerTest.php b/tests/core/Unit/Search/OrderIndexerTest.php index 500aa652ec..054a531d3b 100644 --- a/tests/core/Unit/Search/OrderIndexerTest.php +++ b/tests/core/Unit/Search/OrderIndexerTest.php @@ -11,7 +11,7 @@ use Lunar\Search\OrderIndexer; use Lunar\Tests\Core\TestCase; -uses(TestCase::class); +uses(TestCase::class)->group('search', 'indexer'); uses(RefreshDatabase::class); diff --git a/tests/core/Unit/Search/ProductIndexerTest.php b/tests/core/Unit/Search/ProductIndexerTest.php index 10d91cd8f9..cc611c3310 100644 --- a/tests/core/Unit/Search/ProductIndexerTest.php +++ b/tests/core/Unit/Search/ProductIndexerTest.php @@ -10,7 +10,7 @@ use Lunar\Search\ProductIndexer; use Lunar\Tests\Core\TestCase; -uses(TestCase::class); +uses(TestCase::class)->group('search', 'indexer'); uses(RefreshDatabase::class); diff --git a/tests/core/Unit/Search/ProductOptionIndexerTest.php b/tests/core/Unit/Search/ProductOptionIndexerTest.php index 9aa0efcae9..42694857bf 100644 --- a/tests/core/Unit/Search/ProductOptionIndexerTest.php +++ b/tests/core/Unit/Search/ProductOptionIndexerTest.php @@ -6,7 +6,7 @@ use Lunar\Search\ProductOptionIndexer; use Lunar\Tests\Core\TestCase; -uses(TestCase::class); +uses(TestCase::class)->group('search', 'indexer'); uses(RefreshDatabase::class); diff --git a/tests/core/Unit/Search/ScoutIndexerTest.php b/tests/core/Unit/Search/ScoutIndexerTest.php index 4b954882b0..79b0b175d3 100644 --- a/tests/core/Unit/Search/ScoutIndexerTest.php +++ b/tests/core/Unit/Search/ScoutIndexerTest.php @@ -11,7 +11,7 @@ use Lunar\Search\ScoutIndexer; use Lunar\Tests\Core\TestCase; -uses(TestCase::class); +uses(TestCase::class)->group('search', 'indexer'); uses(RefreshDatabase::class);