Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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' ] } } } });
}
});
});