Skip to content

Commit 24fed67

Browse files
authored
feat: add get column names from ast (#120)
* add: util * update: export * bump: pacakge
1 parent e541360 commit 24fed67

File tree

14 files changed

+306
-186
lines changed

14 files changed

+306
-186
lines changed

meerkat-browser/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@devrev/meerkat-browser",
3-
"version": "0.0.85",
3+
"version": "0.0.86",
44
"dependencies": {
55
"@swc/helpers": "~0.5.0",
66
"@devrev/meerkat-core": "*",

meerkat-core/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@devrev/meerkat-core",
3-
"version": "0.0.85",
3+
"version": "0.0.86",
44
"dependencies": {
55
"@swc/helpers": "~0.5.0"
66
},
+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
export { validateDimension } from './dimension-validator';
22
export { validateMeasure } from './measure-validator';
33
export * from './types';
4+
export { getSelectNode } from './utils';

meerkat-core/src/ast-validator/tests/test-data.ts

+29-6
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,14 @@ export const DIMENSION_TEST_CASES = [
3434
column_names: ['column_name'],
3535
},
3636
validFunctions: EMPTY_VALID_FUNCTIONS,
37+
columnNames: ['column_name'],
3738
expected: true,
3839
},
3940
{
4041
description: 'node type COLUMN_REF with alias',
4142
node: COLUMN_REF_NODE,
4243
validFunctions: EMPTY_VALID_FUNCTIONS,
44+
columnNames: ['column_name'],
4345
expected: true,
4446
},
4547
{
@@ -51,6 +53,7 @@ export const DIMENSION_TEST_CASES = [
5153
query_location: 0,
5254
value: '1',
5355
},
56+
columnNames: [],
5457
validFunctions: EMPTY_VALID_FUNCTIONS,
5558
expected: true,
5659
},
@@ -66,14 +69,15 @@ export const DIMENSION_TEST_CASES = [
6669
type: ExpressionType.COLUMN_REF,
6770
alias: '',
6871
query_location: 12,
69-
column_names: ['column_name'],
72+
column_names: ['column_name1'],
7073
},
7174
cast_type: {
7275
id: 1,
7376
},
7477
try_cast: false,
7578
},
7679
validFunctions: EMPTY_VALID_FUNCTIONS,
80+
columnNames: ['column_name1'],
7781
expected: true,
7882
},
7983
{
@@ -89,7 +93,7 @@ export const DIMENSION_TEST_CASES = [
8993
type: ExpressionType.COLUMN_REF,
9094
alias: '',
9195
query_location: 16,
92-
column_names: ['column_name'],
96+
column_names: ['column_name2'],
9397
},
9498
{
9599
class: ExpressionClass.CONSTANT,
@@ -108,11 +112,13 @@ export const DIMENSION_TEST_CASES = [
108112
],
109113
},
110114
validFunctions: EMPTY_VALID_FUNCTIONS,
115+
columnNames: ['column_name2'],
111116
expected: true,
112117
},
113118
{
114119
description:
115120
'node type FUNCTION with ROUND function and if it contains in validFunctions',
121+
columnNames: ['schema.column_name'],
116122
node: {
117123
class: ExpressionClass.FUNCTION,
118124
type: ExpressionType.FUNCTION,
@@ -126,7 +132,7 @@ export const DIMENSION_TEST_CASES = [
126132
type: ExpressionType.COLUMN_REF,
127133
alias: '',
128134
query_location: 13,
129-
column_names: ['column_name'],
135+
column_names: ['schema', 'column_name'],
130136
},
131137
{
132138
class: ExpressionClass.CONSTANT,
@@ -157,6 +163,7 @@ export const DIMENSION_TEST_CASES = [
157163
},
158164
{
159165
description: 'node type CASE',
166+
columnNames: ['actual_close_date1', 'actual_close_date', 'created_date'],
160167
node: {
161168
class: ExpressionClass.CASE,
162169
type: ExpressionType.CASE_EXPR,
@@ -189,7 +196,7 @@ export const DIMENSION_TEST_CASES = [
189196
type: ExpressionType.COLUMN_REF,
190197
alias: '',
191198
query_location: 55,
192-
column_names: ['actual_close_date'],
199+
column_names: ['actual_close_date1'],
193200
},
194201
},
195202
],
@@ -227,6 +234,7 @@ export const MEASURE_TEST_CASES = [
227234
},
228235
validFunctions: new Set(['count_star']),
229236
validScalarFunctions: EMPTY_VALID_FUNCTIONS,
237+
columnNames: [],
230238
expected: true,
231239
},
232240
{
@@ -258,6 +266,7 @@ export const MEASURE_TEST_CASES = [
258266
},
259267
validFunctions: new Set(['sum']),
260268
validScalarFunctions: EMPTY_VALID_FUNCTIONS,
269+
columnNames: ['column1'],
261270
expected: true,
262271
},
263272
{
@@ -291,9 +300,11 @@ export const MEASURE_TEST_CASES = [
291300
validScalarFunctions: new Set(['/']),
292301
error: 'Invalid function type: sum',
293302
expected: 'error',
303+
columnNames: ['column1'],
294304
},
295305
{
296306
description: 'node type FUNCTION with MAX and operator',
307+
columnNames: ['column1'],
297308
query: 'max(column1) / 1000',
298309
node: {
299310
class: ExpressionClass.FUNCTION,
@@ -361,6 +372,7 @@ export const MEASURE_TEST_CASES = [
361372
{
362373
description: 'node type CASE_EXPR',
363374
query: 'CASE WHEN COUNT(id) > 1 THEN AVG(mtbf_hours) ELSE null END',
375+
columnNames: ['mtbf_hours', 'id'],
364376
node: {
365377
class: ExpressionClass.CASE,
366378
type: ExpressionType.CASE_EXPR,
@@ -463,6 +475,7 @@ export const MEASURE_TEST_CASES = [
463475
{
464476
description:
465477
'node type FUNCTION with aggregation and case statement within',
478+
columnNames: ['modified_date', 'stage_json'],
466479
node: {
467480
class: ExpressionClass.FUNCTION,
468481
type: ExpressionType.FUNCTION,
@@ -581,6 +594,7 @@ export const MEASURE_TEST_CASES = [
581594
{
582595
description:
583596
'node type FUNCTION two children of aggregation and operator operation on them',
597+
columnNames: ['mean_reciprocal_rank', 'total_queries'],
584598
node: {
585599
class: ExpressionClass.FUNCTION,
586600
type: ExpressionType.FUNCTION,
@@ -687,6 +701,7 @@ export const MEASURE_TEST_CASES = [
687701
description: 'node type CAST',
688702
query:
689703
"CAST(COUNT(DISTINCT(id)) AS FLOAT) / NULLIF(DATEDIFF('day', MIN(created_date), MAX(created_date)) / 7 + 1, 0)",
704+
columnNames: ['id', 'created_date', 'created_date1'],
690705
node: {
691706
class: ExpressionClass.FUNCTION,
692707
type: ExpressionType.FUNCTION,
@@ -817,7 +832,7 @@ export const MEASURE_TEST_CASES = [
817832
type: ExpressionType.COLUMN_REF,
818833
alias: '',
819834
query_location: 90,
820-
column_names: ['created_date'],
835+
column_names: ['created_date1'],
821836
},
822837
],
823838
filter: null,
@@ -934,6 +949,7 @@ export const MEASURE_TEST_CASES = [
934949
{
935950
description: 'node type COALESCE',
936951
query: 'COALESCE(SUM(amount) FILTER(direction = "Income"), 0)',
952+
columnNames: ['amount'],
937953
node: {
938954
class: ExpressionClass.OPERATOR,
939955
type: ExpressionType.OPERATOR_COALESCE,
@@ -1009,6 +1025,7 @@ export const MEASURE_TEST_CASES = [
10091025
description: 'node type WINDOW_AGGREGATE',
10101026
query:
10111027
'AVG(COUNT(column1)) OVER (ORDER BY (MEERKAT).record_date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW)',
1028+
columnNames: ['column1'],
10121029
node: {
10131030
class: ExpressionClass.WINDOW,
10141031
type: ExpressionType.WINDOW_AGGREGATE,
@@ -1031,7 +1048,7 @@ export const MEASURE_TEST_CASES = [
10311048
type: ExpressionType.COLUMN_REF,
10321049
alias: '',
10331050
query_location: 17,
1034-
column_names: ['number_deployments'],
1051+
column_names: ['column1'],
10351052
},
10361053
],
10371054
filter: null,
@@ -1111,6 +1128,12 @@ export const MEASURE_TEST_CASES = [
11111128
},
11121129
{
11131130
description: 'node type SUBQUERY',
1131+
columnNames: [
1132+
'id',
1133+
'sla_stage',
1134+
'first_resp_time_arr',
1135+
'total_first_resp_breaches_ever',
1136+
],
11141137
query:
11151138
"(SELECT CASE WHEN COUNT(DISTINCT CASE WHEN sla_stage = ''breached'' THEN id END) + COUNT(DISTINCT CASE WHEN sla_stage = ''completed'' AND ARRAY_LENGTH(first_resp_time_arr) > 0 AND (total_first_resp_breaches_ever = 0 OR total_first_resp_breaches_ever IS NULL) THEN id END) > 0 THEN 100 - (COUNT(DISTINCT CASE WHEN sla_stage = ''breached'' THEN id END) * 100.0 / (COUNT(DISTINCT CASE WHEN sla_stage = ''breached'' THEN id END) + COUNT(DISTINCT CASE WHEN sla_stage = ''completed'' AND ARRAY_LENGTH(first_resp_time_arr) > 0 AND (total_first_resp_breaches_ever = 0 OR total_first_resp_breaches_ever IS NULL) THEN id END))) ELSE NULL END AS result)",
11161139
node: {

meerkat-core/src/cube-filter-transformer/base-condition-builder/base-condition-builder.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
} from '../../types/duckdb-serialization-types/index';
99
import { CUBE_TYPE_TO_DUCKDB_TYPE } from '../../utils/cube-type-to-duckdb-type';
1010
import { convertFloatToInt, getTypeInfo } from '../../utils/get-type-info';
11+
import { COLUMN_NAME_DELIMITER } from '../constant';
1112

1213
export const baseDuckdbCondition = (
1314
columnName: string,
@@ -23,7 +24,7 @@ export const baseDuckdbCondition = (
2324
class: ExpressionClass.COLUMN_REF,
2425
type: ExpressionType.COLUMN_REF,
2526
alias: '',
26-
column_names: columnName.split('.'),
27+
column_names: columnName.split(COLUMN_NAME_DELIMITER),
2728
},
2829
right: {
2930
class: ExpressionClass.CONSTANT,
@@ -64,7 +65,7 @@ export const baseArrayDuckdbCondition = (
6465
class: ExpressionClass.COLUMN_REF,
6566
type: ExpressionType.COLUMN_REF,
6667
alias: '',
67-
column_names: columnName.split('.'),
68+
column_names: columnName.split(COLUMN_NAME_DELIMITER),
6869
},
6970
],
7071
filter: null,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const COLUMN_NAME_DELIMITER = '.';

meerkat-core/src/cube-filter-transformer/contains/contains.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
ExpressionType,
77
} from '../../types/duckdb-serialization-types/serialization/Expression';
88
import { valueBuilder } from '../base-condition-builder/base-condition-builder';
9+
import { COLUMN_NAME_DELIMITER } from '../constant';
910
import { CubeToParseExpressionTransform } from '../factory';
1011
import { orDuckdbCondition } from '../or/or';
1112

@@ -31,7 +32,7 @@ export const containsDuckdbCondition = (
3132
class: 'COLUMN_REF',
3233
type: 'COLUMN_REF',
3334
alias: '',
34-
column_names: columnName.split('.'),
35+
column_names: columnName.split(COLUMN_NAME_DELIMITER),
3536
},
3637
{
3738
class: 'CONSTANT',

0 commit comments

Comments
 (0)