Skip to content

Commit d59f1dc

Browse files
committed
Adding new operator dateBetween
1 parent 684f867 commit d59f1dc

File tree

8 files changed

+130
-6
lines changed

8 files changed

+130
-6
lines changed

package-lock.json

Lines changed: 6 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@
2727
"license": "MIT",
2828
"dependencies": {
2929
"arrify": "^2.0.1",
30+
"date-format": "^3.0.0",
3031
"identity-function": "^1.0.0",
32+
"is-date-object": "^1.0.1",
3133
"is-function": "^1.0.1",
3234
"is-number": "^7.0.0",
3335
"is-string": "^1.0.4",

readme.md

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,15 @@ const query = select({
5555
value: 10,
5656
}
5757
]
58-
}
58+
},
59+
{
60+
operator: 'dateBetween',
61+
field: 'BIRTH',
62+
value: {
63+
start: new Date(1975, 0, 1),
64+
end: new Date(1999, 11, 31),
65+
}
66+
},
5967
],
6068
groupBy: ['A', 'B', 'C'],
6169
orderBy: ['A'],
@@ -70,7 +78,8 @@ console.log(query);
7078
Will output:
7179
7280
SELECT A, B, count(D) AS CNT FROM STUDENTS
73-
WHERE NAME = 'Piyush' AND ROLL = 13 AND (A = 5 OR A = 10)
81+
WHERE NAME = 'Piyush' AND ROLL = 13 AND (A = 5 OR A = 10) AND
82+
BIRTH BETWEEN '1975-01-01' AND '1999-12-31'
7483
GROUP BY A, B, C
7584
ORDER BY A
7685
EXTERNAL NAME 'TestFuncs$MyMath.pow'

src/buildWhereClause.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import templates from './template/templates'
77
import templateUtil from './template/util';
88
import {arrayJoinMap} from './arrayUtils';
99
import {wrapInSpace, wrapeInSpacedBrackets} from './stringUtils';
10+
import dateValue from './dateValue';
1011

1112
const builder = {
1213
build(where) {
@@ -57,7 +58,7 @@ const builder = {
5758
}
5859
const createBetweenCfg = (start, end) => {
5960
return {
60-
field: config.field,
61+
...config,
6162
start, end,
6263
};
6364
}
@@ -77,6 +78,13 @@ const builder = {
7778
return templateUtil.applyTemplate(templates.between, transformedConfigs, isNot);
7879
},
7980

81+
dateBetween(config, isNot) {
82+
const toDate = dateValue(config.format || 'yyyy-MM-dd');
83+
const mapFn = item => quotifyValue(toDate(item));
84+
const transformedConfigs = mapObjValues(this.transformBetweenConfig(config), mapFn, ['start', 'end']);
85+
return templateUtil.applyTemplate(templates.between, transformedConfigs, isNot);
86+
},
87+
8088
equal: templateUtil.composeOperatorForTemplate(templates.equal.bind(templates)),
8189
like: templateUtil.composeOperatorForTemplate(templates.like),
8290
greaterThan: templateUtil.composeRelationalOperator('>'),

src/dateValue.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import isDate from 'is-date-object';
2+
import dateFormat from 'date-format';
3+
4+
export default format => value => {
5+
if(isDate(value))
6+
return dateFormat(format, value);
7+
else
8+
return value;
9+
}

src/funtionAliasMap.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ const aliasConfigs = {
1111
alias: 'range',
1212
generateNotEquivalent: true,
1313
},
14+
dateBetween: {
15+
alias: 'dateRange',
16+
generateNotEquivalent: true,
17+
},
1418
like: {
1519
// no alias and no operator
1620
generateNotEquivalent: true,

src/test/buildWhereClause.test.js

Lines changed: 88 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,11 +239,26 @@ describe('testing buildWhereClause module', () => {
239239
)
240240
`
241241
],
242+
[
243+
[
244+
{
245+
operator: 'dateBetween',
246+
field: 'birth',
247+
value: {
248+
start: new Date(1975, 0, 1),
249+
end: new Date(1999, 11, 31),
250+
}
251+
}
252+
],
253+
`
254+
birth BETWEEN '1975-01-01' AND '1999-12-31'
255+
`
256+
],
242257
])('testing with each utility', (received, expected) => {
243258
expect(buildWhereClause.build(received)).toBeSimilarWith(expected);
244259
});
245260

246-
it('nesgative testing blocks', () => {
261+
it('negative testing blocks', () => {
247262
const configObj = {
248263
operator: 'and',
249264
};
@@ -296,4 +311,76 @@ describe('testing buildWhereClause module', () => {
296311
])('testing between module', (received, expected) => {
297312
expect(buildWhereClause.between(received)).toBeSimilarWith(expected);
298313
});
314+
315+
it.each([
316+
[
317+
{
318+
field: 'A',
319+
start: new Date(2019, 10, 15),
320+
end: new Date(2019, 10, 30)
321+
},
322+
`
323+
A BETWEEN '2019-11-15' AND '2019-11-30'
324+
`
325+
],
326+
[
327+
{
328+
field: 'A',
329+
value: {
330+
start: new Date(2019, 10, 15),
331+
end: new Date(2019, 10, 30),
332+
}
333+
},
334+
`
335+
A BETWEEN '2019-11-15' AND '2019-11-30'
336+
`
337+
],
338+
339+
[
340+
{
341+
field: 'A',
342+
value: [ new Date(2019, 10, 15), new Date(2019, 10, 30) ]
343+
},
344+
`
345+
A BETWEEN '2019-11-15' AND '2019-11-30'
346+
`
347+
],
348+
[
349+
{
350+
field: 'A',
351+
start: new Date(2019, 10, 15),
352+
end: new Date(2019, 10, 30),
353+
format: 'MM-yyyy-dd',
354+
},
355+
`
356+
A BETWEEN '11-2019-15' AND '11-2019-30'
357+
`
358+
],
359+
[
360+
{
361+
field: 'A',
362+
format: 'MM-yyyy-dd',
363+
value: {
364+
start: new Date(2019, 10, 15),
365+
end: new Date(2019, 10, 30),
366+
}
367+
},
368+
`
369+
A BETWEEN '11-2019-15' AND '11-2019-30'
370+
`
371+
],
372+
373+
[
374+
{
375+
field: 'A',
376+
format: 'MM-yyyy-dd',
377+
value: [ new Date(2019, 10, 15), new Date(2019, 10, 30) ]
378+
},
379+
`
380+
A BETWEEN '11-2019-15' AND '11-2019-30'
381+
`
382+
],
383+
])('Testing DateBetween operator', (received, expected) => {
384+
expect(buildWhereClause.dateBetween(received)).toBeSimilarWith(expected);
385+
});
299386
});

src/test/functionAliasMap.test.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ describe('testing functionAliasMap module', () => {
66
equal: [ 'in', 'eq', 'is', 'equal', '=' ],
77
notequal: [ 'notin', 'noteq', 'notis', 'notequal', '!=', '<>' ],
88
between: [ 'range', 'between' ],
9+
dateBetween: ['dateRange', 'dateBetween'],
910
notbetween: [ 'notrange', 'notbetween' ],
1011
like: ['like'],
1112
notlike: ['notlike'],

0 commit comments

Comments
 (0)