@devrev/meerkat-node 0.0.111 → 0.0.112
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -5,18 +5,48 @@ Object.defineProperty(exports, "cubeQueryToSQLWithResolution", {
|
|
|
5
5
|
return cubeQueryToSQLWithResolution;
|
|
6
6
|
}
|
|
7
7
|
});
|
|
8
|
+
const _extends = require("@swc/helpers/_/_extends");
|
|
8
9
|
const _meerkatcore = require("@devrev/meerkat-core");
|
|
9
10
|
const _cubetosql = require("../cube-to-sql/cube-to-sql");
|
|
10
11
|
const cubeQueryToSQLWithResolution = async ({ query, tableSchemas, resolutionConfig, columnProjections, contextParams })=>{
|
|
12
|
+
// Check if resolution should be skipped
|
|
13
|
+
if ((0, _meerkatcore.shouldSkipResolution)(resolutionConfig, query, columnProjections)) {
|
|
14
|
+
return await (0, _cubetosql.cubeQueryToSQL)({
|
|
15
|
+
query,
|
|
16
|
+
tableSchemas,
|
|
17
|
+
contextParams
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
//
|
|
21
|
+
// Why remove aliases?
|
|
22
|
+
// The resolution pipeline (unnest → join lookups → re-aggregate) operates on field names
|
|
23
|
+
// internally for consistency and simplicity. Using aliases throughout would complicate
|
|
24
|
+
// the logic as we transform schemas through multiple steps.
|
|
25
|
+
//
|
|
26
|
+
// Alias handling strategy:
|
|
27
|
+
// 1. Strip aliases here - work with field names (e.g., tickets__id, tickets__owners)
|
|
28
|
+
// 2. Run entire resolution pipeline with field names
|
|
29
|
+
// 3. At the final step (applyAliases), restore aliases from original schemas
|
|
30
|
+
// 4. Generate final SQL with user-friendly aliases (e.g., "ID", "Owners")
|
|
31
|
+
//
|
|
32
|
+
// Benefits:
|
|
33
|
+
// - Cleaner internal logic (no alias tracking through transformations)
|
|
34
|
+
// - Single source of truth for aliases (original tableSchemas)
|
|
35
|
+
// - Easier to debug (field names are consistent throughout pipeline)
|
|
36
|
+
// - Separation of concerns (resolution logic vs. display formatting)
|
|
37
|
+
const tableSchemasWithoutAliases = tableSchemas.map((schema)=>_extends._({}, schema, {
|
|
38
|
+
dimensions: schema.dimensions.map((dim)=>_extends._({}, dim, {
|
|
39
|
+
alias: undefined
|
|
40
|
+
})),
|
|
41
|
+
measures: schema.measures.map((measure)=>_extends._({}, measure, {
|
|
42
|
+
alias: undefined
|
|
43
|
+
}))
|
|
44
|
+
}));
|
|
11
45
|
const baseSql = await (0, _cubetosql.cubeQueryToSQL)({
|
|
12
46
|
query,
|
|
13
|
-
tableSchemas,
|
|
47
|
+
tableSchemas: tableSchemasWithoutAliases,
|
|
14
48
|
contextParams
|
|
15
49
|
});
|
|
16
|
-
// Check if resolution should be skipped
|
|
17
|
-
if ((0, _meerkatcore.shouldSkipResolution)(resolutionConfig, query, columnProjections)) {
|
|
18
|
-
return baseSql;
|
|
19
|
-
}
|
|
20
50
|
if (!columnProjections) {
|
|
21
51
|
columnProjections = [
|
|
22
52
|
...query.dimensions || [],
|
|
@@ -28,22 +58,25 @@ const cubeQueryToSQLWithResolution = async ({ query, tableSchemas, resolutionCon
|
|
|
28
58
|
resolutionConfig.columnConfigs = resolutionConfig.columnConfigs.filter((config)=>{
|
|
29
59
|
return columnProjections == null ? void 0 : columnProjections.includes(config.name);
|
|
30
60
|
});
|
|
31
|
-
const baseSchema = (0, _meerkatcore.createBaseTableSchema)(baseSql,
|
|
61
|
+
const baseSchema = (0, _meerkatcore.createBaseTableSchema)(baseSql, tableSchemasWithoutAliases, resolutionConfig, [], columnProjections);
|
|
62
|
+
// At this point, filters/sorts are baked into baseSql using original values
|
|
63
|
+
// We can now override dimensions/measures in the base schema with custom SQL expressions for display
|
|
64
|
+
const schemaWithOverrides = (0, _meerkatcore.applySqlOverrides)(baseSchema, resolutionConfig);
|
|
65
|
+
// Transform field names in configs to match base table schema format
|
|
66
|
+
resolutionConfig.columnConfigs.forEach((config)=>{
|
|
67
|
+
config.name = (0, _meerkatcore.memberKeyToSafeKey)(config.name);
|
|
68
|
+
});
|
|
32
69
|
const rowIdDimension = {
|
|
33
70
|
name: _meerkatcore.ROW_ID_DIMENSION_NAME,
|
|
34
|
-
sql: (0, _meerkatcore.generateRowNumberSql)(query,
|
|
71
|
+
sql: (0, _meerkatcore.generateRowNumberSql)(query, schemaWithOverrides.dimensions, _meerkatcore.BASE_DATA_SOURCE_NAME),
|
|
35
72
|
type: 'number',
|
|
36
73
|
alias: _meerkatcore.ROW_ID_DIMENSION_NAME
|
|
37
74
|
};
|
|
38
|
-
|
|
75
|
+
schemaWithOverrides.dimensions.push(rowIdDimension);
|
|
39
76
|
columnProjections.push(_meerkatcore.ROW_ID_DIMENSION_NAME);
|
|
40
|
-
// Doing this because we need to use the original name of the column in the base table schema.
|
|
41
|
-
resolutionConfig.columnConfigs.forEach((config)=>{
|
|
42
|
-
config.name = (0, _meerkatcore.memberKeyToSafeKey)(config.name);
|
|
43
|
-
});
|
|
44
77
|
// Generate SQL with row_id and unnested arrays
|
|
45
78
|
const unnestTableSchema = await (0, _meerkatcore.getUnnestTableSchema)({
|
|
46
|
-
baseTableSchema:
|
|
79
|
+
baseTableSchema: schemaWithOverrides,
|
|
47
80
|
resolutionConfig,
|
|
48
81
|
contextParams,
|
|
49
82
|
cubeQueryToSQL: async (params)=>(0, _cubetosql.cubeQueryToSQL)(params)
|
|
@@ -57,13 +90,22 @@ const cubeQueryToSQLWithResolution = async ({ query, tableSchemas, resolutionCon
|
|
|
57
90
|
cubeQueryToSQL: async (params)=>(0, _cubetosql.cubeQueryToSQL)(params)
|
|
58
91
|
});
|
|
59
92
|
// Re-aggregate to reverse the unnest
|
|
60
|
-
const
|
|
93
|
+
const aggregatedTableSchema = await (0, _meerkatcore.getAggregatedSql)({
|
|
61
94
|
resolvedTableSchema,
|
|
62
95
|
resolutionConfig,
|
|
63
96
|
contextParams,
|
|
64
97
|
cubeQueryToSQL: async (params)=>(0, _cubetosql.cubeQueryToSQL)(params)
|
|
65
98
|
});
|
|
66
|
-
|
|
99
|
+
// Apply aliases and generate final SQL
|
|
100
|
+
const sqlWithAliases = await (0, _meerkatcore.applyAliases)({
|
|
101
|
+
aggregatedTableSchema,
|
|
102
|
+
originalTableSchemas: tableSchemas,
|
|
103
|
+
resolutionConfig,
|
|
104
|
+
contextParams,
|
|
105
|
+
cubeQueryToSQL: async (params)=>(0, _cubetosql.cubeQueryToSQL)(params)
|
|
106
|
+
});
|
|
107
|
+
// Wrap with row_id ordering and exclusion
|
|
108
|
+
return (0, _meerkatcore.wrapWithRowIdOrderingAndExclusion)(sqlWithAliases, _meerkatcore.ROW_ID_DIMENSION_NAME);
|
|
67
109
|
};
|
|
68
110
|
|
|
69
111
|
//# sourceMappingURL=cube-to-sql-with-resolution.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../meerkat-node/src/cube-to-sql-with-resolution/cube-to-sql-with-resolution.ts"],"sourcesContent":["import {\n BASE_DATA_SOURCE_NAME,\n ContextParams,\n getAggregatedSql as coreGetAggregatedSql,\n getResolvedTableSchema as coreGetResolvedTableSchema,\n getUnnestTableSchema as coreGetUnnestTableSchema,\n createBaseTableSchema,\n Dimension,\n generateRowNumberSql,\n memberKeyToSafeKey,\n Query,\n ResolutionConfig,\n ROW_ID_DIMENSION_NAME,\n shouldSkipResolution,\n TableSchema,\n} from '@devrev/meerkat-core';\nimport { cubeQueryToSQL } from '../cube-to-sql/cube-to-sql';\n\nexport interface CubeQueryToSQLWithResolutionParams {\n query: Query;\n tableSchemas: TableSchema[];\n resolutionConfig: ResolutionConfig;\n columnProjections?: string[];\n contextParams?: ContextParams;\n}\n\nexport const cubeQueryToSQLWithResolution = async ({\n query,\n tableSchemas,\n resolutionConfig,\n columnProjections,\n contextParams,\n}: CubeQueryToSQLWithResolutionParams) => {\n
|
|
1
|
+
{"version":3,"sources":["../../../meerkat-node/src/cube-to-sql-with-resolution/cube-to-sql-with-resolution.ts"],"sourcesContent":["import {\n applyAliases,\n applySqlOverrides,\n BASE_DATA_SOURCE_NAME,\n ContextParams,\n getAggregatedSql as coreGetAggregatedSql,\n getResolvedTableSchema as coreGetResolvedTableSchema,\n getUnnestTableSchema as coreGetUnnestTableSchema,\n createBaseTableSchema,\n Dimension,\n generateRowNumberSql,\n memberKeyToSafeKey,\n Query,\n ResolutionConfig,\n ROW_ID_DIMENSION_NAME,\n shouldSkipResolution,\n TableSchema,\n wrapWithRowIdOrderingAndExclusion,\n} from '@devrev/meerkat-core';\nimport { cubeQueryToSQL } from '../cube-to-sql/cube-to-sql';\n\nexport interface CubeQueryToSQLWithResolutionParams {\n query: Query;\n tableSchemas: TableSchema[];\n resolutionConfig: ResolutionConfig;\n columnProjections?: string[];\n contextParams?: ContextParams;\n}\n\nexport const cubeQueryToSQLWithResolution = async ({\n query,\n tableSchemas,\n resolutionConfig,\n columnProjections,\n contextParams,\n}: CubeQueryToSQLWithResolutionParams) => {\n // Check if resolution should be skipped\n if (shouldSkipResolution(resolutionConfig, query, columnProjections)) {\n return await cubeQueryToSQL({\n query,\n tableSchemas,\n contextParams,\n });\n }\n\n //\n // Why remove aliases?\n // The resolution pipeline (unnest → join lookups → re-aggregate) operates on field names\n // internally for consistency and simplicity. Using aliases throughout would complicate\n // the logic as we transform schemas through multiple steps.\n //\n // Alias handling strategy:\n // 1. Strip aliases here - work with field names (e.g., tickets__id, tickets__owners)\n // 2. Run entire resolution pipeline with field names\n // 3. At the final step (applyAliases), restore aliases from original schemas\n // 4. Generate final SQL with user-friendly aliases (e.g., \"ID\", \"Owners\")\n //\n // Benefits:\n // - Cleaner internal logic (no alias tracking through transformations)\n // - Single source of truth for aliases (original tableSchemas)\n // - Easier to debug (field names are consistent throughout pipeline)\n // - Separation of concerns (resolution logic vs. display formatting)\n const tableSchemasWithoutAliases: TableSchema[] = tableSchemas.map(\n (schema) => ({\n ...schema,\n dimensions: schema.dimensions.map((dim) => ({\n ...dim,\n alias: undefined, // Strip alias for resolution pipeline\n })),\n measures: schema.measures.map((measure) => ({\n ...measure,\n alias: undefined, // Strip alias\n })),\n })\n );\n\n const baseSql = await cubeQueryToSQL({\n query,\n tableSchemas: tableSchemasWithoutAliases,\n contextParams,\n });\n\n if (!columnProjections) {\n columnProjections = [...(query.dimensions || []), ...query.measures];\n }\n // This is to ensure that, only the column projection columns\n // are being resolved and other definitions are ignored.\n resolutionConfig.columnConfigs = resolutionConfig.columnConfigs.filter(\n (config) => {\n return columnProjections?.includes(config.name);\n }\n );\n\n const baseSchema: TableSchema = createBaseTableSchema(\n baseSql,\n tableSchemasWithoutAliases, // Use alias-free schemas\n resolutionConfig,\n [],\n columnProjections\n );\n\n // At this point, filters/sorts are baked into baseSql using original values\n // We can now override dimensions/measures in the base schema with custom SQL expressions for display\n const schemaWithOverrides = applySqlOverrides(baseSchema, resolutionConfig);\n\n // Transform field names in configs to match base table schema format\n resolutionConfig.columnConfigs.forEach((config) => {\n config.name = memberKeyToSafeKey(config.name);\n });\n\n const rowIdDimension: Dimension = {\n name: ROW_ID_DIMENSION_NAME,\n sql: generateRowNumberSql(\n query,\n schemaWithOverrides.dimensions,\n BASE_DATA_SOURCE_NAME\n ),\n type: 'number',\n alias: ROW_ID_DIMENSION_NAME,\n };\n schemaWithOverrides.dimensions.push(rowIdDimension);\n columnProjections.push(ROW_ID_DIMENSION_NAME);\n\n // Generate SQL with row_id and unnested arrays\n const unnestTableSchema = await coreGetUnnestTableSchema({\n baseTableSchema: schemaWithOverrides,\n resolutionConfig,\n contextParams,\n cubeQueryToSQL: async (params) => cubeQueryToSQL(params),\n });\n\n // Apply resolution (join with lookup tables)\n const resolvedTableSchema = await coreGetResolvedTableSchema({\n baseTableSchema: unnestTableSchema,\n resolutionConfig,\n contextParams,\n columnProjections,\n cubeQueryToSQL: async (params) => cubeQueryToSQL(params),\n });\n\n // Re-aggregate to reverse the unnest\n const aggregatedTableSchema = await coreGetAggregatedSql({\n resolvedTableSchema,\n resolutionConfig,\n contextParams,\n cubeQueryToSQL: async (params) => cubeQueryToSQL(params),\n });\n\n // Apply aliases and generate final SQL\n const sqlWithAliases = await applyAliases({\n aggregatedTableSchema,\n originalTableSchemas: tableSchemas,\n resolutionConfig,\n contextParams,\n cubeQueryToSQL: async (params) => cubeQueryToSQL(params),\n });\n\n // Wrap with row_id ordering and exclusion\n return wrapWithRowIdOrderingAndExclusion(\n sqlWithAliases,\n ROW_ID_DIMENSION_NAME\n );\n};\n"],"names":["cubeQueryToSQLWithResolution","query","tableSchemas","resolutionConfig","columnProjections","contextParams","shouldSkipResolution","cubeQueryToSQL","tableSchemasWithoutAliases","map","schema","dimensions","dim","alias","undefined","measures","measure","baseSql","columnConfigs","filter","config","includes","name","baseSchema","createBaseTableSchema","schemaWithOverrides","applySqlOverrides","forEach","memberKeyToSafeKey","rowIdDimension","ROW_ID_DIMENSION_NAME","sql","generateRowNumberSql","BASE_DATA_SOURCE_NAME","type","push","unnestTableSchema","coreGetUnnestTableSchema","baseTableSchema","params","resolvedTableSchema","coreGetResolvedTableSchema","aggregatedTableSchema","coreGetAggregatedSql","sqlWithAliases","applyAliases","originalTableSchemas","wrapWithRowIdOrderingAndExclusion"],"mappings":";+BA6BaA;;;eAAAA;;;;6BAXN;2BACwB;AAUxB,MAAMA,+BAA+B,OAAO,EACjDC,KAAK,EACLC,YAAY,EACZC,gBAAgB,EAChBC,iBAAiB,EACjBC,aAAa,EACsB;IACnC,wCAAwC;IACxC,IAAIC,IAAAA,iCAAoB,EAACH,kBAAkBF,OAAOG,oBAAoB;QACpE,OAAO,MAAMG,IAAAA,yBAAc,EAAC;YAC1BN;YACAC;YACAG;QACF;IACF;IAEA,EAAE;IACF,sBAAsB;IACtB,yFAAyF;IACzF,uFAAuF;IACvF,4DAA4D;IAC5D,EAAE;IACF,2BAA2B;IAC3B,qFAAqF;IACrF,qDAAqD;IACrD,6EAA6E;IAC7E,0EAA0E;IAC1E,EAAE;IACF,YAAY;IACZ,uEAAuE;IACvE,+DAA+D;IAC/D,qEAAqE;IACrE,qEAAqE;IACrE,MAAMG,6BAA4CN,aAAaO,GAAG,CAChE,CAACC,SAAY,eACRA;YACHC,YAAYD,OAAOC,UAAU,CAACF,GAAG,CAAC,CAACG,MAAS,eACvCA;oBACHC,OAAOC;;YAETC,UAAUL,OAAOK,QAAQ,CAACN,GAAG,CAAC,CAACO,UAAa,eACvCA;oBACHH,OAAOC;;;IAKb,MAAMG,UAAU,MAAMV,IAAAA,yBAAc,EAAC;QACnCN;QACAC,cAAcM;QACdH;IACF;IAEA,IAAI,CAACD,mBAAmB;QACtBA,oBAAoB;eAAKH,MAAMU,UAAU,IAAI,EAAE;eAAMV,MAAMc,QAAQ;SAAC;IACtE;IACA,6DAA6D;IAC7D,wDAAwD;IACxDZ,iBAAiBe,aAAa,GAAGf,iBAAiBe,aAAa,CAACC,MAAM,CACpE,CAACC;QACC,OAAOhB,qCAAAA,kBAAmBiB,QAAQ,CAACD,OAAOE,IAAI;IAChD;IAGF,MAAMC,aAA0BC,IAAAA,kCAAqB,EACnDP,SACAT,4BACAL,kBACA,EAAE,EACFC;IAGF,4EAA4E;IAC5E,qGAAqG;IACrG,MAAMqB,sBAAsBC,IAAAA,8BAAiB,EAACH,YAAYpB;IAE1D,qEAAqE;IACrEA,iBAAiBe,aAAa,CAACS,OAAO,CAAC,CAACP;QACtCA,OAAOE,IAAI,GAAGM,IAAAA,+BAAkB,EAACR,OAAOE,IAAI;IAC9C;IAEA,MAAMO,iBAA4B;QAChCP,MAAMQ,kCAAqB;QAC3BC,KAAKC,IAAAA,iCAAoB,EACvB/B,OACAwB,oBAAoBd,UAAU,EAC9BsB,kCAAqB;QAEvBC,MAAM;QACNrB,OAAOiB,kCAAqB;IAC9B;IACAL,oBAAoBd,UAAU,CAACwB,IAAI,CAACN;IACpCzB,kBAAkB+B,IAAI,CAACL,kCAAqB;IAE5C,+CAA+C;IAC/C,MAAMM,oBAAoB,MAAMC,IAAAA,iCAAwB,EAAC;QACvDC,iBAAiBb;QACjBtB;QACAE;QACAE,gBAAgB,OAAOgC,SAAWhC,IAAAA,yBAAc,EAACgC;IACnD;IAEA,8CAA8C;IAC9C,MAAMC,sBAAsB,MAAMC,IAAAA,mCAA0B,EAAC;QAC3DH,iBAAiBF;QACjBjC;QACAE;QACAD;QACAG,gBAAgB,OAAOgC,SAAWhC,IAAAA,yBAAc,EAACgC;IACnD;IAEA,qCAAqC;IACrC,MAAMG,wBAAwB,MAAMC,IAAAA,6BAAoB,EAAC;QACvDH;QACArC;QACAE;QACAE,gBAAgB,OAAOgC,SAAWhC,IAAAA,yBAAc,EAACgC;IACnD;IAEA,uCAAuC;IACvC,MAAMK,iBAAiB,MAAMC,IAAAA,yBAAY,EAAC;QACxCH;QACAI,sBAAsB5C;QACtBC;QACAE;QACAE,gBAAgB,OAAOgC,SAAWhC,IAAAA,yBAAc,EAACgC;IACnD;IAEA,0CAA0C;IAC1C,OAAOQ,IAAAA,8CAAiC,EACtCH,gBACAd,kCAAqB;AAEzB"}
|