Skip to content

Commit 07943ba

Browse files
authored
feat: Add dimension SQL support (#16)
* Add group by SQL support * Bump version and fix * Fix typeo
1 parent 32c8779 commit 07943ba

File tree

7 files changed

+54
-11
lines changed

7 files changed

+54
-11
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.55",
3+
"version": "0.0.56",
44
"dependencies": {
55
"@swc/helpers": "~0.5.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.55",
3+
"version": "0.0.56",
44
"dependencies": {
55
"@swc/helpers": "~0.5.0"
66
},

meerkat-core/src/cube-group-by-transformer/cube-group-by-transformer.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
import { Member } from '../types/cube-types/query';
2-
import { ExpressionClass, ExpressionType } from '../types/duckdb-serialization-types/serialization/Expression';
2+
import {
3+
ExpressionClass,
4+
ExpressionType,
5+
} from '../types/duckdb-serialization-types/serialization/Expression';
6+
import { memberKeyToSafeKey } from '../utils/member-key-to-safe-key';
37

48
export const cubeDimensionToGroupByAST = (dimensions: Member[]) => {
59
const groupByAST = dimensions.map((dimension) => {
610
const dimensionAST = {
711
class: ExpressionClass.COLUMN_REF,
812
type: ExpressionType.COLUMN_REF,
913
alias: '',
10-
column_names: dimension.split('.'),
14+
column_names: [memberKeyToSafeKey(dimension)],
1115
};
1216

1317
return dimensionAST;

meerkat-core/src/cube-measure-transformer/cube-measure-transformer.spec.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,14 @@ describe('cubeMeasureToSQLSelectString', () => {
1717
{ name: 'measure1', sql: 'COUNT(*)', type: 'number' },
1818
{ name: 'measure2', sql: 'SUM(total)', type: 'number' },
1919
],
20-
dimensions: [],
20+
dimensions: [
21+
{ name: 'dimension1', sql: 'dimension1', type: 'number' },
22+
{
23+
name: 'dimension2',
24+
sql: `DATE_TRUNC('month', order_date)`,
25+
type: 'number',
26+
},
27+
],
2128
};
2229
});
2330

@@ -78,7 +85,7 @@ describe('cubeMeasureToSQLSelectString', () => {
7885
sqlToReplace
7986
);
8087
expect(result).toBe(
81-
'SELECT (COUNT(*)) AS temp__measure1 , (SUM(total)) AS temp__measure2 , temp.dimension1 AS temp__dimension1, temp.dimension2 AS temp__dimension2 FROM (SELECT * FROM TABLE_1)'
88+
`SELECT (COUNT(*)) AS temp__measure1 , (SUM(total)) AS temp__measure2 , (dimension1) AS temp__dimension1, (DATE_TRUNC('month', order_date)) AS temp__dimension2 FROM (SELECT * FROM TABLE_1)`
8289
);
8390
});
8491
});

meerkat-core/src/cube-measure-transformer/cube-measure-transformer.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,18 +31,28 @@ export const cubeMeasureToSQLSelectString = (
3131

3232
const addDimensionToSQLProjection = (
3333
dimensions: Member[],
34-
selectString: string
34+
selectString: string,
35+
tableSchema: TableSchema
3536
) => {
3637
if (dimensions.length === 0) {
3738
return selectString;
3839
}
3940
let newSelectString = selectString;
4041
for (let i = 0; i < dimensions.length; i++) {
4142
const dimension = dimensions[i];
43+
const dimensionKeyWithoutTable = dimension.split('.')[1];
44+
const dimensionSchema = tableSchema.dimensions.find(
45+
(m) => m.name === dimensionKeyWithoutTable
46+
);
47+
const aliasKey = memberKeyToSafeKey(dimension);
48+
49+
if (!dimensionSchema) {
50+
continue;
51+
}
4252
if (i > 0) {
4353
newSelectString += ',';
4454
}
45-
newSelectString += ` ${dimension} AS ${dimension.replace('.', '__')}`;
55+
newSelectString += ` (${dimensionSchema.sql}) AS ${aliasKey}`;
4656
}
4757
return newSelectString;
4858
};
@@ -67,7 +77,8 @@ export const applyProjectionToSQLQuery = (
6777
}
6878
const selectString = addDimensionToSQLProjection(
6979
dimensions,
70-
measureSelectString
80+
measureSelectString,
81+
tableSchema
7182
);
7283

7384
const selectRegex = /SELECT\s\*/;

meerkat-node/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-node",
3-
"version": "0.0.55",
3+
"version": "0.0.56",
44
"dependencies": {
55
"@swc/helpers": "~0.5.0",
66
"@devrev/meerkat-core": "*",

meerkat-node/src/__tests__/test-data.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,34 @@ export const TABLE_SCHEMA = {
5959
sql: 'product_id',
6060
type: 'string',
6161
},
62+
{
63+
name: 'order_month',
64+
sql: `DATE_TRUNC('month', order_date)`,
65+
type: 'string',
66+
},
6267
],
6368
};
6469

6570
export const TEST_DATA = [
71+
{
72+
testName: 'GroupBySQLInnerQuery',
73+
expectedSQL: `SELECT (SUM(order_amount)) AS orders__total_order_amount , (DATE_TRUNC('month', order_date)) AS orders__order_month FROM (select * from orders) AS orders GROUP BY orders__order_month LIMIT 1`,
74+
cubeInput: {
75+
measures: ['orders.total_order_amount'],
76+
filters: [],
77+
dimensions: ['orders.order_month'],
78+
limit: 1,
79+
},
80+
expectedOutput: [
81+
{
82+
orders__order_month: '2022-01-01T00:00:00.000Z',
83+
orders__total_order_amount: 130,
84+
},
85+
],
86+
},
6687
{
6788
testName: 'GroupBy',
68-
expectedSQL: `SELECT (SUM(order_amount)) AS orders__total_order_amount , orders.customer_id AS orders__customer_id FROM (select * from orders) AS orders GROUP BY orders.customer_id`,
89+
expectedSQL: `SELECT (SUM(order_amount)) AS orders__total_order_amount , (customer_id) AS orders__customer_id FROM (select * from orders) AS orders GROUP BY orders__customer_id`,
6990
cubeInput: {
7091
measures: ['orders.total_order_amount'],
7192
filters: [],

0 commit comments

Comments
 (0)