Skip to content

Commit 3eee205

Browse files
Merge pull request #158 from contentstack/feat/cs-43917-equalTo-query-operator
Feat/cs 43917 equalTo query operator
2 parents bd491f4 + 6cadbf1 commit 3eee205

File tree

4 files changed

+83
-15
lines changed

4 files changed

+83
-15
lines changed

CHANGELOG.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
## Change log
22

33
### Version: 4.0.0-beta.4
4-
#### Date: March-04-2024
4+
#### Date: March-14-2024
55
##### New Features:
6-
- Query implementation for containedIn and notContainedIn
6+
- Query operators implementation
77

88
### Version: 4.0.0-beta.3
99
#### Date: February-13-2024

src/lib/query.ts

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ export class Query extends BaseQuery {
174174
*
175175
* const stack = contentstack.Stack({ apiKey: "apiKey", deliveryToken: "deliveryToken", environment: "environment" });
176176
* const query = stack.contentType("contentTypeUid").entry().query();
177-
* const result = containedIn('fieldUid', ['value1', 'value2']).find()
177+
* const result = await query.containedIn('fieldUid', ['value1', 'value2']).find()
178178
*
179179
* @returns {Query}
180180
*/
@@ -192,7 +192,7 @@ export class Query extends BaseQuery {
192192
*
193193
* const stack = contentstack.Stack({ apiKey: "apiKey", deliveryToken: "deliveryToken", environment: "environment" });
194194
* const query = stack.contentType("contentTypeUid").entry().query();
195-
* const result = notContainedIn('fieldUid', ['value1', 'value2']).find()
195+
* const result = await query.notContainedIn('fieldUid', ['value1', 'value2']).find()
196196
*
197197
* @returns {Query}
198198
*/
@@ -210,7 +210,7 @@ export class Query extends BaseQuery {
210210
*
211211
* const stack = contentstack.Stack({ apiKey: "apiKey", deliveryToken: "deliveryToken", environment: "environment" });
212212
* const query = stack.contentType("contentTypeUid").entry().query();
213-
* const result = notExists('fieldUid').find()
213+
* const result = await query.notExists('fieldUid').find()
214214
*
215215
* @returns {Query}
216216
*/
@@ -227,9 +227,9 @@ export class Query extends BaseQuery {
227227
* import contentstack from '@contentstack/delivery-sdk'
228228
*
229229
* const stack = contentstack.Stack({ apiKey: "apiKey", deliveryToken: "deliveryToken", environment: "environment" });
230-
* const query1 = await contentType.Entry().query().containedIn('fieldUID', ['value']);
231-
* const query2 = await contentType.Entry().query().where('fieldUID', QueryOperation.EQUALS, 'value2');
232-
* const query = await contentType.Entry().query().or(query1, query2).find();
230+
* const query1 = stack.contentType('contenttype_uid').Entry().query().containedIn('fieldUID', ['value']);
231+
* const query2 = stack.contentType('contenttype_uid').Entry().query().where('fieldUID', QueryOperation.EQUALS, 'value2');
232+
* const query = await stack.contentType('contenttype_uid').Entry().query().or(query1, query2).find();
233233
*
234234
* @returns {Query}
235235
*/
@@ -250,9 +250,9 @@ export class Query extends BaseQuery {
250250
* import contentstack from '@contentstack/delivery-sdk'
251251
*
252252
* const stack = contentstack.Stack({ apiKey: "apiKey", deliveryToken: "deliveryToken", environment: "environment" });
253-
* const query1 = await contentType.Entry().query().containedIn('fieldUID', ['value']);
254-
* const query2 = await contentType.Entry().query().where('fieldUID', QueryOperation.EQUALS, 'value2');
255-
* const query = await contentType.Entry().query().and(query1, query2).find();
253+
* const query1 = stack.contentType('contenttype_uid').Entry().query().containedIn('fieldUID', ['value']);
254+
* const query2 = stack.contentType('contenttype_uid').Entry().query().where('fieldUID', QueryOperation.EQUALS, 'value2');
255+
* const query = await stack.contentType('contenttype_uid').Entry().query().and(query1, query2).find();
256256
*
257257
* @returns {Query}
258258
*/
@@ -264,4 +264,39 @@ export class Query extends BaseQuery {
264264
this._parameters.$and = paramsList;
265265
return this;
266266
}
267+
268+
/**
269+
* @method equalTo
270+
* @memberof Query
271+
* @description Returns the raw (JSON) query based on the filters applied on Query object.
272+
* @example
273+
* import contentstack from '@contentstack/delivery-sdk'
274+
*
275+
* const stack = contentstack.Stack({ apiKey: "apiKey", deliveryToken: "deliveryToken", environment: "environment" });
276+
* const query = await stack.contentType('contenttype_uid').Entry().query().equalTo('fieldUid', 'value').find();
277+
*
278+
* @returns {Query}
279+
*/
280+
equalTo(key: string, value: string | number | boolean): Query {
281+
this._parameters[key] = value;
282+
return this;
283+
}
284+
285+
/**
286+
* @method equalTo
287+
* @memberof Query
288+
* @description Returns the raw (JSON) query based on the filters applied on Query object.
289+
* @example
290+
* import contentstack from '@contentstack/delivery-sdk'
291+
*
292+
* const stack = contentstack.Stack({ apiKey: "apiKey", deliveryToken: "deliveryToken", environment: "environment" });
293+
* const query = stack.contentType('contenttype_uid').query().where('title', QueryOperation.EQUALS, 'value');
294+
* const entryQuery = await stack.contentType('contenttype_uid').query().referenceIn('reference_uid', query).find<TEntry>();
295+
*
296+
* @returns {Query}
297+
*/
298+
referenceIn(key: string, query: Query) {
299+
this._parameters[key] = { '$in_query': query._parameters }
300+
return this;
301+
}
267302
}

test/api/entry-queryables.spec.ts

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { stackInstance } from '../utils/stack-instance';
22
import { Entries } from '../../src/lib/entries';
33
import { TEntry } from './types';
4-
import { QueryOperation } from 'src/lib/types';
5-
import { Query } from 'src/lib/query';
4+
import { QueryOperation } from '../../src/lib/types';
5+
import { Query } from '../../src/lib/query';
66

77
const stack = stackInstance();
88

@@ -94,6 +94,28 @@ describe('Query Operators API test cases', () => {
9494

9595
}
9696
});
97+
98+
it('should return entry equal to the condition - equalTo', async () => {
99+
const query = await makeEntries('contenttype_uid').query().equalTo('title', 'value').find<TEntry>();
100+
101+
if (query.entries) {
102+
expect(query.entries[0]._version).toBeDefined();
103+
expect(query.entries[0].locale).toBeDefined();
104+
expect(query.entries[0].uid).toBeDefined();
105+
expect(query.entries[0].title).toBe('value');
106+
}
107+
});
108+
109+
it('should return entry for referencedIn query', async () => {
110+
const query = makeEntries('contenttype_uid').query().where('title', QueryOperation.EQUALS, 'value');
111+
const entryQuery = await makeEntries('contenttype_uid').query().referenceIn('reference_uid', query).find<TEntry>();
112+
if (entryQuery.entries) {
113+
expect(entryQuery.entries[0]._version).toBeDefined();
114+
expect(entryQuery.entries[0].locale).toBeDefined();
115+
expect(entryQuery.entries[0].uid).toBeDefined();
116+
expect(entryQuery.entries[0].title).toBe('test');
117+
}
118+
});
97119
});
98120

99121
function makeEntries(contentTypeUid = ''): Entries {

test/unit/entry-queryable.spec.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import { AxiosInstance, httpClient } from '@contentstack/core';
22
import { ContentType } from '../../src/lib/content-type';
33
import MockAdapter from 'axios-mock-adapter';
44
import { MOCK_CLIENT_OPTIONS } from '../utils/constant';
5-
import { Query } from 'src/lib/query';
6-
import { QueryOperation } from 'src/lib/types';
5+
import { Query } from '../../src/lib/query';
6+
import { QueryOperation } from '../../src/lib/types';
77

88

99
describe('Query Operators API test cases', () => {
@@ -43,4 +43,15 @@ describe('Query Operators API test cases', () => {
4343
const query = await contentType.Entry().query().and(query1, query2);
4444
expect(query._parameters).toStrictEqual({ '$and': [ {'fieldUID': {'$in': ['value']}}, { 'fieldUID': 'value2' } ] });
4545
});
46+
it('should return entry equal to the condition - equalTo', async () => {
47+
const query = contentType.Entry().query().equalTo('fieldUID', 'value');
48+
expect(query._parameters).toStrictEqual({ 'fieldUID': 'value' });
49+
});
50+
it('should return entry for referencedIn query', async () => {
51+
const query1 = contentType.Entry().query().containedIn('fieldUID', ['value']);
52+
const entryQuery = await contentType.Entry().query().referenceIn('reference_uid', query1);
53+
if (entryQuery) {
54+
expect(entryQuery._parameters).toEqual({ reference_uid: { '$in_query': { fieldUID: { '$in': [ 'value' ] } } } });
55+
}
56+
});
4657
});

0 commit comments

Comments
 (0)