Skip to content

Commit 9975f40

Browse files
authored
add column projection in resolution (#159)
* add column projection in resolution * review comments
1 parent 07d7745 commit 9975f40

File tree

8 files changed

+130
-22
lines changed

8 files changed

+130
-22
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.102",
3+
"version": "0.0.103",
44
"dependencies": {
55
"tslib": "^2.3.0",
66
"@devrev/meerkat-core": "*",

meerkat-browser/src/browser-cube-to-sql-with-resolution/browser-cube-to-sql-with-resolution.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export interface CubeQueryToSQLWithResolutionParams {
1919
query: Query;
2020
tableSchemas: TableSchema[];
2121
resolutionConfig: ResolutionConfig;
22+
columnProjections?: string[];
2223
contextParams?: ContextParams;
2324
}
2425

@@ -27,6 +28,7 @@ export const cubeQueryToSQLWithResolution = async ({
2728
query,
2829
tableSchemas,
2930
resolutionConfig,
31+
columnProjections,
3032
contextParams,
3133
}: CubeQueryToSQLWithResolutionParams) => {
3234
const baseSql = await cubeQueryToSQL({
@@ -59,7 +61,11 @@ export const cubeQueryToSQLWithResolution = async ({
5961
connection: connection,
6062
query: {
6163
measures: [],
62-
dimensions: generateResolvedDimensions(query, resolutionConfig),
64+
dimensions: generateResolvedDimensions(
65+
query,
66+
resolutionConfig,
67+
columnProjections
68+
),
6369
joinPaths: generateResolutionJoinPaths(resolutionConfig, tableSchemas),
6470
},
6571
tableSchemas: [baseTable, ...resolutionSchemas],

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.102",
3+
"version": "0.0.103",
44
"dependencies": {
55
"tslib": "^2.3.0"
66
},

meerkat-core/src/resolution/resolution.spec.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,48 @@ describe('Generate resolved dimensions', () => {
638638
'__base_query.base_table__column1',
639639
]);
640640
});
641+
642+
it('only include projected columns', () => {
643+
const query = {
644+
measures: ['base_table.count', 'base_table.total'],
645+
dimensions: ['base_table.column1', 'base_table.column2'],
646+
};
647+
const resolutionConfig = {
648+
columnConfigs: [
649+
{
650+
name: 'base_table.column1',
651+
source: 'resolution_table',
652+
joinColumn: 'id',
653+
resolutionColumns: ['display_id'],
654+
},
655+
{
656+
name: 'base_table.column2',
657+
source: 'resolution_table',
658+
joinColumn: 'id',
659+
resolutionColumns: ['id', 'display_name'],
660+
},
661+
],
662+
tableSchemas: [],
663+
};
664+
const projections = [
665+
'base_table.count',
666+
'base_table.column2',
667+
'base_table.total',
668+
];
669+
670+
const resolvedDimensions = generateResolvedDimensions(
671+
query,
672+
resolutionConfig,
673+
projections
674+
);
675+
676+
expect(resolvedDimensions).toEqual([
677+
'__base_query.base_table__count',
678+
'base_table__column2.base_table__column2__id',
679+
'base_table__column2.base_table__column2__display_name',
680+
'__base_query.base_table__total',
681+
]);
682+
});
641683
});
642684

643685
describe('Generate resolution join paths', () => {

meerkat-core/src/resolution/resolution.ts

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -127,27 +127,38 @@ export const generateResolutionSchemas = (
127127

128128
export const generateResolvedDimensions = (
129129
query: Query,
130-
config: ResolutionConfig
130+
config: ResolutionConfig,
131+
columnProjections?: string[]
131132
): Member[] => {
132-
const resolvedDimensions: Member[] = [
133-
...query.measures,
134-
...(query.dimensions || []),
135-
].flatMap((dimension) => {
136-
const columnConfig = config.columnConfigs.find((c) => c.name === dimension);
133+
// If column projections are provided, use those.
134+
// Otherwise, use all measures and dimensions from the original query.
135+
const aggregatedDimensions = columnProjections
136+
? columnProjections
137+
: [...query.measures, ...(query.dimensions || [])];
137138

138-
if (!columnConfig) {
139-
return [
140-
getNamespacedKey(BASE_DATA_SOURCE_NAME, memberKeyToSafeKey(dimension)),
141-
];
142-
} else {
143-
return columnConfig.resolutionColumns.map((col) =>
144-
getNamespacedKey(
145-
memberKeyToSafeKey(dimension),
146-
memberKeyToSafeKey(getNamespacedKey(columnConfig.name, col))
147-
)
139+
const resolvedDimensions: Member[] = aggregatedDimensions.flatMap(
140+
(dimension) => {
141+
const columnConfig = config.columnConfigs.find(
142+
(c) => c.name === dimension
148143
);
144+
145+
if (!columnConfig) {
146+
return [
147+
getNamespacedKey(
148+
BASE_DATA_SOURCE_NAME,
149+
memberKeyToSafeKey(dimension)
150+
),
151+
];
152+
} else {
153+
return columnConfig.resolutionColumns.map((col) =>
154+
getNamespacedKey(
155+
memberKeyToSafeKey(dimension),
156+
memberKeyToSafeKey(getNamespacedKey(columnConfig.name, col))
157+
)
158+
);
159+
}
149160
}
150-
});
161+
);
151162
return resolvedDimensions;
152163
};
153164

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

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

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,4 +348,47 @@ describe('Resolution Tests', () => {
348348
expectedSQL.replace(/\s+/g, ' ').trim()
349349
);
350350
});
351+
352+
it('Resolution With Column Projections', async () => {
353+
const query = {
354+
measures: [],
355+
dimensions: [
356+
'base_table.part_id_1',
357+
'base_table.random_column',
358+
'base_table.work_id',
359+
'base_table.part_id_2',
360+
],
361+
};
362+
363+
const sql = await cubeQueryToSQLWithResolution({
364+
query,
365+
tableSchemas: [BASE_TABLE_SCHEMA],
366+
resolutionConfig: {
367+
columnConfigs: [
368+
{
369+
name: 'base_table.part_id_1',
370+
source: 'dim_part',
371+
joinColumn: 'id',
372+
resolutionColumns: ['display_id'],
373+
},
374+
],
375+
tableSchemas: [DIM_PART_SCHEMA, DIM_WORK_SCHEMA],
376+
},
377+
columnProjections: ['base_table.random_column', 'base_table.part_id_1'],
378+
});
379+
console.info(`SQL: `, sql);
380+
const expectedSQL = `
381+
SELECT
382+
"base_table__random_column",
383+
"base_table__part_id_1 - display_id"
384+
FROM
385+
(SELECT __base_query.base_table__random_column AS "base_table__random_column", * FROM (SELECT base_table__part_id_1, base_table__random_column, base_table__work_id, base_table__part_id_2 FROM (SELECT base_table.part_id_1 AS base_table__part_id_1, base_table.random_column AS base_table__random_column, base_table.work_id AS base_table__work_id, base_table.part_id_2 AS base_table__part_id_2, * FROM (select * from base_table) AS base_table) AS base_table) AS __base_query
386+
LEFT JOIN (SELECT base_table__part_id_1.display_id AS "base_table__part_id_1 - display_id", * FROM (select id, display_id from system.dim_feature UNION ALL select id, display_id from system.dim_product) AS base_table__part_id_1) AS base_table__part_id_1
387+
ON __base_query.base_table__part_id_1 = base_table__part_id_1.id)
388+
AS MEERKAT_GENERATED_TABLE
389+
`;
390+
expect(sql.replace(/\s+/g, ' ').trim()).toBe(
391+
expectedSQL.replace(/\s+/g, ' ').trim()
392+
);
393+
});
351394
});

meerkat-node/src/cube-to-sql-with-resolution/cube-to-sql-with-resolution.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,15 @@ export interface CubeQueryToSQLWithResolutionParams {
1717
query: Query;
1818
tableSchemas: TableSchema[];
1919
resolutionConfig: ResolutionConfig;
20+
columnProjections?: string[];
2021
contextParams?: ContextParams;
2122
}
2223

2324
export const cubeQueryToSQLWithResolution = async ({
2425
query,
2526
tableSchemas,
2627
resolutionConfig,
28+
columnProjections,
2729
contextParams,
2830
}: CubeQueryToSQLWithResolutionParams) => {
2931
const baseSql = await cubeQueryToSQL({
@@ -54,7 +56,11 @@ export const cubeQueryToSQLWithResolution = async ({
5456
const resolveParams: CubeQueryToSQLParams = {
5557
query: {
5658
measures: [],
57-
dimensions: generateResolvedDimensions(query, resolutionConfig),
59+
dimensions: generateResolvedDimensions(
60+
query,
61+
resolutionConfig,
62+
columnProjections
63+
),
5864
joinPaths: generateResolutionJoinPaths(resolutionConfig, tableSchemas),
5965
},
6066
tableSchemas: [baseTable, ...resolutionSchemas],

0 commit comments

Comments
 (0)