@@ -6,14 +6,39 @@ import {
66  MeerkatQueryFilter , 
77  Query , 
88  QueryFilter , 
9-   TableSchema 
9+   TableSchema , 
1010}  from  '../types/cube-types' ; 
1111import  {  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- 
1742export  const  traverseAndFilter  =  ( 
1843  filter : MeerkatQueryFilter , 
1944  callback : ( value : QueryFilter )  =>  boolean 
@@ -42,14 +67,15 @@ export const traverseAndFilter = (
4267  return  null ; 
4368} ; 
4469
45- 
4670export  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- 
87111export  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
145172export  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