From 7e3205f4c5f7c3fcc8fb5d4cf3fcc85d80670f28 Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Thu, 14 Mar 2024 16:42:54 +0530 Subject: [PATCH 1/3] feat: referenceNotIn operator implementation --- src/lib/query.ts | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/lib/query.ts b/src/lib/query.ts index 066d53e4..13b9a7c3 100644 --- a/src/lib/query.ts +++ b/src/lib/query.ts @@ -298,5 +298,23 @@ export class Query extends BaseQuery { referenceIn(key: string, query: Query) { this._parameters[key] = { '$in_query': query._parameters } return this; -} + } + + /** + * @method equalTo + * @memberof Query + * @description Returns the raw (JSON) query based on the filters applied on Query object. + * @example + * import contentstack from '@contentstack/delivery-sdk' + * + * const stack = contentstack.Stack({ apiKey: "apiKey", deliveryToken: "deliveryToken", environment: "environment" }); + * const query = stack.contentType('contenttype_uid').query().where('title', QueryOperation.EQUALS, 'value'); + * const entryQuery = await stack.contentType('contenttype_uid').query().referenceNotIn('reference_uid', query).find(); + * + * @returns {Query} + */ + referenceNotIn(key: string, query: Query) { + this._parameters[key] = { '$nin_query': query._parameters } + return this; + } } From 81b37efd98e26ae963e9e1fa412416ba79de1382 Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Thu, 14 Mar 2024 16:44:43 +0530 Subject: [PATCH 2/3] feat: tags query operator implementation --- src/lib/query.ts | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/lib/query.ts b/src/lib/query.ts index 13b9a7c3..a8904084 100644 --- a/src/lib/query.ts +++ b/src/lib/query.ts @@ -301,7 +301,7 @@ export class Query extends BaseQuery { } /** - * @method equalTo + * @method referenceNotIn * @memberof Query * @description Returns the raw (JSON) query based on the filters applied on Query object. * @example @@ -317,4 +317,22 @@ export class Query extends BaseQuery { this._parameters[key] = { '$nin_query': query._parameters } return this; } + + /** + * @method tags + * @memberof Query + * @description Returns the raw (JSON) query based on the filters applied on Query object. + * @example + * import contentstack from '@contentstack/delivery-sdk' + * + * const stack = contentstack.Stack({ apiKey: "apiKey", deliveryToken: "deliveryToken", environment: "environment" }); + * const query = stack.contentType('contenttype_uid').query().where('title', QueryOperation.EQUALS, 'value'); + * const entryQuery = await stack.contentType('contenttype_uid').query().tags(['tag1']).find(); + * + * @returns {Query} + */ + tags(values: (string | number | boolean)[]): Query { + this._parameters['tags'] = values; + return this; + } } From 4e5b9bbbaec8631875b38bd89ab6da71348b74dc Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Fri, 15 Mar 2024 14:15:49 +0530 Subject: [PATCH 3/3] test: unit and api tests for tags and referenceNot In operators --- test/api/entry-queryables.spec.ts | 26 ++++++++++++++++++++++++++ test/unit/entry-queryable.spec.ts | 19 ++++++++++++++++--- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/test/api/entry-queryables.spec.ts b/test/api/entry-queryables.spec.ts index feb15b1f..126ebb29 100644 --- a/test/api/entry-queryables.spec.ts +++ b/test/api/entry-queryables.spec.ts @@ -116,6 +116,32 @@ describe('Query Operators API test cases', () => { expect(entryQuery.entries[0].title).toBe('test'); } }); + it('should return entry for referenceNotIn query', async () => { + const query = makeEntries('contenttype_uid').query().where('title', QueryOperation.EQUALS, 'value'); + const entryQuery = await makeEntries('contenttype_uid').query().referenceNotIn('reference_uid', query).find(); + + if (entryQuery.entries) { + expect(entryQuery.entries[0]._version).toBeDefined(); + expect(entryQuery.entries[0].locale).toBeDefined(); + expect(entryQuery.entries[0].uid).toBeDefined(); + expect(entryQuery.entries[0].title).not.toBe('test'); + expect(entryQuery.entries[0].title).toBe('value2'); + expect(entryQuery.entries[1]._version).toBeDefined(); + expect(entryQuery.entries[1].locale).toBeDefined(); + expect(entryQuery.entries[1].uid).toBeDefined(); + expect(entryQuery.entries[1].title).toBe('value'); + } + }); + + it('should return entry if tags are matching', async () => { + const query = await makeEntries('contenttype_uid').query().tags(['tag1']).find(); + if (query.entries) { + expect(query.entries[0]._version).toBeDefined(); + expect(query.entries[0].locale).toBeDefined(); + expect(query.entries[0].uid).toBeDefined(); + expect(query.entries[0].title).toBe('value'); + } + }); }); function makeEntries(contentTypeUid = ''): Entries { diff --git a/test/unit/entry-queryable.spec.ts b/test/unit/entry-queryable.spec.ts index 3a97d5da..09ce14cb 100644 --- a/test/unit/entry-queryable.spec.ts +++ b/test/unit/entry-queryable.spec.ts @@ -47,11 +47,24 @@ describe('Query Operators API test cases', () => { const query = contentType.Entry().query().equalTo('fieldUID', 'value'); expect(query._parameters).toStrictEqual({ 'fieldUID': 'value' }); }); - it('should return entry for referencedIn query', async () => { - const query1 = contentType.Entry().query().containedIn('fieldUID', ['value']); + it('should return entry for referenceIn query', async () => { + const query1 = contentType.Entry().query().where('fieldUID', QueryOperation.EQUALS, 'value'); const entryQuery = await contentType.Entry().query().referenceIn('reference_uid', query1); if (entryQuery) { - expect(entryQuery._parameters).toEqual({ reference_uid: { '$in_query': { fieldUID: { '$in': [ 'value' ] } } } }); + expect(entryQuery._parameters).toEqual({ reference_uid: { '$in_query': { fieldUID: 'value' } } }); + } + }); + it('should return entry for referenceNotIn query', async () => { + const query1 = contentType.Entry().query().where('fieldUID', QueryOperation.EQUALS, 'value'); + const entryQuery = await contentType.Entry().query().referenceNotIn('reference_uid', query1); + if (entryQuery) { + expect(entryQuery._parameters).toEqual({ reference_uid: { '$nin_query': { fieldUID: 'value' } } }); + } + }); + it('should return entry if tags are matching', async () => { + const query = contentType.Entry().query().tags(['tag1']); + if (query) { + expect(query._parameters).toEqual({ tags: ['tag1'] }); } }); }); \ No newline at end of file