16
16
* specific language governing permissions and limitations
17
17
* under the License.
18
18
*/
19
- import { buildQueryContext , QueryFormData } from '@superset-ui/core' ;
19
+ import {
20
+ AdhocFilter ,
21
+ buildQueryContext ,
22
+ QueryFormData ,
23
+ } from '@superset-ui/core' ;
20
24
import moment , { Moment } from 'moment' ;
21
25
22
26
/**
@@ -42,25 +46,25 @@ function getSinceUntil(
42
46
relativeEnd : string | null = null ,
43
47
) : MomentTuple {
44
48
const separator = ' : ' ;
45
- const _relativeStart = relativeStart || " today" ;
46
- const _relativeEnd = relativeEnd || " today" ;
49
+ const effectiveRelativeStart = relativeStart || ' today' ;
50
+ const effectiveRelativeEnd = relativeEnd || ' today' ;
47
51
48
52
if ( ! timeRange ) {
49
53
return [ null , null ] ;
50
54
}
51
55
52
56
let modTimeRange : string | null = timeRange ;
53
57
54
- if ( timeRange === 'NO_TIME_RANGE' || timeRange === '_(NO_TIME_RANGE)' ) {
58
+ if ( timeRange === 'NO_TIME_RANGE' || timeRange === '_(NO_TIME_RANGE)' ) {
55
59
return [ null , null ] ;
56
60
}
57
61
58
62
if ( timeRange ?. startsWith ( 'last' ) && ! timeRange . includes ( separator ) ) {
59
- modTimeRange = timeRange + separator + _relativeEnd ;
63
+ modTimeRange = timeRange + separator + effectiveRelativeEnd ;
60
64
}
61
65
62
66
if ( timeRange ?. startsWith ( 'next' ) && ! timeRange . includes ( separator ) ) {
63
- modTimeRange = _relativeStart + separator + timeRange ;
67
+ modTimeRange = effectiveRelativeStart + separator + timeRange ;
64
68
}
65
69
66
70
if (
@@ -179,12 +183,15 @@ function getSinceUntil(
179
183
return [ _since , _until ] ;
180
184
}
181
185
182
- function calculatePrev ( startDate : Moment | null , endDate : Moment | null , calcType : String ) {
183
-
184
- if ( ! startDate || ! endDate ) {
185
- return [ null , null ]
186
+ function calculatePrev (
187
+ startDate : Moment | null ,
188
+ endDate : Moment | null ,
189
+ calcType : String ,
190
+ ) {
191
+ if ( ! startDate || ! endDate ) {
192
+ return [ null , null ] ;
186
193
}
187
-
194
+
188
195
const daysBetween = endDate . diff ( startDate , 'days' ) ;
189
196
190
197
let startDatePrev = moment ( ) ;
@@ -219,53 +226,63 @@ export default function buildQuery(formData: QueryFormData) {
219
226
} ,
220
227
] ) ;
221
228
229
+ const timeFilterIndex : number =
230
+ formData . adhoc_filters ?. findIndex (
231
+ filter => 'operator' in filter && filter . operator === 'TEMPORAL_RANGE' ,
232
+ ) ?? - 1 ;
222
233
223
- const timeFilter : any = formData . adhoc_filters ?. find (
224
- ( { operator } : { operator : string } ) => operator === 'TEMPORAL_RANGE' ,
225
- ) ;
234
+ const timeFilter : AdhocFilter | null =
235
+ timeFilterIndex !== - 1 && formData . adhoc_filters
236
+ ? formData . adhoc_filters [ timeFilterIndex ]
237
+ : null ;
226
238
227
- const timeFilterIndex : any = formData . adhoc_filters ?. findIndex (
228
- ( { operator } : { operator : string } ) => operator === 'TEMPORAL_RANGE' ,
229
- ) ;
239
+ let testSince = null ;
240
+ let testUntil = null ;
230
241
231
- const [ testSince , testUntil ] = getSinceUntil (
232
- timeFilter . comparator . toLowerCase ( ) ,
233
- ) ;
234
-
235
- let formDataB : QueryFormData ;
242
+ if (
243
+ timeFilter &&
244
+ 'comparator' in timeFilter &&
245
+ typeof timeFilter . comparator === 'string'
246
+ ) {
247
+ [ testSince , testUntil ] = getSinceUntil (
248
+ timeFilter . comparator . toLocaleLowerCase ( ) ,
249
+ ) ;
250
+ }
236
251
237
- if ( timeComparison != 'c' ) {
252
+ let formDataB : QueryFormData ;
238
253
239
- const [ prevStartDateMoment , prevEndDateMoment ] = calculatePrev (
240
- testSince ,
241
- testUntil ,
242
- timeComparison ,
243
- ) ;
254
+ if ( timeComparison !== 'c' ) {
255
+ const [ prevStartDateMoment , prevEndDateMoment ] = calculatePrev (
256
+ testSince ,
257
+ testUntil ,
258
+ timeComparison ,
259
+ ) ;
244
260
245
261
const queryBComparator = `${ prevStartDateMoment ?. format (
246
- 'YYYY-MM-DDTHH:mm:ss' ,
247
- ) } : ${ prevEndDateMoment ?. format ( 'YYYY-MM-DDTHH:mm:ss' ) } `;
262
+ 'YYYY-MM-DDTHH:mm:ss' ,
263
+ ) } : ${ prevEndDateMoment ?. format ( 'YYYY-MM-DDTHH:mm:ss' ) } `;
248
264
249
- const queryBFilter = {
265
+ const queryBFilter : any = {
250
266
...timeFilter ,
251
- comparator : queryBComparator . replace ( / Z / g, '' )
252
- }
267
+ comparator : queryBComparator . replace ( / Z / g, '' ) ,
268
+ } ;
253
269
254
- const otherFilters = formData . adhoc_filters ?. filter ( ( _value : any , index : number ) => timeFilterIndex !== index ) ;
255
- const queryBFilters = otherFilters ? [ queryBFilter , ...otherFilters ] : [ queryBFilter ] ;
256
-
257
- formDataB = {
270
+ const otherFilters = formData . adhoc_filters ?. filter (
271
+ ( _value : any , index : number ) => timeFilterIndex !== index ,
272
+ ) ;
273
+ const queryBFilters = otherFilters
274
+ ? [ queryBFilter , ...otherFilters ]
275
+ : [ queryBFilter ] ;
276
+
277
+ formDataB = {
258
278
...formData ,
259
279
adhoc_filters : queryBFilters ,
260
- }
261
-
280
+ } ;
262
281
} else {
263
-
264
- formDataB = {
282
+ formDataB = {
265
283
...formData ,
266
284
adhoc_filters : formData . adhoc_custom ,
267
- }
268
-
285
+ } ;
269
286
}
270
287
271
288
const queryContextB = buildQueryContext ( formDataB , baseQueryObject => [
@@ -275,7 +292,6 @@ export default function buildQuery(formData: QueryFormData) {
275
292
} ,
276
293
] ) ;
277
294
278
-
279
295
return {
280
296
...queryContextA ,
281
297
queries : [ ...queryContextA . queries , ...queryContextB . queries ] ,
0 commit comments