Skip to content

Commit 29dc6b6

Browse files
authored
Merge pull request #270 from smartprocure/feature/range-from-fix
Fix date_range agg
2 parents 261e69a + de7eb65 commit 29dc6b6

File tree

3 files changed

+102
-25
lines changed

3 files changed

+102
-25
lines changed

.changeset/clean-wasps-protect.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'contexture-elasticsearch': patch
3+
---
4+
5+
date_range agg uses from/to

packages/provider-elasticsearch/src/example-types/filters/dateRangeFacet.js

Lines changed: 40 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,47 @@ import {
55
rollingRangeToDates,
66
} from 'contexture-util/dateUtil.js'
77

8-
let getDateRange = (range, timezone) => {
8+
const typeToFields = {
9+
range: {
10+
fromField: 'gte',
11+
toField: 'lte',
12+
},
13+
date_range: {
14+
fromField: 'from',
15+
toField: 'to',
16+
},
17+
}
18+
19+
let getDateRange = (range, timezone, type) => {
920
let { from, to } = rollingRangeToDates(range, timezone)
21+
let { fromField, toField } = typeToFields[type]
22+
1023
return F.compactObject({
11-
gte: getDateIfValid(from),
12-
lte: getDateIfValid(to),
24+
[fromField]: getDateIfValid(from),
25+
[toField]: getDateIfValid(to),
1326
})
1427
}
1528

16-
export default {
29+
const genAggsQuery = (field, format, ranges, timezone) => ({
30+
aggs: {
31+
range: {
32+
date_range: {
33+
field,
34+
format: format || 'date_optional_time',
35+
ranges: _.map(
36+
({ range, key }) => ({
37+
key,
38+
...getDateRange(range, timezone, 'date_range'),
39+
}),
40+
ranges
41+
),
42+
},
43+
},
44+
},
45+
size: 0,
46+
})
47+
48+
var dateRangeFacet_default = {
1749
hasValue: _.get('values.length'),
1850
/**
1951
* VALID CONTEXT
@@ -37,12 +69,11 @@ export default {
3769
range: {
3870
[field]: {
3971
format: 'date_optional_time',
40-
...getDateRange(range, timezone),
72+
...getDateRange(range, timezone, 'range'),
4173
},
4274
},
4375
}))
4476
)(ranges)
45-
4677
return { bool: { should } }
4778
},
4879
/**
@@ -56,24 +87,7 @@ export default {
5687
]
5788
*/
5889
async result({ field, format, timezone = 'UTC', ranges }, search) {
59-
let counts = await search({
60-
aggs: {
61-
range: {
62-
date_range: {
63-
field,
64-
format: format || 'date_optional_time',
65-
ranges: _.map(
66-
({ range, key }) => ({
67-
key,
68-
...getDateRange(range, timezone),
69-
}),
70-
ranges
71-
),
72-
},
73-
},
74-
},
75-
size: 0,
76-
})
90+
let counts = await search(genAggsQuery(field, format, ranges, timezone))
7791
return {
7892
options: _.flow(
7993
_.get('aggregations.range.buckets'),
@@ -85,3 +99,5 @@ export default {
8599
}
86100
},
87101
}
102+
103+
export { dateRangeFacet_default as default, genAggsQuery }

packages/provider-elasticsearch/src/example-types/filters/dateRangeFacet.test.js

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {
33
getDateIfValid,
44
rollingRangeToDates,
55
} from 'contexture-util/dateUtil.js'
6-
import dateRangeFacet from './dateRangeFacet.js'
6+
import dateRangeFacet, { genAggsQuery } from './dateRangeFacet.js'
77
import { expect, describe, it } from 'vitest'
88

99
let commonFilterParts = {
@@ -67,3 +67,59 @@ describe('dateRangeFacet/filter', () => {
6767
})
6868
})
6969
})
70+
71+
describe('genAggsQuery', () => {
72+
it('should generate correct aggregation query with default format', () => {
73+
const field = 'test_field'
74+
const ranges = [
75+
{ range: 'allFutureDates', key: 'future' },
76+
{ range: 'allPastDates', key: 'past' },
77+
]
78+
const timezone = 'UTC'
79+
80+
const result = genAggsQuery(field, undefined, ranges, timezone)
81+
82+
expect(result).toEqual({
83+
aggs: {
84+
range: {
85+
date_range: {
86+
field: 'test_field',
87+
format: 'date_optional_time',
88+
ranges: [
89+
{
90+
key: 'future',
91+
from: getDatePart('allFutureDates', 'from'),
92+
},
93+
{
94+
key: 'past',
95+
to: getDatePart('allPastDates', 'to'),
96+
},
97+
],
98+
},
99+
},
100+
},
101+
size: 0,
102+
})
103+
})
104+
105+
it('should handle empty ranges array', () => {
106+
const field = 'empty_field'
107+
const ranges = []
108+
const timezone = 'UTC'
109+
110+
const result = genAggsQuery(field, undefined, ranges, timezone)
111+
112+
expect(result).toEqual({
113+
aggs: {
114+
range: {
115+
date_range: {
116+
field: 'empty_field',
117+
format: 'date_optional_time',
118+
ranges: [],
119+
},
120+
},
121+
},
122+
size: 0,
123+
})
124+
})
125+
})

0 commit comments

Comments
 (0)