Skip to content

Commit caf266f

Browse files
committed
add tests
1 parent 69b2cb3 commit caf266f

File tree

1 file changed

+227
-0
lines changed

1 file changed

+227
-0
lines changed
Lines changed: 227 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,227 @@
1+
import { getEnv } from '@cubejs-backend/shared';
2+
import { prepareJsCompiler } from '../../unit/PrepareCompiler';
3+
import { dbRunner } from './PostgresDBRunner';
4+
5+
/**
6+
* This tests the cube join correctness for cases, when there are
7+
* multiple equal-cost paths between few cubes via transitive joins.
8+
*/
9+
10+
describe('Views Join Order 3', () => {
11+
jest.setTimeout(200000);
12+
13+
const { compiler, joinGraph, cubeEvaluator } = prepareJsCompiler(
14+
// language=JavaScript
15+
`
16+
cube(\`D\`, {
17+
sql: \`SELECT 1 id, 125 as balance\`,
18+
dimensions: {
19+
Balance: {
20+
sql: \`balance\`,
21+
type: \`number\`
22+
}
23+
}
24+
});
25+
26+
cube(\`A\`, {
27+
sql: \`SELECT 1 id, 250 as balance\`,
28+
joins: {
29+
E: {
30+
sql: \`\${CUBE}.id = \${E}.id\`,
31+
relationship: \`many_to_one\`
32+
},
33+
B: {
34+
sql: \`\${CUBE}.id = \${B}.id\`,
35+
relationship: \`many_to_one\`
36+
},
37+
C: {
38+
sql: \`\${CUBE}.id = \${C}.id\`,
39+
relationship: \`many_to_one\`
40+
}
41+
},
42+
dimensions: {
43+
Balance: {
44+
sql: \`balance\`,
45+
type: \`number\`
46+
}
47+
}
48+
});
49+
50+
cube('B', {
51+
sql: \`SELECT 1 id\`,
52+
joins: {
53+
D: {
54+
sql: \`\${CUBE}.id = \${D}.id\`,
55+
relationship: \`many_to_one\`
56+
},
57+
E: {
58+
sql: \`\${CUBE}.id = \${E}.id\`,
59+
relationship: \`many_to_one\`
60+
}
61+
},
62+
dimensions: {
63+
ActivityBalance: {
64+
sql: \`\${D.Balance}\`,
65+
type: \`number\`
66+
}
67+
}
68+
});
69+
70+
cube(\`E\`, {
71+
sql: \`SELECT 1 id, 1 as plan_id, 1 as party_id\`,
72+
joins: {
73+
D: {
74+
sql: \`\${CUBE}.id = \${D}.id\`,
75+
relationship: \`many_to_one\`
76+
},
77+
F: {
78+
sql: \`\${CUBE}.plan_id = \${F}.plan_id\`,
79+
relationship: \`many_to_one\`
80+
},
81+
C: {
82+
sql: \`\${CUBE}.party_id = \${C}.party_id\`,
83+
relationship: \`many_to_one\`
84+
}
85+
}
86+
});
87+
88+
cube('C', {
89+
sql: \`SELECT 1 id, 1 as plan_id, 1 as party_id\`,
90+
joins: {
91+
F: {
92+
sql: \`\${CUBE}.plan_id = \${F}.plan_id\`,
93+
relationship: \`many_to_one\`
94+
}
95+
}
96+
});
97+
98+
cube(\`F\`, {
99+
sql: \`SELECT 1 id, 1 as plan_id, 'PLAN_CODE'::text as plan_code\`,
100+
dimensions: {
101+
PlanCode: {
102+
sql: \`plan_code\`,
103+
type: \`string\`
104+
}
105+
}
106+
});
107+
108+
view(\`V\`, {
109+
cubes: [
110+
{
111+
join_path: A.B,
112+
includes: [\`ActivityBalance\`]
113+
},
114+
{
115+
join_path: A.C.F,
116+
includes: [\`PlanCode\`]
117+
}
118+
]
119+
});
120+
`
121+
);
122+
123+
if (getEnv('nativeSqlPlanner')) {
124+
} else {
125+
it('correct join for simple cube B dimension', async () => {
126+
const [sql, _params] = await dbRunner.runQueryTest({
127+
dimensions: ['B.ActivityBalance'],
128+
timeDimensions: [],
129+
segments: [],
130+
filters: [],
131+
}, [{
132+
b___activity_balance: 125,
133+
}], { compiler, joinGraph, cubeEvaluator });
134+
135+
expect(sql).toMatch(/AS "b"/);
136+
expect(sql).toMatch(/AS "d"/);
137+
expect(sql).toMatch(/ON "b".id = "d".id/);
138+
expect(sql).not.toMatch(/AS "a"/);
139+
expect(sql).not.toMatch(/AS "e"/);
140+
expect(sql).not.toMatch(/AS "c"/);
141+
});
142+
143+
it('correct join for simple view B-dimension', async () => {
144+
const [sql, _params] = await dbRunner.runQueryTest({
145+
dimensions: ['V.ActivityBalance'],
146+
timeDimensions: [],
147+
segments: [],
148+
filters: [],
149+
}, [{
150+
v___activity_balance: 125,
151+
}], { compiler, joinGraph, cubeEvaluator });
152+
153+
expect(sql).toMatch(/AS "a"/);
154+
expect(sql).toMatch(/AS "b"/);
155+
expect(sql).toMatch(/AS "d"/);
156+
expect(sql).toMatch(/ON "a".id = "b".id/);
157+
expect(sql).toMatch(/ON "b".id = "d".id/);
158+
expect(sql).not.toMatch(/AS "e"/);
159+
});
160+
161+
it('correct join for simple view F-dimension', async () => {
162+
const [sql, _params] = await dbRunner.runQueryTest({
163+
dimensions: ['V.PlanCode'],
164+
timeDimensions: [],
165+
segments: [],
166+
filters: [],
167+
}, [{
168+
v___plan_code: 'PLAN_CODE',
169+
}], { compiler, joinGraph, cubeEvaluator });
170+
171+
expect(sql).toMatch(/AS "a"/);
172+
expect(sql).toMatch(/AS "c"/);
173+
expect(sql).toMatch(/AS "f"/);
174+
expect(sql).toMatch(/ON "a".id = "c".id/);
175+
expect(sql).toMatch(/ON "c".plan_id = "f".plan_id/);
176+
expect(sql).not.toMatch(/AS "b"/);
177+
expect(sql).not.toMatch(/AS "d"/);
178+
expect(sql).not.toMatch(/AS "e"/);
179+
});
180+
181+
it('correct join for view F-dimension + B-dimension', async () => {
182+
const [sql, _params] = await dbRunner.runQueryTest({
183+
dimensions: ['V.PlanCode', 'V.ActivityBalance'],
184+
timeDimensions: [],
185+
segments: [],
186+
filters: [],
187+
}, [{
188+
v___plan_code: 'PLAN_CODE',
189+
v___activity_balance: 125,
190+
}], { compiler, joinGraph, cubeEvaluator });
191+
192+
expect(sql).toMatch(/AS "a"/);
193+
expect(sql).toMatch(/AS "c"/);
194+
expect(sql).toMatch(/AS "f"/);
195+
expect(sql).toMatch(/AS "b"/);
196+
expect(sql).toMatch(/AS "d"/);
197+
expect(sql).toMatch(/ON "a".id = "c".id/);
198+
expect(sql).toMatch(/ON "a".id = "b".id/);
199+
expect(sql).toMatch(/ON "c".plan_id = "f".plan_id/);
200+
expect(sql).toMatch(/ON "b".id = "d".id/);
201+
expect(sql).not.toMatch(/AS "e"/);
202+
});
203+
204+
it('correct join for view B-dimension + F-dimension', async () => {
205+
const [sql, _params] = await dbRunner.runQueryTest({
206+
dimensions: ['V.ActivityBalance', 'V.PlanCode'],
207+
timeDimensions: [],
208+
segments: [],
209+
filters: [],
210+
}, [{
211+
v___activity_balance: 125,
212+
v___plan_code: 'PLAN_CODE',
213+
}], { compiler, joinGraph, cubeEvaluator });
214+
215+
expect(sql).toMatch(/AS "a"/);
216+
expect(sql).toMatch(/AS "c"/);
217+
expect(sql).toMatch(/AS "f"/);
218+
expect(sql).toMatch(/AS "b"/);
219+
expect(sql).toMatch(/AS "d"/);
220+
expect(sql).toMatch(/ON "a".id = "c".id/);
221+
expect(sql).toMatch(/ON "a".id = "b".id/);
222+
expect(sql).toMatch(/ON "c".plan_id = "f".plan_id/);
223+
expect(sql).toMatch(/ON "b".id = "d".id/);
224+
expect(sql).not.toMatch(/AS "e"/);
225+
});
226+
}
227+
});

0 commit comments

Comments
 (0)