Skip to content

Commit ac57b4c

Browse files
committed
fix: Invalid query format: \"filters[0]\" does not match any of the allowed types if queryRewrite is using non string values
1 parent 328bb79 commit ac57b4c

File tree

2 files changed

+51
-5
lines changed

2 files changed

+51
-5
lines changed

packages/cubejs-api-gateway/src/query.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ const oneFilter = Joi.object().keys({
7070
dimension: id,
7171
member: id,
7272
operator: Joi.valid(...operators).required(),
73-
values: Joi.array().items(Joi.string().allow('', null), Joi.link('...'))
73+
values: Joi.array().items(Joi.string().allow('', null), Joi.link('...'), Joi.number(), Joi.boolean())
7474
}).xor('dimension', 'member');
7575

7676
const oneCondition = Joi.object().keys({
@@ -200,18 +200,19 @@ const normalizeQuery = (query, persistent) => {
200200
order: normalizeQueryOrder(query.order),
201201
filters: (query.filters || []).map(f => {
202202
const { dimension, member, ...filter } = f;
203-
const normalizedFlter = {
203+
const normalizedFilter = {
204204
...filter,
205-
member: member || dimension
205+
member: member || dimension,
206+
values: filter.values?.map(v => (v != null ? v.toString() : v))
206207
};
207208

208-
Object.defineProperty(normalizedFlter, 'dimension', {
209+
Object.defineProperty(normalizedFilter, 'dimension', {
209210
get() {
210211
console.warn('Warning: Attribute `filter.dimension` is deprecated. Please use \'member\' instead of \'dimension\'.');
211212
return this.member;
212213
}
213214
});
214-
return normalizedFlter;
215+
return normalizedFilter;
215216
}),
216217
dimensions: (query.dimensions || []).filter(d => d.split('.').length !== 3),
217218
timeDimensions: (query.timeDimensions || []).map(td => {

packages/cubejs-api-gateway/test/index.test.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,51 @@ describe('API Gateway', () => {
284284
);
285285
});
286286

287+
test('normalize filter number values', async () => {
288+
const { app } = createApiGateway();
289+
290+
const query = {
291+
measures: ['Foo.bar'],
292+
filters: [{
293+
member: 'Foo.bar',
294+
operator: 'gte',
295+
values: [10.5]
296+
}, {
297+
member: 'Foo.bar',
298+
operator: 'gte',
299+
values: [0]
300+
}]
301+
};
302+
303+
return requestBothGetAndPost(
304+
app,
305+
{ url: '/cubejs-api/v1/dry-run', query: { query: JSON.stringify(query) }, body: { query } },
306+
(res) => {
307+
expect(res.body.normalizedQueries).toStrictEqual([
308+
{
309+
measures: ['Foo.bar'],
310+
timezone: 'UTC',
311+
order: [],
312+
filters: [{
313+
member: 'Foo.bar',
314+
operator: 'gte',
315+
values: ['10.5']
316+
}, {
317+
member: 'Foo.bar',
318+
operator: 'gte',
319+
values: ['0']
320+
}],
321+
rowLimit: 10000,
322+
limit: 10000,
323+
dimensions: [],
324+
timeDimensions: [],
325+
queryType: 'regularQuery'
326+
}
327+
]);
328+
}
329+
);
330+
});
331+
287332
test('normalize queryRewrite limit', async () => {
288333
const { app } = createApiGateway(
289334
new AdapterApiMock(),

0 commit comments

Comments
 (0)