From 6accd317ac071bbcefbd50ff6a4c5222cce9ea70 Mon Sep 17 00:00:00 2001 From: Hassan Abdel-Rahman Date: Thu, 4 Apr 2024 14:35:28 -0400 Subject: [PATCH] Add 'every' filter support --- packages/host/tests/unit/query-test.ts | 62 +++++++++++++++++++++++ packages/runtime-common/indexer/client.ts | 5 ++ 2 files changed, 67 insertions(+) diff --git a/packages/host/tests/unit/query-test.ts b/packages/host/tests/unit/query-test.ts index 1ea721bae0..74aba4e95a 100644 --- a/packages/host/tests/unit/query-test.ts +++ b/packages/host/tests/unit/query-test.ts @@ -532,6 +532,68 @@ module('Unit | query', function (hooks) { ); }); + test(`can use 'every' to combine multiple filters`, async function (assert) { + let { mango, vangogh, ringo } = testCards; + await setupIndex(client, [ + { + card: mango, + data: { + search_doc: { + name: 'Mango', + address: { + street: '123 Main Street', + city: 'Barksville', + }, + }, + }, + }, + { + card: vangogh, + data: { + search_doc: { + name: 'Van Gogh', + address: { + street: '456 Grand Blvd', + city: 'Barksville', + }, + }, + }, + }, + { + card: ringo, + data: { + search_doc: { + name: 'Ringo', + address: { + street: '100 Treat Street', + city: 'Waggington', + }, + }, + }, + }, + ]); + + let { cards, meta } = await client.search( + { + filter: { + on: { module: `${testRealmURL}person`, name: 'Person' }, + every: [ + { + eq: { 'address.city': 'Barksville' }, + }, + { + not: { eq: { 'address.street': '456 Grand Blvd' } }, + }, + ], + }, + }, + loader, + ); + + assert.strictEqual(meta.page.total, 1, 'the total results meta is correct'); + assert.deepEqual(getIds(cards), [mango.id], 'results are correct'); + }); + test(`gives a good error when query refers to missing card`, async function (assert) { await setupIndex(client, []); diff --git a/packages/runtime-common/indexer/client.ts b/packages/runtime-common/indexer/client.ts index 815188d073..8463c4fec9 100644 --- a/packages/runtime-common/indexer/client.ts +++ b/packages/runtime-common/indexer/client.ts @@ -251,6 +251,11 @@ export class IndexerDBClient { return this.eqCondition(filter, on); } else if ('not' in filter) { return this.notCondition(filter, on); + } else if ('every' in filter) { + // on = filter.on ?? on; + return every( + filter.every.map((i) => this.filterCondition(i, filter.on ?? on)), + ); } // TODO handle filters for: any, every, contains, and range