Skip to content

Commit

Permalink
Merge pull request #43 from molgenis/feat/readDepth
Browse files Browse the repository at this point in the history
Add <,>,<=,>= operators
  • Loading branch information
dennishendriksen authored Jan 28, 2021
2 parents 018d5c1 + 107118f commit 52ef3ec
Show file tree
Hide file tree
Showing 2 changed files with 177 additions and 1 deletion.
108 changes: 108 additions & 0 deletions src/__tests__/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,114 @@ test('get - one record with invalid selector', async () => {
await expect(api.getRecords(params)).rejects.toThrow("value '10042538' is of type 'number' instead of 'object'");
});

test('get - records with greater than query', async () => {
const params: Params = {
query: {
selector: ['n', 'n_number2'],
operator: '>',
args: 0,
},
};
const records = await api.getRecords(params);
expect(records).toEqual({
items: [record0],
page: { number: 0, size: 10, totalElements: 1 },
total: 32,
});
});

test('get - records with greater than or equal query', async () => {
const params: Params = {
query: {
selector: ['n', 'n_number2'],
operator: '>=',
args: 1,
},
};
const records = await api.getRecords(params);
expect(records).toEqual({
items: [record0],
page: { number: 0, size: 10, totalElements: 1 },
total: 32,
});
});

test('get - records with less than query', async () => {
const params: Params = {
query: {
selector: ['n', 'n_number2'],
operator: '<',
args: 1,
},
};
const records = await api.getRecords(params);
expect(records).toEqual({
items: [record1],
page: { number: 0, size: 10, totalElements: 1 },
total: 32,
});
});

test('get - records with less than or equal query', async () => {
const params: Params = {
query: {
selector: ['n', 'n_number2'],
operator: '<=',
args: 1,
},
};
const records = await api.getRecords(params);
expect(records).toEqual({
items: [record0, record1],
page: { number: 0, size: 10, totalElements: 2 },
total: 32,
});
});

test('get - records with less than or equal query invalid field', async () => {
const params: Params = {
query: {
selector: ['n', 'n_string0'],
operator: '<=',
args: 1,
},
};
await expect(api.getRecords(params)).rejects.toThrow("value 'a' is of type 'string' instead of 'number'");
});

test('get - one record with invalid selector', async () => {
const params: Params = {
query: {
selector: ['p', 'x', 'y', 'z'],
operator: '==',
args: 10042538,
},
};
await expect(api.getRecords(params)).rejects.toThrow("value '10042538' is of type 'number' instead of 'object'");
});

test('get - one record with invalid selector', async () => {
const params: Params = {
query: {
selector: ['p', 'x', 'y', 'z'],
operator: '==',
args: 10042538,
},
};
await expect(api.getRecords(params)).rejects.toThrow("value '10042538' is of type 'number' instead of 'object'");
});

test('get - one record with invalid selector', async () => {
const params: Params = {
query: {
selector: ['p', 'x', 'y', 'z'],
operator: '==',
args: 10042538,
},
};
await expect(api.getRecords(params)).rejects.toThrow("value '10042538' is of type 'number' instead of 'object'");
});

test('get - one record using composed and query', async () => {
const params: Params = {
query: {
Expand Down
70 changes: 69 additions & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ export interface ComposedQuery {
}

export interface Query {
operator: '==' | '!=' | 'in' | '!in' | 'has_any' | '!has_any' | 'any_has_any' | '!any_has_any';
operator: '==' | '!=' | 'in' | '!in' | 'has_any' | '!has_any' | 'any_has_any' | '!any_has_any' | '>' | '>=' | '<' | '<=';
selector: Selector;
args: string | number | boolean | string[] | number[];
}
Expand Down Expand Up @@ -356,6 +356,18 @@ function matches(query: Query | ComposedQuery, resource: Resource): boolean {
case '!in':
match = !matchesIn(query, resource);
break;
case '>':
match = matchesGreaterThan(query, resource);
break;
case '>=':
match = matchesGreaterThanOrEqual(query, resource);
break;
case '<':
match = matchesLesserThan(query, resource);
break;
case '<=':
match = matchesLesserThanOrEqual(query, resource);
break;
default:
throw new Error('unexpected query operator ' + query.operator);
}
Expand Down Expand Up @@ -427,6 +439,62 @@ function matchesHasAny(query: Query, resource: Resource): boolean {
return match;
}

function matchesGreaterThan(query: Query, resource: Resource): boolean {
const value: any = select(query.selector, resource);

if (value === undefined || value === null) {
return false;
}

if (typeof value !== 'number') {
throw new Error(`value '${value}' is of type '${typeof value}' instead of 'number'`);
}

return value > query.args;
}

function matchesGreaterThanOrEqual(query: Query, resource: Resource): boolean {
const value: any = select(query.selector, resource);

if (value === undefined || value === null) {
return false;
}

if (typeof value !== 'number') {
throw new Error(`value '${value}' is of type '${typeof value}' instead of 'number'`);
}

return value >= query.args;
}

function matchesLesserThan(query: Query, resource: Resource): boolean {
const value: any = select(query.selector, resource);

if (value === undefined || value === null) {
return false;
}

if (typeof value !== 'number') {
throw new Error(`value '${value}' is of type '${typeof value}' instead of 'number'`);
}

return value < query.args;
}

function matchesLesserThanOrEqual(query: Query, resource: Resource): boolean {
const value: any = select(query.selector, resource);

if (value === undefined || value === null) {
return false;
}

if (typeof value !== 'number') {
throw new Error(`value '${value}' is of type '${typeof value}' instead of 'number'`);
}

return value <= query.args;
}

function select(selector: Selector, resource: Resource) {
let parts: SelectorPart[];
if (Array.isArray(selector)) {
Expand Down

0 comments on commit 52ef3ec

Please sign in to comment.