Skip to content

Commit 197b5eb

Browse files
ujaval403Pranjal Bhagat
andauthored
Used table schema check ujaval (#162)
* if measure is * select all the tables in joinPath * getusedtable schema corrected * made tableschema handling in another variable * fix: only check for used table schemas * fix: tests * update packages * fix: handle measure * and remove join scenarios * fix: remove join path scenario --------- Co-authored-by: Pranjal Bhagat <[email protected]>
1 parent b737b47 commit 197b5eb

File tree

12 files changed

+1731
-45
lines changed

12 files changed

+1731
-45
lines changed

meerkat-browser/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@devrev/meerkat-browser",
3-
"version": "0.0.103",
3+
"version": "0.0.104",
44
"dependencies": {
55
"tslib": "^2.3.0",
66
"@devrev/meerkat-core": "*",

meerkat-core/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@devrev/meerkat-core",
3-
"version": "0.0.103",
3+
"version": "0.0.104",
44
"dependencies": {
55
"tslib": "^2.3.0"
66
},

meerkat-core/src/filter-params/filter-params-ast.spec.ts

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1+
import { MeerkatQueryFilter } from '../types/cube-types';
12
import {
23
applyFilterParamsToBaseSQL,
34
detectAllFilterParamsFromSQL,
45
getFilterByMemberKey,
6+
traverseMeerkatQueryFilter,
57
} from './filter-params-ast';
6-
78
describe('getFilterByMemberKey', () => {
89
it('should return an empty array when filters are undefined', () => {
910
const result = getFilterByMemberKey(undefined, 'memberKey');
@@ -178,3 +179,50 @@ describe('applyFilterParamsToBaseSQL function', () => {
178179
expect(applyFilterParamsToBaseSQL(baseSQL, filterParamsSQL)).toBe(expected);
179180
});
180181
});
182+
183+
describe('traverseMeerkatQueryFilter function', () => {
184+
it('should traverse the MeerkatQueryFilter JSON and call the callback for each leaf type', () => {
185+
const filters: MeerkatQueryFilter[] = [
186+
{ member: 'memberKey', operator: 'equals', values: ['value1'] },
187+
{ member: 'differentMember', operator: 'equals', values: ['value1'] },
188+
{
189+
and: [
190+
{ member: 'memberKey', operator: 'equals', values: ['value1'] },
191+
{ member: 'differentMember', operator: 'equals', values: ['value1'] },
192+
],
193+
},
194+
{ or: [{ member: 'memberKey', operator: 'equals', values: ['value1'] }] },
195+
];
196+
197+
const callbackFn = jest.fn();
198+
199+
traverseMeerkatQueryFilter(filters as MeerkatQueryFilter[], callbackFn);
200+
201+
expect(callbackFn).toHaveBeenCalledTimes(5);
202+
expect(callbackFn).toHaveBeenCalledWith({
203+
member: 'memberKey',
204+
operator: 'equals',
205+
values: ['value1'],
206+
});
207+
expect(callbackFn).toHaveBeenCalledWith({
208+
member: 'differentMember',
209+
operator: 'equals',
210+
values: ['value1'],
211+
});
212+
expect(callbackFn).toHaveBeenCalledWith({
213+
member: 'memberKey',
214+
operator: 'equals',
215+
values: ['value1'],
216+
});
217+
expect(callbackFn).toHaveBeenCalledWith({
218+
member: 'differentMember',
219+
operator: 'equals',
220+
values: ['value1'],
221+
});
222+
expect(callbackFn).toHaveBeenCalledWith({
223+
member: 'memberKey',
224+
operator: 'equals',
225+
values: ['value1'],
226+
});
227+
});
228+
});

meerkat-core/src/filter-params/filter-params-ast.ts

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,39 @@ import {
66
MeerkatQueryFilter,
77
Query,
88
QueryFilter,
9-
TableSchema
9+
TableSchema,
1010
} from '../types/cube-types';
1111
import { SelectStatement } from '../types/duckdb-serialization-types/serialization/Statement';
1212

13+
/*
14+
** This function traverse the MeerkatQueryFilter JSON, and calls the callback for each leaf type.
15+
** This way we need no rewrite the traversal logic again and again.
16+
*/
17+
export const traverseMeerkatQueryFilter = (
18+
filters: MeerkatQueryFilter[],
19+
callback: (value: QueryFilter) => void
20+
) => {
21+
filters.forEach((filter: MeerkatQueryFilter) => {
22+
if ('member' in filter) {
23+
callback(filter);
24+
return;
25+
}
26+
if ('and' in filter) {
27+
filter.and.forEach((subFilter: MeerkatQueryFilter) =>
28+
traverseMeerkatQueryFilter([subFilter], callback)
29+
);
30+
}
31+
if ('or' in filter) {
32+
filter.or.forEach((subFilter: MeerkatQueryFilter) =>
33+
traverseMeerkatQueryFilter([subFilter], callback)
34+
);
35+
}
36+
});
37+
};
38+
1339
/**
1440
* Get the query filter with only where filterKey matches
1541
*/
16-
1742
export const traverseAndFilter = (
1843
filter: MeerkatQueryFilter,
1944
callback: (value: QueryFilter) => boolean
@@ -42,14 +67,15 @@ export const traverseAndFilter = (
4267
return null;
4368
};
4469

45-
4670
export const getFilterByMemberKey = (
4771
filters: MeerkatQueryFilter[] | undefined,
4872
memberKey: string
4973
): MeerkatQueryFilter[] => {
5074
if (!filters) return [];
5175
return filters
52-
.map((filter) => traverseAndFilter(filter, (value) => value.member === memberKey))
76+
.map((filter) =>
77+
traverseAndFilter(filter, (value) => value.member === memberKey)
78+
)
5379
.filter(Boolean) as MeerkatQueryFilter[];
5480
};
5581

@@ -82,8 +108,6 @@ export const detectAllFilterParamsFromSQL = (
82108
return matches;
83109
};
84110

85-
86-
87111
export const getFilterParamsAST = (
88112
query: Query,
89113
tableSchema: TableSchema,
@@ -95,13 +119,13 @@ export const getFilterParamsAST = (
95119
}[] => {
96120
const filterParamKeys = detectAllFilterParamsFromSQL(tableSchema.sql);
97121
const filterParamsAST = [];
98-
122+
99123
for (const filterParamKey of filterParamKeys) {
100124
const filters = getFilterByMemberKey(
101125
query.filters,
102126
filterParamKey.memberKey
103127
);
104-
128+
105129
if (filters && filters.length > 0) {
106130
filterParamsAST.push({
107131
memberKey: filterParamKey.memberKey,
@@ -110,7 +134,7 @@ export const getFilterParamsAST = (
110134
{ filters, measures: [], dimensions: [] },
111135
tableSchema,
112136
{
113-
filterType
137+
filterType,
114138
}
115139
),
116140
});
@@ -124,9 +148,12 @@ type FilterParamsSQL = {
124148
memberKey: string;
125149
sql: string;
126150
matchKey: string;
127-
}
151+
};
128152

129-
const replaceWhereClauseWithFiltersParamsSQL = (baseSQL: string, filterParamsSQL: FilterParamsSQL[]) => {
153+
const replaceWhereClauseWithFiltersParamsSQL = (
154+
baseSQL: string,
155+
filterParamsSQL: FilterParamsSQL[]
156+
) => {
130157
let finalSQL = baseSQL;
131158

132159
for (const filterParam of filterParamsSQL) {
@@ -139,14 +166,17 @@ const replaceWhereClauseWithFiltersParamsSQL = (baseSQL: string, filterParamsSQL
139166
*/
140167
finalSQL = finalSQL.replace(filterParam.matchKey, whereClause);
141168
}
142-
return finalSQL
143-
}
169+
return finalSQL;
170+
};
144171

145172
export const applyFilterParamsToBaseSQL = (
146173
baseSQL: string,
147174
filterParamsSQL: FilterParamsSQL[]
148175
) => {
149-
let finalSQL = replaceWhereClauseWithFiltersParamsSQL(baseSQL, filterParamsSQL);
176+
let finalSQL = replaceWhereClauseWithFiltersParamsSQL(
177+
baseSQL,
178+
filterParamsSQL
179+
);
150180
for (const filterParam of filterParamsSQL) {
151181
/**
152182
* Get SQL expression after WHERE clause

0 commit comments

Comments
 (0)