Skip to content

Commit edf1947

Browse files
Optimization: group by only when measures has some length (#82)
* group by only when measures has some lenght * joins test cases update * added test case * bumped package json
1 parent 52d604f commit edf1947

File tree

6 files changed

+144
-6
lines changed

6 files changed

+144
-6
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.74",
3+
"version": "0.0.75",
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.76",
3+
"version": "0.0.77",
44
"dependencies": {
55
"@swc/helpers": "~0.5.0"
66
},

meerkat-core/src/ast-builder/ast-builder.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,7 @@ export const cubeToDuckdbAST = (query: Query, tableSchema: TableSchema, options?
8383
node.where_clause = whereClause;
8484
node.having = havingClause
8585
}
86-
87-
if (query.dimensions && query.dimensions?.length > 0) {
86+
if (query.measures.length && query.dimensions && query.dimensions?.length > 0) {
8887
node.group_expressions = cubeDimensionToGroupByAST(query.dimensions);
8988
const groupSets = [];
9089
/**

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

meerkat-node/src/__tests__/joins.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ describe('Joins Tests', () => {
385385
const parsedOutput = JSON.parse(JSON.stringify(output));
386386
console.info('parsedOutput', parsedOutput);
387387
expect(sql).toEqual(
388-
'SELECT orders__order_id FROM (SELECT *, orders.order_id AS orders__order_id FROM (select * from orders) AS orders) AS MEERKAT_GENERATED_TABLE GROUP BY orders__order_id'
388+
'SELECT orders__order_id FROM (SELECT *, orders.order_id AS orders__order_id FROM (select * from orders) AS orders) AS MEERKAT_GENERATED_TABLE'
389389
);
390390
expect(parsedOutput).toHaveLength(11);
391391
});
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
import { Query } from '@devrev/meerkat-core';
2+
import { cubeQueryToSQL } from '../cube-to-sql/cube-to-sql';
3+
import { duckdbExec } from '../duckdb-exec';
4+
5+
6+
const CREATE_TEST_TABLE = `CREATE TABLE orders (
7+
order_id INTEGER,
8+
customer_id VARCHAR,
9+
product_id VARCHAR,
10+
order_date DATE,
11+
order_amount FLOAT
12+
);`;
13+
14+
const INPUT_DATA_QUERY = `INSERT INTO orders VALUES
15+
(1, '1', '1', '2022-01-01', 50),
16+
(2, '1', '2', '2022-01-02', 80),
17+
(3, '2', '3', '2022-02-01', 25),
18+
(4, '2', '1', '2022-03-01', 75),
19+
(5, '3', '1', '2022-03-02', 100),
20+
(6, '4', '2', '2022-04-01', 45),
21+
(7, '4', '3', '2022-05-01', 90),
22+
`;
23+
24+
export const TABLE_SCHEMA = {
25+
name: 'orders',
26+
sql: 'select * from orders',
27+
measures: [
28+
{
29+
name: 'order_amount',
30+
sql: 'order_amount',
31+
type: 'number',
32+
},
33+
{
34+
name: 'total_order_amount',
35+
sql: 'SUM(order_amount)',
36+
type: 'number',
37+
},
38+
],
39+
dimensions: [
40+
{
41+
name: 'order_date',
42+
sql: 'order_date',
43+
type: 'time',
44+
},
45+
{
46+
name: 'order_id',
47+
sql: 'order_id',
48+
type: 'number',
49+
},
50+
{
51+
name: 'customer_id',
52+
sql: 'customer_id',
53+
type: 'string',
54+
},
55+
{
56+
name: 'product_id',
57+
sql: 'product_id',
58+
type: 'string',
59+
},
60+
{
61+
name: 'order_month',
62+
sql: `DATE_TRUNC('month', order_date)`,
63+
type: 'string',
64+
},
65+
],
66+
};
67+
describe('cube-to-sql', () => {
68+
beforeAll(async () => {
69+
//Create test table
70+
await duckdbExec(CREATE_TEST_TABLE);
71+
//Insert test data
72+
await duckdbExec(INPUT_DATA_QUERY);
73+
//Get SQL from cube query
74+
});
75+
it('Should not append group by when no measures selected', async () => {
76+
const query: Query = {
77+
measures: [],
78+
dimensions: ['orders.customer_id'],
79+
};
80+
const sql = await cubeQueryToSQL(query, [TABLE_SCHEMA]);
81+
console.info(`SQL for Simple Cube Query: `, sql);
82+
expect(sql).toBe(
83+
"SELECT orders__customer_id FROM (SELECT *, customer_id AS orders__customer_id FROM (select * from orders) AS orders) AS orders"
84+
);
85+
const output = await duckdbExec(sql);
86+
expect(output).toEqual([
87+
{
88+
"orders__customer_id": "1",
89+
},
90+
{
91+
"orders__customer_id": "1",
92+
},
93+
{
94+
"orders__customer_id": "2",
95+
},
96+
{
97+
"orders__customer_id": "2",
98+
},
99+
{
100+
"orders__customer_id": "3",
101+
},
102+
{
103+
"orders__customer_id": "4",
104+
},
105+
{
106+
"orders__customer_id": "4",
107+
},
108+
]
109+
);
110+
});
111+
it('Should append group by when some measures are selected', async () => {
112+
const query: Query = {
113+
measures: ['orders.total_order_amount'],
114+
dimensions: ['orders.customer_id'],
115+
};
116+
const sql = await cubeQueryToSQL(query, [TABLE_SCHEMA]);
117+
console.info(`SQL for Simple Cube Query: `, sql);
118+
expect(sql).toBe("SELECT SUM(order_amount) AS orders__total_order_amount , orders__customer_id FROM (SELECT *, customer_id AS orders__customer_id FROM (select * from orders) AS orders) AS orders GROUP BY orders__customer_id");
119+
const output = await duckdbExec(sql);
120+
expect(output).toEqual([
121+
{
122+
"orders__customer_id": "1",
123+
"orders__total_order_amount": 130,
124+
},
125+
{
126+
"orders__customer_id": "2",
127+
"orders__total_order_amount": 100,
128+
},
129+
{
130+
"orders__customer_id": "3",
131+
"orders__total_order_amount": 100,
132+
},
133+
{
134+
"orders__customer_id": "4",
135+
"orders__total_order_amount": 135,
136+
},
137+
]);
138+
});
139+
});

0 commit comments

Comments
 (0)