@@ -154,99 +154,6 @@ export class BaseQuery {
154154 this . initFromOptions ( ) ;
155155 }
156156
157- extractDimensionsAndMeasures ( filters = [ ] ) {
158- if ( ! filters ) {
159- return [ ] ;
160- }
161- let allFilters = [ ] ;
162- filters . forEach ( f => {
163- if ( f . and ) {
164- allFilters = allFilters . concat ( this . extractDimensionsAndMeasures ( f . and ) ) ;
165- } else if ( f . or ) {
166- allFilters = allFilters . concat ( this . extractDimensionsAndMeasures ( f . or ) ) ;
167- } else if ( ! f . member && ! f . dimension ) {
168- throw new UserError ( `member attribute is required for filter ${ JSON . stringify ( f ) } ` ) ;
169- } else if ( this . cubeEvaluator . isMeasure ( f . member || f . dimension ) ) {
170- allFilters . push ( { measure : f . member || f . dimension } ) ;
171- } else {
172- allFilters . push ( { dimension : f . member || f . dimension } ) ;
173- }
174- } ) ;
175-
176- return allFilters ;
177- }
178-
179- keepFilters ( filters = [ ] , fn ) {
180- return filters . map ( f => {
181- if ( f . and ) {
182- return { and : this . keepFilters ( f . and , fn ) } ;
183- } else if ( f . or ) {
184- return { or : this . keepFilters ( f . or , fn ) } ;
185- } else if ( ! f . member && ! f . dimension ) {
186- throw new UserError ( `member attribute is required for filter ${ JSON . stringify ( f ) } ` ) ;
187- } else {
188- return fn ( f . member || f . dimension || f . measure ) ? f : null ;
189- }
190- } ) . filter ( f => ! ! f ) ;
191- }
192-
193- extractFiltersAsTree ( filters = [ ] ) {
194- if ( ! filters ) {
195- return [ ] ;
196- }
197-
198- return filters . map ( f => {
199- if ( f . and || f . or ) {
200- let operator = 'or' ;
201- if ( f . and ) {
202- operator = 'and' ;
203- }
204- const data = this . extractDimensionsAndMeasures ( f [ operator ] ) ;
205- const dimension = data . filter ( e => ! ! e . dimension ) . map ( e => e . dimension ) ;
206- const measure = data . filter ( e => ! ! e . measure ) . map ( e => e . measure ) ;
207- if ( dimension . length && ! measure . length ) {
208- return {
209- values : this . extractFiltersAsTree ( f [ operator ] ) ,
210- operator,
211- dimensionGroup : true ,
212- measure : null ,
213- } ;
214- }
215- if ( ! dimension . length && measure . length ) {
216- return {
217- values : this . extractFiltersAsTree ( f [ operator ] ) ,
218- operator,
219- dimension : null ,
220- measureGroup : true ,
221- } ;
222- }
223- if ( ! dimension . length && ! measure . length ) {
224- return {
225- values : [ ] ,
226- operator,
227- } ;
228- }
229- throw new UserError ( `You cannot use dimension and measure in same condition: ${ JSON . stringify ( f ) } ` ) ;
230- }
231-
232- if ( ! f . member && ! f . dimension ) {
233- throw new UserError ( `member attribute is required for filter ${ JSON . stringify ( f ) } ` ) ;
234- }
235-
236- if ( this . cubeEvaluator . isMeasure ( f . member || f . dimension ) ) {
237- return Object . assign ( { } , f , {
238- dimension : null ,
239- measure : f . member || f . dimension
240- } ) ;
241- }
242-
243- return Object . assign ( { } , f , {
244- measure : null ,
245- dimension : f . member || f . dimension
246- } ) ;
247- } ) ;
248- }
249-
250157 /**
251158 * @protected
252159 */
@@ -355,6 +262,116 @@ export class BaseQuery {
355262 this . initUngrouped ( ) ;
356263 }
357264
265+ initUngrouped ( ) {
266+ this . ungrouped = this . options . ungrouped ;
267+ if ( this . ungrouped ) {
268+ if ( ! this . options . allowUngroupedWithoutPrimaryKey && this . join ) {
269+ const cubes = R . uniq ( [ this . join . root ] . concat ( this . join . joins . map ( j => j . originalTo ) ) ) ;
270+ const primaryKeyNames = cubes . flatMap ( c => this . primaryKeyNames ( c ) ) ;
271+ const missingPrimaryKeys = primaryKeyNames . filter ( key => ! this . dimensions . find ( d => d . dimension === key ) ) ;
272+ if ( missingPrimaryKeys . length ) {
273+ throw new UserError ( `Ungrouped query requires primary keys to be present in dimensions: ${ missingPrimaryKeys . map ( k => `'${ k } '` ) . join ( ', ' ) } . Pass allowUngroupedWithoutPrimaryKey option to disable this check.` ) ;
274+ }
275+ }
276+ if ( this . measureFilters . length ) {
277+ throw new UserError ( 'Measure filters aren\'t allowed in ungrouped query' ) ;
278+ }
279+ }
280+ }
281+
282+ extractDimensionsAndMeasures ( filters = [ ] ) {
283+ if ( ! filters ) {
284+ return [ ] ;
285+ }
286+ let allFilters = [ ] ;
287+ filters . forEach ( f => {
288+ if ( f . and ) {
289+ allFilters = allFilters . concat ( this . extractDimensionsAndMeasures ( f . and ) ) ;
290+ } else if ( f . or ) {
291+ allFilters = allFilters . concat ( this . extractDimensionsAndMeasures ( f . or ) ) ;
292+ } else if ( ! f . member && ! f . dimension ) {
293+ throw new UserError ( `member attribute is required for filter ${ JSON . stringify ( f ) } ` ) ;
294+ } else if ( this . cubeEvaluator . isMeasure ( f . member || f . dimension ) ) {
295+ allFilters . push ( { measure : f . member || f . dimension } ) ;
296+ } else {
297+ allFilters . push ( { dimension : f . member || f . dimension } ) ;
298+ }
299+ } ) ;
300+
301+ return allFilters ;
302+ }
303+
304+ keepFilters ( filters = [ ] , fn ) {
305+ return filters . map ( f => {
306+ if ( f . and ) {
307+ return { and : this . keepFilters ( f . and , fn ) } ;
308+ } else if ( f . or ) {
309+ return { or : this . keepFilters ( f . or , fn ) } ;
310+ } else if ( ! f . member && ! f . dimension ) {
311+ throw new UserError ( `member attribute is required for filter ${ JSON . stringify ( f ) } ` ) ;
312+ } else {
313+ return fn ( f . member || f . dimension || f . measure ) ? f : null ;
314+ }
315+ } ) . filter ( f => ! ! f ) ;
316+ }
317+
318+ extractFiltersAsTree ( filters = [ ] ) {
319+ if ( ! filters ) {
320+ return [ ] ;
321+ }
322+
323+ return filters . map ( f => {
324+ if ( f . and || f . or ) {
325+ let operator = 'or' ;
326+ if ( f . and ) {
327+ operator = 'and' ;
328+ }
329+ const data = this . extractDimensionsAndMeasures ( f [ operator ] ) ;
330+ const dimension = data . filter ( e => ! ! e . dimension ) . map ( e => e . dimension ) ;
331+ const measure = data . filter ( e => ! ! e . measure ) . map ( e => e . measure ) ;
332+ if ( dimension . length && ! measure . length ) {
333+ return {
334+ values : this . extractFiltersAsTree ( f [ operator ] ) ,
335+ operator,
336+ dimensionGroup : true ,
337+ measure : null ,
338+ } ;
339+ }
340+ if ( ! dimension . length && measure . length ) {
341+ return {
342+ values : this . extractFiltersAsTree ( f [ operator ] ) ,
343+ operator,
344+ dimension : null ,
345+ measureGroup : true ,
346+ } ;
347+ }
348+ if ( ! dimension . length && ! measure . length ) {
349+ return {
350+ values : [ ] ,
351+ operator,
352+ } ;
353+ }
354+ throw new UserError ( `You cannot use dimension and measure in same condition: ${ JSON . stringify ( f ) } ` ) ;
355+ }
356+
357+ if ( ! f . member && ! f . dimension ) {
358+ throw new UserError ( `member attribute is required for filter ${ JSON . stringify ( f ) } ` ) ;
359+ }
360+
361+ if ( this . cubeEvaluator . isMeasure ( f . member || f . dimension ) ) {
362+ return Object . assign ( { } , f , {
363+ dimension : null ,
364+ measure : f . member || f . dimension
365+ } ) ;
366+ }
367+
368+ return Object . assign ( { } , f , {
369+ measure : null ,
370+ dimension : f . member || f . dimension
371+ } ) ;
372+ } ) ;
373+ }
374+
358375 // Temporary workaround to avoid checking for multistage in CubeStoreQuery, since that could lead to errors when HLL functions are present in the query.
359376 neverUseSqlPlannerPreaggregation ( ) {
360377 return false ;
@@ -525,23 +542,6 @@ export class BaseQuery {
525542 ) ;
526543 }
527544
528- initUngrouped ( ) {
529- this . ungrouped = this . options . ungrouped ;
530- if ( this . ungrouped ) {
531- if ( ! this . options . allowUngroupedWithoutPrimaryKey && this . join ) {
532- const cubes = R . uniq ( [ this . join . root ] . concat ( this . join . joins . map ( j => j . originalTo ) ) ) ;
533- const primaryKeyNames = cubes . flatMap ( c => this . primaryKeyNames ( c ) ) ;
534- const missingPrimaryKeys = primaryKeyNames . filter ( key => ! this . dimensions . find ( d => d . dimension === key ) ) ;
535- if ( missingPrimaryKeys . length ) {
536- throw new UserError ( `Ungrouped query requires primary keys to be present in dimensions: ${ missingPrimaryKeys . map ( k => `'${ k } '` ) . join ( ', ' ) } . Pass allowUngroupedWithoutPrimaryKey option to disable this check.` ) ;
537- }
538- }
539- if ( this . measureFilters . length ) {
540- throw new UserError ( 'Measure filters aren\'t allowed in ungrouped query' ) ;
541- }
542- }
543- }
544-
545545 get subQueryDimensions ( ) {
546546 // eslint-disable-next-line no-underscore-dangle
547547 if ( ! this . _subQueryDimensions ) {
0 commit comments