Skip to content

Commit

Permalink
Merge pull request #158 from contentstack/feat/cs-43917-equalTo-query…
Browse files Browse the repository at this point in the history
…-operator

Feat/cs 43917 equalTo query operator
  • Loading branch information
harshithad0703 authored Mar 14, 2024
2 parents 82987b9 + ddbb7eb commit fc55499
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 15 deletions.
4 changes: 2 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down
53 changes: 44 additions & 9 deletions src/lib/query.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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}
*/
Expand All @@ -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}
*/
Expand All @@ -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}
*/
Expand All @@ -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}
*/
Expand All @@ -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}
*/
Expand All @@ -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<TEntry>();
*
* @returns {Query}
*/
referenceIn(key: string, query: Query) {
this._parameters[key] = { '$in_query': query._parameters }
return this;
}
}
26 changes: 24 additions & 2 deletions test/api/entry-queryables.spec.ts
Original file line number Diff line number Diff line change
@@ -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();

Expand Down Expand Up @@ -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<TEntry>();

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<TEntry>();
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 {
Expand Down
15 changes: 13 additions & 2 deletions test/unit/entry-queryable.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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', () => {
Expand Down Expand Up @@ -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' ] } } } });
}
});
});

0 comments on commit fc55499

Please sign in to comment.