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/src/lib/query.ts b/src/lib/query.ts index 3415ab73..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} */ @@ -264,4 +264,39 @@ 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 stack.contentType('contenttype_uid').Entry().query().equalTo('fieldUid', 'value').find(); + * + * @returns {Query} + */ + equalTo(key: string, value: string | number | boolean): Query { + 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 f5657243..feb15b1f 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(); @@ -94,6 +94,28 @@ 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'); + } + }); + + 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) { + 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 06763e25..3a97d5da 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', () => { @@ -43,4 +43,15 @@ 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' }); + }); + 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) { + expect(entryQuery._parameters).toEqual({ reference_uid: { '$in_query': { fieldUID: { '$in': [ 'value' ] } } } }); + } + }); }); \ No newline at end of file