From 4c26f05856a8e497ec8fef4ec89f7c2a5d704eeb Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Wed, 13 Mar 2024 11:47:46 +0530 Subject: [PATCH 1/5] feat: equalTo query operator implementation --- src/lib/query.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/lib/query.ts b/src/lib/query.ts index 3415ab73..11a064cb 100644 --- a/src/lib/query.ts +++ b/src/lib/query.ts @@ -264,4 +264,8 @@ export class Query extends BaseQuery { this._parameters.$and = paramsList; return this; } + equalTo(key: string, value: string | number | boolean): Query { + this._parameters[key] = value; + return this; + } } From 0df87b0deeb96d5f17255eb5709ea57762c4d846 Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Wed, 13 Mar 2024 11:48:43 +0530 Subject: [PATCH 2/5] test: added unit and api test cases for equalTo operator --- test/api/entry-queryables.spec.ts | 11 +++++++++++ test/unit/entry-queryable.spec.ts | 4 ++++ 2 files changed, 15 insertions(+) diff --git a/test/api/entry-queryables.spec.ts b/test/api/entry-queryables.spec.ts index f5657243..03a6cc8e 100644 --- a/test/api/entry-queryables.spec.ts +++ b/test/api/entry-queryables.spec.ts @@ -94,6 +94,17 @@ describe('Query Operators API test cases', () => { } }); + + it('should return entry equal to the condition - equalTo', async () => { + const query = await makeEntries('contenttype_uid').query().equalTo('title', 'value').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 06763e25..c99273d1 100644 --- a/test/unit/entry-queryable.spec.ts +++ b/test/unit/entry-queryable.spec.ts @@ -43,4 +43,8 @@ describe('Query Operators API test cases', () => { const query = await contentType.Entry().query().and(query1, query2); expect(query._parameters).toStrictEqual({ '$and': [ {'fieldUID': {'$in': ['value']}}, { 'fieldUID': 'value2' } ] }); }); + it('should return entry equal to the condition - equalTo', async () => { + const query = contentType.Entry().query().equalTo('fieldUID', 'value'); + expect(query._parameters).toStrictEqual({ 'fieldUID': 'value' }); + }); }); \ No newline at end of file From c178ac490da9092e1f8c0ea5d4cdd87c4e37dc77 Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Wed, 13 Mar 2024 11:56:52 +0530 Subject: [PATCH 3/5] docs: :memo: docs update for equalTo --- src/lib/query.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/lib/query.ts b/src/lib/query.ts index 11a064cb..56b40685 100644 --- a/src/lib/query.ts +++ b/src/lib/query.ts @@ -264,6 +264,19 @@ export class Query extends BaseQuery { this._parameters.$and = paramsList; 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 = await contentType.Entry().query().equalTo('fieldUid', 'value').find(); + * + * @returns {Query} + */ equalTo(key: string, value: string | number | boolean): Query { this._parameters[key] = value; return this; From 19d4261faa3b3c7036e5a029e57ad966b3ca86db Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Wed, 13 Mar 2024 15:39:10 +0530 Subject: [PATCH 4/5] feat: cs-43918-referenceIn operator implementation --- src/lib/query.ts | 38 +++++++++++++++++++++++-------- test/api/entry-queryables.spec.ts | 15 ++++++++++-- test/unit/entry-queryable.spec.ts | 11 +++++++-- 3 files changed, 50 insertions(+), 14 deletions(-) diff --git a/src/lib/query.ts b/src/lib/query.ts index 56b40685..066d53e4 100644 --- a/src/lib/query.ts +++ b/src/lib/query.ts @@ -174,7 +174,7 @@ export class Query extends BaseQuery { * * const stack = contentstack.Stack({ apiKey: "apiKey", deliveryToken: "deliveryToken", environment: "environment" }); * const query = stack.contentType("contentTypeUid").entry().query(); - * const result = containedIn('fieldUid', ['value1', 'value2']).find() + * const result = await query.containedIn('fieldUid', ['value1', 'value2']).find() * * @returns {Query} */ @@ -192,7 +192,7 @@ export class Query extends BaseQuery { * * const stack = contentstack.Stack({ apiKey: "apiKey", deliveryToken: "deliveryToken", environment: "environment" }); * const query = stack.contentType("contentTypeUid").entry().query(); - * const result = notContainedIn('fieldUid', ['value1', 'value2']).find() + * const result = await query.notContainedIn('fieldUid', ['value1', 'value2']).find() * * @returns {Query} */ @@ -210,7 +210,7 @@ export class Query extends BaseQuery { * * const stack = contentstack.Stack({ apiKey: "apiKey", deliveryToken: "deliveryToken", environment: "environment" }); * const query = stack.contentType("contentTypeUid").entry().query(); - * const result = notExists('fieldUid').find() + * const result = await query.notExists('fieldUid').find() * * @returns {Query} */ @@ -227,9 +227,9 @@ export class Query extends BaseQuery { * import contentstack from '@contentstack/delivery-sdk' * * const stack = contentstack.Stack({ apiKey: "apiKey", deliveryToken: "deliveryToken", environment: "environment" }); - * const query1 = await contentType.Entry().query().containedIn('fieldUID', ['value']); - * const query2 = await contentType.Entry().query().where('fieldUID', QueryOperation.EQUALS, 'value2'); - * const query = await contentType.Entry().query().or(query1, query2).find(); + * const query1 = stack.contentType('contenttype_uid').Entry().query().containedIn('fieldUID', ['value']); + * const query2 = stack.contentType('contenttype_uid').Entry().query().where('fieldUID', QueryOperation.EQUALS, 'value2'); + * const query = await stack.contentType('contenttype_uid').Entry().query().or(query1, query2).find(); * * @returns {Query} */ @@ -250,9 +250,9 @@ export class Query extends BaseQuery { * import contentstack from '@contentstack/delivery-sdk' * * const stack = contentstack.Stack({ apiKey: "apiKey", deliveryToken: "deliveryToken", environment: "environment" }); - * const query1 = await contentType.Entry().query().containedIn('fieldUID', ['value']); - * const query2 = await contentType.Entry().query().where('fieldUID', QueryOperation.EQUALS, 'value2'); - * const query = await contentType.Entry().query().and(query1, query2).find(); + * const query1 = stack.contentType('contenttype_uid').Entry().query().containedIn('fieldUID', ['value']); + * const query2 = stack.contentType('contenttype_uid').Entry().query().where('fieldUID', QueryOperation.EQUALS, 'value2'); + * const query = await stack.contentType('contenttype_uid').Entry().query().and(query1, query2).find(); * * @returns {Query} */ @@ -273,7 +273,7 @@ export class Query extends BaseQuery { * import contentstack from '@contentstack/delivery-sdk' * * const stack = contentstack.Stack({ apiKey: "apiKey", deliveryToken: "deliveryToken", environment: "environment" }); - * const query = await contentType.Entry().query().equalTo('fieldUid', 'value').find(); + * const query = await stack.contentType('contenttype_uid').Entry().query().equalTo('fieldUid', 'value').find(); * * @returns {Query} */ @@ -281,4 +281,22 @@ export class Query extends BaseQuery { this._parameters[key] = value; 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().referenceIn('reference_uid', query).find(); + * + * @returns {Query} + */ + referenceIn(key: string, query: Query) { + this._parameters[key] = { '$in_query': query._parameters } + return this; +} } diff --git a/test/api/entry-queryables.spec.ts b/test/api/entry-queryables.spec.ts index 03a6cc8e..7596b96e 100644 --- a/test/api/entry-queryables.spec.ts +++ b/test/api/entry-queryables.spec.ts @@ -1,8 +1,8 @@ import { stackInstance } from '../utils/stack-instance'; import { Entries } from '../../src/lib/entries'; import { TEntry } from './types'; -import { QueryOperation } from 'src/lib/types'; -import { Query } from 'src/lib/query'; +import { QueryOperation } from '../../src/lib/types'; +import { Query } from '../../src/lib/query'; const stack = stackInstance(); @@ -105,6 +105,17 @@ describe('Query Operators API test cases', () => { expect(query.entries[0].title).toBe('value'); } }); + + test('should return entry for referencedIn query', async () => { + const query = makeEntries('contenttype_uid').query().where('title', QueryOperation.EQUALS, 'value'); + const entryQuery = await makeEntries('contenttype_uid').query().referenceIn('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).toBe('test'); + } + }); }); function makeEntries(contentTypeUid = ''): Entries { diff --git a/test/unit/entry-queryable.spec.ts b/test/unit/entry-queryable.spec.ts index c99273d1..0666f455 100644 --- a/test/unit/entry-queryable.spec.ts +++ b/test/unit/entry-queryable.spec.ts @@ -2,8 +2,8 @@ import { AxiosInstance, httpClient } from '@contentstack/core'; import { ContentType } from '../../src/lib/content-type'; import MockAdapter from 'axios-mock-adapter'; import { MOCK_CLIENT_OPTIONS } from '../utils/constant'; -import { Query } from 'src/lib/query'; -import { QueryOperation } from 'src/lib/types'; +import { Query } from '../../src/lib/query'; +import { QueryOperation } from '../../src/lib/types'; describe('Query Operators API test cases', () => { @@ -47,4 +47,11 @@ describe('Query Operators API test cases', () => { const query = contentType.Entry().query().equalTo('fieldUID', 'value'); expect(query._parameters).toStrictEqual({ 'fieldUID': 'value' }); }); + test('should return entry for referencedIn query', async () => { + const query1 = contentType.Entry().query().containedIn('fieldUID', ['value']); + const entryQuery = await contentType.Entry().query().referenceIn('reference_uid', query1); + if (entryQuery) { + expect(entryQuery._parameters).toEqual({ reference_uid: { '$in_query': { fieldUID: { '$in': [ 'value' ] } } } }); + } + }); }); \ No newline at end of file From ddbb7eb0bf0b7491efc48fe2687ef63b5b10d648 Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Wed, 13 Mar 2024 16:31:38 +0530 Subject: [PATCH 5/5] update changeLog and test->it --- CHANGELOG.md | 4 ++-- test/api/entry-queryables.spec.ts | 2 +- test/unit/entry-queryable.spec.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3406e67b..76c3030b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,9 @@ ## Change log ### Version: 4.0.0-beta.4 -#### Date: March-04-2024 +#### Date: March-14-2024 ##### New Features: -- Query implementation for containedIn and notContainedIn +- Query operators implementation ### Version: 4.0.0-beta.3 #### Date: February-13-2024 diff --git a/test/api/entry-queryables.spec.ts b/test/api/entry-queryables.spec.ts index 7596b96e..feb15b1f 100644 --- a/test/api/entry-queryables.spec.ts +++ b/test/api/entry-queryables.spec.ts @@ -106,7 +106,7 @@ describe('Query Operators API test cases', () => { } }); - test('should return entry for referencedIn query', async () => { + it('should return entry for referencedIn query', async () => { const query = makeEntries('contenttype_uid').query().where('title', QueryOperation.EQUALS, 'value'); const entryQuery = await makeEntries('contenttype_uid').query().referenceIn('reference_uid', query).find(); if (entryQuery.entries) { diff --git a/test/unit/entry-queryable.spec.ts b/test/unit/entry-queryable.spec.ts index 0666f455..3a97d5da 100644 --- a/test/unit/entry-queryable.spec.ts +++ b/test/unit/entry-queryable.spec.ts @@ -47,7 +47,7 @@ describe('Query Operators API test cases', () => { const query = contentType.Entry().query().equalTo('fieldUID', 'value'); expect(query._parameters).toStrictEqual({ 'fieldUID': 'value' }); }); - test('should return entry for referencedIn query', async () => { + it('should return entry for referencedIn query', async () => { const query1 = contentType.Entry().query().containedIn('fieldUID', ['value']); const entryQuery = await contentType.Entry().query().referenceIn('reference_uid', query1); if (entryQuery) {