Skip to content

Commit f1109f1

Browse files
committed
move initialization to top in baseQuery
1 parent 6f1b1f0 commit f1109f1

File tree

1 file changed

+110
-110
lines changed

1 file changed

+110
-110
lines changed

packages/cubejs-schema-compiler/src/adapter/BaseQuery.js

Lines changed: 110 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)