From 27ef18031be3e2a919bb0ccd775974bc9e958f12 Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Tue, 19 Mar 2024 16:22:34 +0530 Subject: [PATCH 1/2] feat: exist query operator implementation --- src/lib/query.ts | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/src/lib/query.ts b/src/lib/query.ts index 30f5900e..93271497 100644 --- a/src/lib/query.ts +++ b/src/lib/query.ts @@ -201,6 +201,24 @@ export class Query extends BaseQuery { return this; } + /** + * @method exists + * @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("contentTypeUid").entry().query(); + * const result = await query.exists('fieldUid').find() + * + * @returns {Query} + */ + exists(key: string): Query { + this._parameters[key] = { '$exists': true }; + return this; + } + /** * @method notExists * @memberof Query @@ -291,7 +309,7 @@ export class Query extends BaseQuery { * * 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().referenceIn('reference_uid', query).find(); + * const entryQuery = await stack.contentType('contenttype_uid').query().referenceIn('reference_uid', query).find(); * * @returns {Query} */ @@ -309,7 +327,7 @@ export class Query extends BaseQuery { * * 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(); + * const entryQuery = await stack.contentType('contenttype_uid').query().referenceNotIn('reference_uid', query).find(); * * @returns {Query} */ @@ -327,7 +345,7 @@ export class Query extends BaseQuery { * * 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(); + * const entryQuery = await stack.contentType('contenttype_uid').query().tags(['tag1']).find(); * * @returns {Query} */ @@ -335,6 +353,20 @@ export class Query extends BaseQuery { this._parameters['tags'] = values; return this; } + + /** + * @method search + * @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().search('key').find(); + * + * @returns {Query} + */ search(key: string): Query { this._queryParams['typeahead'] = key return this From 17b4e2ef02d0a779893343cbac98e03b4c6ab677 Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Tue, 19 Mar 2024 16:24:36 +0530 Subject: [PATCH 2/2] test: unit and api test cases for exists, orderByAscending and orderByDescending --- test/api/entry-queryables.spec.ts | 37 ++++++++++++++++++++++++++++++- test/unit/entry-queryable.spec.ts | 18 +++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/test/api/entry-queryables.spec.ts b/test/api/entry-queryables.spec.ts index 7bfa33b8..0b1e53ac 100644 --- a/test/api/entry-queryables.spec.ts +++ b/test/api/entry-queryables.spec.ts @@ -28,7 +28,7 @@ describe('Query Operators API test cases', () => { }); it('should get entries which does not match the fieldUid - notExists', async () => { - const query = await makeEntries('contenttype_uid').query().notExists('multi_line').find() + const query = await makeEntries('contenttype_uid2').query().notExists('multi_line').find() if (query.entries) { expect(query.entries[0]._version).toBeDefined(); expect(query.entries[0].title).toBeDefined(); @@ -38,6 +38,17 @@ describe('Query Operators API test cases', () => { } }); + it('should get entries which matches the fieldUid - exists', async () => { + const query = await makeEntries('contenttype_uid').query().exists('multi_line').find() + if (query.entries) { + expect(query.entries[0]._version).toBeDefined(); + expect(query.entries[0].title).toBeDefined(); + expect(query.entries[0].uid).toBeDefined(); + expect(query.entries[0].created_at).toBeDefined(); + expect((query.entries[0] as any).multi_line).toBeDefined() + } + }); + it('should return entries matching any of the conditions - or', async () => { const query1: Query = await makeEntries('contenttype_uid').query().containedIn('title', ['value']); const query2: Query = await makeEntries('contenttype_uid').query().where('title', QueryOperation.EQUALS, 'value2'); @@ -152,6 +163,30 @@ describe('Query Operators API test cases', () => { expect(query.entries[0].title).toBe('value2'); } }); + + it('should sort entries in ascending order of the given fieldUID', async () => { + const query = await makeEntries('contenttype_uid').query().orderByAscending('title').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('test'); + expect(query.entries[1].title).toBe('test2'); + expect(query.entries[2].title).toBe('value'); + } + }); + + it('should sort entries in descending order of the given fieldUID', async () => { + const query = await makeEntries('contenttype_uid').query().orderByDescending('title').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('value2'); + expect(query.entries[1].title).toBe('value'); + expect(query.entries[2].title).toBe('test2'); + } + }); }); function makeEntries(contentTypeUid = ''): Entries { diff --git a/test/unit/entry-queryable.spec.ts b/test/unit/entry-queryable.spec.ts index ea7a4a0e..3eb8041f 100644 --- a/test/unit/entry-queryable.spec.ts +++ b/test/unit/entry-queryable.spec.ts @@ -31,6 +31,12 @@ describe('Query Operators API test cases', () => { const query = contentType.Entry().query().notExists('fieldUID'); expect(query._parameters).toStrictEqual({'fieldUID': {'$exists': false}}); }); + it('should get entries which matches the fieldUid - exists', async () => { + const query = contentType.Entry().query().exists('fieldUID'); + if (query) { + expect(query._parameters).toEqual({'fieldUID': {'$exists': true}}); + } + }); it('should return entries matching any of the conditions - or', async () => { const query1: Query = await contentType.Entry().query().containedIn('fieldUID', ['value']); const query2: Query = await contentType.Entry().query().where('fieldUID', QueryOperation.EQUALS, 'value2'); @@ -73,4 +79,16 @@ describe('Query Operators API test cases', () => { expect(query._queryParams).toEqual({ typeahead: 'entry' }); } }); + it('should sort entries in ascending order of the given fieldUID', async () => { + const query = contentType.Entry().query().orderByAscending('fieldUid'); + if (query) { + expect(query._queryParams).toEqual({ asc: 'fieldUid' }); + } + }); + it('should sort entries in descending order of the given fieldUID', async () => { + const query = contentType.Entry().query().orderByDescending('fieldUid'); + if (query) { + expect(query._queryParams).toEqual({ desc: 'fieldUid' }); + } + }); }); \ No newline at end of file