@devrev/meerkat-browser 0.0.83 → 0.0.85
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.
- package/package.json +1 -1
- package/src/ast/dimension.d.ts +12 -0
- package/src/ast/dimension.js +22 -0
- package/src/ast/dimension.js.map +1 -0
- package/src/ast/index.d.ts +3 -0
- package/src/ast/index.js +7 -0
- package/src/ast/index.js.map +1 -0
- package/src/ast/measure.d.ts +12 -0
- package/src/ast/measure.js +23 -0
- package/src/ast/measure.js.map +1 -0
- package/src/ast/query-to-ast.d.ts +9 -0
- package/src/ast/query-to-ast.js +21 -0
- package/src/ast/query-to-ast.js.map +1 -0
- package/src/ast/utils.d.ts +4 -0
- package/src/ast/utils.js +24 -0
- package/src/ast/utils.js.map +1 -0
- package/src/browser-cube-to-sql/browser-cube-to-sql.d.ts +5 -3
- package/src/browser-cube-to-sql/browser-cube-to-sql.js +11 -38
- package/src/browser-cube-to-sql/browser-cube-to-sql.js.map +1 -1
- package/src/index.d.ts +1 -0
- package/src/index.js +18 -3
- package/src/index.js.map +1 -1
package/package.json
CHANGED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AsyncDuckDBConnection } from '@duckdb/duckdb-wasm';
|
|
2
|
+
/**
|
|
3
|
+
* Validates the query can be used as a dimension by parsing it to an AST and checking its structure
|
|
4
|
+
* @param connection - DuckDB connection instance
|
|
5
|
+
* @param query - The query string to validate
|
|
6
|
+
* @returns Promise<boolean> - Whether the dimension is valid
|
|
7
|
+
*/
|
|
8
|
+
export declare const validateDimensionQuery: ({ connection, query, validFunctions, }: {
|
|
9
|
+
connection: AsyncDuckDBConnection;
|
|
10
|
+
query: string;
|
|
11
|
+
validFunctions?: string[] | undefined;
|
|
12
|
+
}) => Promise<boolean>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "validateDimensionQuery", {
|
|
3
|
+
enumerable: true,
|
|
4
|
+
get: function() {
|
|
5
|
+
return validateDimensionQuery;
|
|
6
|
+
}
|
|
7
|
+
});
|
|
8
|
+
const _meerkatcore = require("@devrev/meerkat-core");
|
|
9
|
+
const _querytoast = require("./query-to-ast");
|
|
10
|
+
const _utils = require("./utils");
|
|
11
|
+
const validateDimensionQuery = async ({ connection, query, validFunctions })=>{
|
|
12
|
+
const parsedSerialization = await (0, _querytoast.parseQueryToAST)(query, connection);
|
|
13
|
+
if ((0, _utils.isParseError)(parsedSerialization)) {
|
|
14
|
+
var _parsedSerialization_error_message;
|
|
15
|
+
throw new Error((_parsedSerialization_error_message = parsedSerialization.error_message) != null ? _parsedSerialization_error_message : 'Unknown error');
|
|
16
|
+
}
|
|
17
|
+
// Only fetch valid functions if not provided
|
|
18
|
+
const availableFunctions = validFunctions != null ? validFunctions : await (0, _utils.getAvailableFunctions)(connection, 'scalar');
|
|
19
|
+
return (0, _meerkatcore.validateDimension)(parsedSerialization, availableFunctions);
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=dimension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../meerkat-browser/src/ast/dimension.ts"],"sourcesContent":["import { validateDimension } from '@devrev/meerkat-core';\nimport { AsyncDuckDBConnection } from '@duckdb/duckdb-wasm';\nimport { parseQueryToAST } from './query-to-ast';\nimport { getAvailableFunctions, isParseError } from './utils';\n\n/**\n * Validates the query can be used as a dimension by parsing it to an AST and checking its structure\n * @param connection - DuckDB connection instance\n * @param query - The query string to validate\n * @returns Promise<boolean> - Whether the dimension is valid\n */\nexport const validateDimensionQuery = async ({\n connection,\n query,\n validFunctions,\n}: {\n connection: AsyncDuckDBConnection;\n query: string;\n validFunctions?: string[];\n}): Promise<boolean> => {\n const parsedSerialization = await parseQueryToAST(query, connection);\n\n if (isParseError(parsedSerialization)) {\n throw new Error(parsedSerialization.error_message ?? 'Unknown error');\n }\n\n // Only fetch valid functions if not provided\n const availableFunctions =\n validFunctions ?? (await getAvailableFunctions(connection, 'scalar'));\n\n return validateDimension(parsedSerialization, availableFunctions);\n};\n"],"names":["validateDimensionQuery","connection","query","validFunctions","parsedSerialization","parseQueryToAST","isParseError","Error","error_message","availableFunctions","getAvailableFunctions","validateDimension"],"mappings":";+BAWaA;;;eAAAA;;;6BAXqB;4BAEF;uBACoB;AAQ7C,MAAMA,yBAAyB,OAAO,EAC3CC,UAAU,EACVC,KAAK,EACLC,cAAc,EAKf;IACC,MAAMC,sBAAsB,MAAMC,IAAAA,2BAAe,EAACH,OAAOD;IAEzD,IAAIK,IAAAA,mBAAY,EAACF,sBAAsB;YACrBA;QAAhB,MAAM,IAAIG,MAAMH,CAAAA,qCAAAA,oBAAoBI,aAAa,YAAjCJ,qCAAqC;IACvD;IAEA,6CAA6C;IAC7C,MAAMK,qBACJN,yBAAAA,iBAAmB,MAAMO,IAAAA,4BAAqB,EAACT,YAAY;IAE7D,OAAOU,IAAAA,8BAAiB,EAACP,qBAAqBK;AAChD"}
|
package/src/ast/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const _export_star = require("@swc/helpers/_/_export_star");
|
|
3
|
+
_export_star._(require("./dimension"), exports);
|
|
4
|
+
_export_star._(require("./measure"), exports);
|
|
5
|
+
_export_star._(require("./query-to-ast"), exports);
|
|
6
|
+
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../meerkat-browser/src/ast/index.ts"],"sourcesContent":["export * from './dimension';\nexport * from './measure';\nexport * from './query-to-ast';\n"],"names":[],"mappings":";;uBAAc;uBACA;uBACA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AsyncDuckDBConnection } from '@duckdb/duckdb-wasm';
|
|
2
|
+
/**
|
|
3
|
+
* Validates the query can be used as a measure by parsing it to an AST and checking its structure
|
|
4
|
+
* @param connection - DuckDB connection instance
|
|
5
|
+
* @param query - The query string to validate
|
|
6
|
+
* @returns Promise<boolean> - Whether the measure is valid
|
|
7
|
+
*/
|
|
8
|
+
export declare const validateMeasureQuery: ({ connection, query, validFunctions, }: {
|
|
9
|
+
connection: AsyncDuckDBConnection;
|
|
10
|
+
query: string;
|
|
11
|
+
validFunctions?: string[] | undefined;
|
|
12
|
+
}) => Promise<boolean>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "validateMeasureQuery", {
|
|
3
|
+
enumerable: true,
|
|
4
|
+
get: function() {
|
|
5
|
+
return validateMeasureQuery;
|
|
6
|
+
}
|
|
7
|
+
});
|
|
8
|
+
const _meerkatcore = require("@devrev/meerkat-core");
|
|
9
|
+
const _querytoast = require("./query-to-ast");
|
|
10
|
+
const _utils = require("./utils");
|
|
11
|
+
const validateMeasureQuery = async ({ connection, query, validFunctions })=>{
|
|
12
|
+
const parsedSerialization = await (0, _querytoast.parseQueryToAST)(query, connection);
|
|
13
|
+
if ((0, _utils.isParseError)(parsedSerialization)) {
|
|
14
|
+
var _parsedSerialization_error_message;
|
|
15
|
+
throw new Error((_parsedSerialization_error_message = parsedSerialization.error_message) != null ? _parsedSerialization_error_message : 'Unknown error');
|
|
16
|
+
}
|
|
17
|
+
// Only fetch valid functions if not provided
|
|
18
|
+
const availableFunctions = validFunctions != null ? validFunctions : await (0, _utils.getAvailableFunctions)(connection, 'aggregate');
|
|
19
|
+
const validScalarFunctions = await (0, _utils.getAvailableFunctions)(connection, 'scalar');
|
|
20
|
+
return (0, _meerkatcore.validateMeasure)(parsedSerialization, availableFunctions, validScalarFunctions);
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=measure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../meerkat-browser/src/ast/measure.ts"],"sourcesContent":["import { validateMeasure } from '@devrev/meerkat-core';\nimport { AsyncDuckDBConnection } from '@duckdb/duckdb-wasm';\nimport { parseQueryToAST } from './query-to-ast';\nimport { getAvailableFunctions, isParseError } from './utils';\n\n/**\n * Validates the query can be used as a measure by parsing it to an AST and checking its structure\n * @param connection - DuckDB connection instance\n * @param query - The query string to validate\n * @returns Promise<boolean> - Whether the measure is valid\n */\nexport const validateMeasureQuery = async ({\n connection,\n query,\n validFunctions,\n}: {\n connection: AsyncDuckDBConnection;\n query: string;\n validFunctions?: string[];\n}): Promise<boolean> => {\n const parsedSerialization = await parseQueryToAST(query, connection);\n\n if (isParseError(parsedSerialization)) {\n throw new Error(parsedSerialization.error_message ?? 'Unknown error');\n }\n\n // Only fetch valid functions if not provided\n const availableFunctions =\n validFunctions ?? (await getAvailableFunctions(connection, 'aggregate'));\n\n const validScalarFunctions = await getAvailableFunctions(\n connection,\n 'scalar'\n );\n\n return validateMeasure(\n parsedSerialization,\n availableFunctions,\n validScalarFunctions\n );\n};\n"],"names":["validateMeasureQuery","connection","query","validFunctions","parsedSerialization","parseQueryToAST","isParseError","Error","error_message","availableFunctions","getAvailableFunctions","validScalarFunctions","validateMeasure"],"mappings":";+BAWaA;;;eAAAA;;;6BAXmB;4BAEA;uBACoB;AAQ7C,MAAMA,uBAAuB,OAAO,EACzCC,UAAU,EACVC,KAAK,EACLC,cAAc,EAKf;IACC,MAAMC,sBAAsB,MAAMC,IAAAA,2BAAe,EAACH,OAAOD;IAEzD,IAAIK,IAAAA,mBAAY,EAACF,sBAAsB;YACrBA;QAAhB,MAAM,IAAIG,MAAMH,CAAAA,qCAAAA,oBAAoBI,aAAa,YAAjCJ,qCAAqC;IACvD;IAEA,6CAA6C;IAC7C,MAAMK,qBACJN,yBAAAA,iBAAmB,MAAMO,IAAAA,4BAAqB,EAACT,YAAY;IAE7D,MAAMU,uBAAuB,MAAMD,IAAAA,4BAAqB,EACtDT,YACA;IAGF,OAAOW,IAAAA,4BAAe,EACpBR,qBACAK,oBACAE;AAEJ"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ParsedSerialization } from '@devrev/meerkat-core';
|
|
2
|
+
import { AsyncDuckDBConnection } from '@duckdb/duckdb-wasm';
|
|
3
|
+
/**
|
|
4
|
+
* Converts a query to an AST
|
|
5
|
+
* @param query - The query string to convert
|
|
6
|
+
* @param connection - The DuckDB connection instance
|
|
7
|
+
* @returns The AST as a JSON object
|
|
8
|
+
*/
|
|
9
|
+
export declare const parseQueryToAST: (query: string, connection: AsyncDuckDBConnection) => Promise<ParsedSerialization>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "parseQueryToAST", {
|
|
3
|
+
enumerable: true,
|
|
4
|
+
get: function() {
|
|
5
|
+
return parseQueryToAST;
|
|
6
|
+
}
|
|
7
|
+
});
|
|
8
|
+
const _meerkatcore = require("@devrev/meerkat-core");
|
|
9
|
+
const parseQueryToAST = async (query, connection)=>{
|
|
10
|
+
try {
|
|
11
|
+
const serializedQuery = (0, _meerkatcore.astSerializerQuery)(query);
|
|
12
|
+
const arrowResult = await connection.query(serializedQuery);
|
|
13
|
+
const parsedOutputQuery = arrowResult.toArray().map((row)=>row.toJSON());
|
|
14
|
+
const deserializedQuery = (0, _meerkatcore.deserializeQuery)(parsedOutputQuery);
|
|
15
|
+
return JSON.parse(deserializedQuery);
|
|
16
|
+
} catch (error) {
|
|
17
|
+
throw new Error('Failed to parse query to AST');
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=query-to-ast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../meerkat-browser/src/ast/query-to-ast.ts"],"sourcesContent":["import {\n astSerializerQuery,\n deserializeQuery,\n ParsedSerialization,\n} from '@devrev/meerkat-core';\nimport { AsyncDuckDBConnection } from '@duckdb/duckdb-wasm';\n\n/**\n * Converts a query to an AST\n * @param query - The query string to convert\n * @param connection - The DuckDB connection instance\n * @returns The AST as a JSON object\n */\nexport const parseQueryToAST = async (\n query: string,\n connection: AsyncDuckDBConnection\n): Promise<ParsedSerialization> => {\n try {\n const serializedQuery = astSerializerQuery(query);\n const arrowResult = await connection.query(serializedQuery);\n\n const parsedOutputQuery = arrowResult.toArray().map((row) => row.toJSON());\n const deserializedQuery = deserializeQuery(parsedOutputQuery);\n\n return JSON.parse(deserializedQuery);\n } catch (error) {\n throw new Error('Failed to parse query to AST');\n }\n};\n"],"names":["parseQueryToAST","query","connection","serializedQuery","astSerializerQuery","arrowResult","parsedOutputQuery","toArray","map","row","toJSON","deserializedQuery","deserializeQuery","JSON","parse","error","Error"],"mappings":";+BAaaA;;;eAAAA;;;6BATN;AASA,MAAMA,kBAAkB,OAC7BC,OACAC;IAEA,IAAI;QACF,MAAMC,kBAAkBC,IAAAA,+BAAkB,EAACH;QAC3C,MAAMI,cAAc,MAAMH,WAAWD,KAAK,CAACE;QAE3C,MAAMG,oBAAoBD,YAAYE,OAAO,GAAGC,GAAG,CAAC,CAACC,MAAQA,IAAIC,MAAM;QACvE,MAAMC,oBAAoBC,IAAAA,6BAAgB,EAACN;QAE3C,OAAOO,KAAKC,KAAK,CAACH;IACpB,EAAE,OAAOI,OAAO;QACd,MAAM,IAAIC,MAAM;IAClB;AACF"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ParsedSerialization } from '@devrev/meerkat-core';
|
|
2
|
+
import { AsyncDuckDBConnection } from '@duckdb/duckdb-wasm';
|
|
3
|
+
export declare const isParseError: (data: ParsedSerialization) => boolean;
|
|
4
|
+
export declare const getAvailableFunctions: (connection: AsyncDuckDBConnection, function_type: 'scalar' | 'aggregate') => Promise<string[]>;
|
package/src/ast/utils.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
function _export(target, all) {
|
|
3
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
4
|
+
enumerable: true,
|
|
5
|
+
get: all[name]
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
_export(exports, {
|
|
9
|
+
isParseError: function() {
|
|
10
|
+
return isParseError;
|
|
11
|
+
},
|
|
12
|
+
getAvailableFunctions: function() {
|
|
13
|
+
return getAvailableFunctions;
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
const isParseError = (data)=>{
|
|
17
|
+
return !!data.error;
|
|
18
|
+
};
|
|
19
|
+
const getAvailableFunctions = async (connection, function_type)=>{
|
|
20
|
+
const result = await connection.query(`SELECT distinct function_name FROM duckdb_functions() WHERE function_type = '${function_type}'`);
|
|
21
|
+
return result.toArray().map((row)=>row.toJSON().function_name);
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../meerkat-browser/src/ast/utils.ts"],"sourcesContent":["import { ParsedSerialization } from '@devrev/meerkat-core';\nimport { AsyncDuckDBConnection } from '@duckdb/duckdb-wasm';\n\nexport const isParseError = (data: ParsedSerialization): boolean => {\n return !!data.error;\n};\n\n// Helper function to get available functions from DuckDB based on function type\nexport const getAvailableFunctions = async (\n connection: AsyncDuckDBConnection,\n function_type: 'scalar' | 'aggregate'\n): Promise<string[]> => {\n const result = await connection.query(\n `SELECT distinct function_name FROM duckdb_functions() WHERE function_type = '${function_type}'`\n );\n\n return result.toArray().map((row) => row.toJSON().function_name);\n};\n"],"names":["isParseError","getAvailableFunctions","data","error","connection","function_type","result","query","toArray","map","row","toJSON","function_name"],"mappings":";;;;;;;;IAGaA,YAAY;eAAZA;;IAKAC,qBAAqB;eAArBA;;;AALN,MAAMD,eAAe,CAACE;IAC3B,OAAO,CAAC,CAACA,KAAKC,KAAK;AACrB;AAGO,MAAMF,wBAAwB,OACnCG,YACAC;IAEA,MAAMC,SAAS,MAAMF,WAAWG,KAAK,CACnC,CAAC,6EAA6E,EAAEF,cAAc,CAAC,CAAC;IAGlG,OAAOC,OAAOE,OAAO,GAAGC,GAAG,CAAC,CAACC,MAAQA,IAAIC,MAAM,GAAGC,aAAa;AACjE"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { ContextParams, Query, TableSchema } from '@devrev/meerkat-core';
|
|
2
2
|
import { AsyncDuckDBConnection } from '@duckdb/duckdb-wasm';
|
|
3
|
-
|
|
3
|
+
interface CubeQueryToSQLParams {
|
|
4
4
|
connection: AsyncDuckDBConnection;
|
|
5
5
|
query: Query;
|
|
6
6
|
tableSchemas: TableSchema[];
|
|
7
|
-
contextParams?: ContextParams
|
|
8
|
-
}
|
|
7
|
+
contextParams?: ContextParams;
|
|
8
|
+
}
|
|
9
|
+
export declare const cubeQueryToSQL: ({ connection, query, tableSchemas, contextParams }: CubeQueryToSQLParams) => Promise<string>;
|
|
10
|
+
export {};
|
|
@@ -7,45 +7,18 @@ Object.defineProperty(exports, "cubeQueryToSQL", {
|
|
|
7
7
|
});
|
|
8
8
|
const _extends = require("@swc/helpers/_/_extends");
|
|
9
9
|
const _meerkatcore = require("@devrev/meerkat-core");
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
if (!filterParamAST.ast) {
|
|
15
|
-
continue;
|
|
16
|
-
}
|
|
17
|
-
const queryOutput = await connection.query((0, _meerkatcore.astDeserializerQuery)(filterParamAST.ast));
|
|
18
|
-
const parsedOutputQuery = queryOutput.toArray().map((row)=>row.toJSON());
|
|
19
|
-
const sql = (0, _meerkatcore.deserializeQuery)(parsedOutputQuery);
|
|
20
|
-
filterParamsSQL.push({
|
|
21
|
-
memberKey: filterParamAST.memberKey,
|
|
22
|
-
sql: sql,
|
|
23
|
-
matchKey: filterParamAST.matchKey
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
return filterParamsSQL;
|
|
27
|
-
};
|
|
28
|
-
const getFinalBaseSQL = async (query, tableSchema, connection)=>{
|
|
29
|
-
/**
|
|
30
|
-
* Apply transformation to the supplied base query.
|
|
31
|
-
* This involves updating the filter placeholder with the actual filter values.
|
|
32
|
-
*/ const baseFilterParamsSQL = await getFilterParamsSQL({
|
|
33
|
-
query: query,
|
|
34
|
-
tableSchema,
|
|
35
|
-
filterType: 'BASE_FILTER',
|
|
36
|
-
connection
|
|
37
|
-
});
|
|
38
|
-
const baseSQL = (0, _meerkatcore.applyFilterParamsToBaseSQL)(tableSchema.sql, baseFilterParamsSQL);
|
|
39
|
-
const baseSQLWithFilterProjection = (0, _meerkatcore.getWrappedBaseQueryWithProjections)({
|
|
40
|
-
baseQuery: baseSQL,
|
|
41
|
-
tableSchema,
|
|
42
|
-
query: query
|
|
43
|
-
});
|
|
44
|
-
return baseSQLWithFilterProjection;
|
|
10
|
+
const getQueryOutput = async (query, connection)=>{
|
|
11
|
+
const queryOutput = await connection.query(query);
|
|
12
|
+
const parsedOutputQuery = queryOutput.toArray().map((row)=>row.toJSON());
|
|
13
|
+
return parsedOutputQuery;
|
|
45
14
|
};
|
|
46
15
|
const cubeQueryToSQL = async ({ connection, query, tableSchemas, contextParams })=>{
|
|
47
16
|
const updatedTableSchemas = await Promise.all(tableSchemas.map(async (schema)=>{
|
|
48
|
-
const baseFilterParamsSQL = await
|
|
17
|
+
const baseFilterParamsSQL = await (0, _meerkatcore.getFinalBaseSQL)({
|
|
18
|
+
query,
|
|
19
|
+
tableSchema: schema,
|
|
20
|
+
getQueryOutput: (query)=>getQueryOutput(query, connection)
|
|
21
|
+
});
|
|
49
22
|
return _extends._({}, schema, {
|
|
50
23
|
sql: baseFilterParamsSQL
|
|
51
24
|
});
|
|
@@ -59,8 +32,8 @@ const cubeQueryToSQL = async ({ connection, query, tableSchemas, contextParams }
|
|
|
59
32
|
const arrowResult = await connection.query(queryTemp);
|
|
60
33
|
const parsedOutputQuery = arrowResult.toArray().map((row)=>row.toJSON());
|
|
61
34
|
const preBaseQuery = (0, _meerkatcore.deserializeQuery)(parsedOutputQuery);
|
|
62
|
-
const filterParamsSQL = await getFilterParamsSQL({
|
|
63
|
-
connection,
|
|
35
|
+
const filterParamsSQL = await (0, _meerkatcore.getFilterParamsSQL)({
|
|
36
|
+
getQueryOutput: (query)=>getQueryOutput(query, connection),
|
|
64
37
|
query,
|
|
65
38
|
tableSchema: updatedTableSchema,
|
|
66
39
|
filterType: 'BASE_FILTER'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../meerkat-browser/src/browser-cube-to-sql/browser-cube-to-sql.ts"],"sourcesContent":["import {\n BASE_TABLE_NAME,\n ContextParams,\n
|
|
1
|
+
{"version":3,"sources":["../../../../meerkat-browser/src/browser-cube-to-sql/browser-cube-to-sql.ts"],"sourcesContent":["import {\n BASE_TABLE_NAME,\n ContextParams,\n Query,\n TableSchema,\n applyFilterParamsToBaseSQL,\n applyProjectionToSQLQuery,\n astDeserializerQuery,\n cubeToDuckdbAST,\n deserializeQuery,\n detectApplyContextParamsToBaseSQL,\n getCombinedTableSchema,\n getFilterParamsSQL,\n getFinalBaseSQL\n} from '@devrev/meerkat-core';\nimport { AsyncDuckDBConnection } from '@duckdb/duckdb-wasm';\n\n\nconst getQueryOutput = async (query: string, connection: AsyncDuckDBConnection) => {\n const queryOutput = await connection.query(query);\n const parsedOutputQuery = queryOutput.toArray().map((row) => row.toJSON());\n return parsedOutputQuery;\n}\n\n\ninterface CubeQueryToSQLParams {\n connection: AsyncDuckDBConnection,\n query: Query,\n tableSchemas: TableSchema[],\n contextParams?: ContextParams,\n}\n\nexport const cubeQueryToSQL = async ({\n connection,\n query,\n tableSchemas,\n contextParams\n}: CubeQueryToSQLParams) => {\n const updatedTableSchemas: TableSchema[] = await Promise.all(\n tableSchemas.map(async (schema: TableSchema) => {\n const baseFilterParamsSQL = await getFinalBaseSQL({\n query,\n tableSchema: schema,\n getQueryOutput: (query) => getQueryOutput(query, connection)\n });\n return {\n ...schema,\n sql: baseFilterParamsSQL,\n };\n })\n );\n\n const updatedTableSchema = await getCombinedTableSchema(\n updatedTableSchemas,\n query\n );\n\n const ast = cubeToDuckdbAST(query, updatedTableSchema);\n if (!ast) {\n throw new Error('Could not generate AST');\n }\n\n const queryTemp = astDeserializerQuery(ast);\n\n const arrowResult = await connection.query(queryTemp);\n const parsedOutputQuery = arrowResult.toArray().map((row) => row.toJSON());\n\n const preBaseQuery = deserializeQuery(parsedOutputQuery);\n const filterParamsSQL = await getFilterParamsSQL({\n getQueryOutput: (query) => getQueryOutput(query, connection),\n query,\n tableSchema: updatedTableSchema,\n filterType: 'BASE_FILTER',\n });\n\n const filterParamQuery = applyFilterParamsToBaseSQL(\n updatedTableSchema.sql,\n filterParamsSQL\n );\n\n /**\n * Replace CONTEXT_PARAMS with context params\n */\n const baseQuery = detectApplyContextParamsToBaseSQL(\n filterParamQuery,\n contextParams || {}\n );\n\n /**\n * Replace BASE_TABLE_NAME with cube query\n */\n const replaceBaseTableName = preBaseQuery.replace(\n BASE_TABLE_NAME,\n `(${baseQuery}) AS ${updatedTableSchema.name}`\n );\n\n /**\n * Add measures to the query\n */\n const measures = query.measures;\n const dimensions = query.dimensions || [];\n const finalQuery = applyProjectionToSQLQuery(\n dimensions,\n measures,\n updatedTableSchema,\n replaceBaseTableName\n );\n\n return finalQuery;\n};\n"],"names":["cubeQueryToSQL","getQueryOutput","query","connection","queryOutput","parsedOutputQuery","toArray","map","row","toJSON","tableSchemas","contextParams","updatedTableSchemas","Promise","all","schema","baseFilterParamsSQL","getFinalBaseSQL","tableSchema","sql","updatedTableSchema","getCombinedTableSchema","ast","cubeToDuckdbAST","Error","queryTemp","astDeserializerQuery","arrowResult","preBaseQuery","deserializeQuery","filterParamsSQL","getFilterParamsSQL","filterType","filterParamQuery","applyFilterParamsToBaseSQL","baseQuery","detectApplyContextParamsToBaseSQL","replaceBaseTableName","replace","BASE_TABLE_NAME","name","measures","dimensions","finalQuery","applyProjectionToSQLQuery"],"mappings":";+BAgCaA;;;eAAAA;;;;6BAlBN;AAIP,MAAMC,iBAAiB,OAAOC,OAAeC;IAC3C,MAAMC,cAAc,MAAMD,WAAWD,KAAK,CAACA;IAC3C,MAAMG,oBAAoBD,YAAYE,OAAO,GAAGC,GAAG,CAAC,CAACC,MAAQA,IAAIC,MAAM;IACvE,OAAOJ;AACT;AAUO,MAAML,iBAAiB,OAAO,EACnCG,UAAU,EACVD,KAAK,EACLQ,YAAY,EACZC,aAAa,EACQ;IACrB,MAAMC,sBAAqC,MAAMC,QAAQC,GAAG,CAC1DJ,aAAaH,GAAG,CAAC,OAAOQ;QACtB,MAAMC,sBAAsB,MAAMC,IAAAA,4BAAe,EAAC;YAChDf;YACAgB,aAAaH;YACbd,gBAAgB,CAACC,QAAUD,eAAeC,OAAOC;QACnD;QACA,OAAO,eACFY;YACHI,KAAKH;;IAET;IAGF,MAAMI,qBAAqB,MAAMC,IAAAA,mCAAsB,EACrDT,qBACAV;IAGF,MAAMoB,MAAMC,IAAAA,4BAAe,EAACrB,OAAOkB;IACnC,IAAI,CAACE,KAAK;QACR,MAAM,IAAIE,MAAM;IAClB;IAEA,MAAMC,YAAYC,IAAAA,iCAAoB,EAACJ;IAEvC,MAAMK,cAAc,MAAMxB,WAAWD,KAAK,CAACuB;IAC3C,MAAMpB,oBAAoBsB,YAAYrB,OAAO,GAAGC,GAAG,CAAC,CAACC,MAAQA,IAAIC,MAAM;IAEvE,MAAMmB,eAAeC,IAAAA,6BAAgB,EAACxB;IACtC,MAAMyB,kBAAkB,MAAMC,IAAAA,+BAAkB,EAAC;QAC/C9B,gBAAgB,CAACC,QAAUD,eAAeC,OAAOC;QACjDD;QACAgB,aAAaE;QACbY,YAAY;IACd;IAEA,MAAMC,mBAAmBC,IAAAA,uCAA0B,EACjDd,mBAAmBD,GAAG,EACtBW;IAGF;;GAEC,GACD,MAAMK,YAAYC,IAAAA,8CAAiC,EACjDH,kBACAtB,iBAAiB,CAAC;IAGpB;;GAEC,GACD,MAAM0B,uBAAuBT,aAAaU,OAAO,CAC/CC,4BAAe,EACf,CAAC,CAAC,EAAEJ,UAAU,KAAK,EAAEf,mBAAmBoB,IAAI,CAAC,CAAC;IAGhD;;GAEC,GACD,MAAMC,WAAWvC,MAAMuC,QAAQ;IAC/B,MAAMC,aAAaxC,MAAMwC,UAAU,IAAI,EAAE;IACzC,MAAMC,aAAaC,IAAAA,sCAAyB,EAC1CF,YACAD,UACArB,oBACAiB;IAGF,OAAOM;AACT"}
|
package/src/index.d.ts
CHANGED
package/src/index.js
CHANGED
|
@@ -1,12 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
function _export(target, all) {
|
|
3
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
4
|
+
enumerable: true,
|
|
5
|
+
get: all[name]
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
_export(exports, {
|
|
9
|
+
convertCubeStringToTableSchema: function() {
|
|
5
10
|
return _meerkatcore.convertCubeStringToTableSchema;
|
|
11
|
+
},
|
|
12
|
+
parseQueryToAST: function() {
|
|
13
|
+
return _ast.parseQueryToAST;
|
|
14
|
+
},
|
|
15
|
+
validateDimensionQuery: function() {
|
|
16
|
+
return _ast.validateDimensionQuery;
|
|
17
|
+
},
|
|
18
|
+
validateMeasureQuery: function() {
|
|
19
|
+
return _ast.validateMeasureQuery;
|
|
6
20
|
}
|
|
7
21
|
});
|
|
8
22
|
const _export_star = require("@swc/helpers/_/_export_star");
|
|
9
23
|
_export_star._(require("./browser-cube-to-sql/browser-cube-to-sql"), exports);
|
|
10
24
|
const _meerkatcore = require("@devrev/meerkat-core");
|
|
25
|
+
const _ast = require("./ast");
|
|
11
26
|
|
|
12
27
|
//# sourceMappingURL=index.js.map
|
package/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../meerkat-browser/src/index.ts"],"sourcesContent":["export * from './browser-cube-to-sql/browser-cube-to-sql';\nexport { convertCubeStringToTableSchema };\nimport { convertCubeStringToTableSchema } from '@devrev/meerkat-core';\n"],"names":["convertCubeStringToTableSchema"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../meerkat-browser/src/index.ts"],"sourcesContent":["export * from './browser-cube-to-sql/browser-cube-to-sql';\nexport { convertCubeStringToTableSchema };\nimport { convertCubeStringToTableSchema } from '@devrev/meerkat-core';\nexport {\n parseQueryToAST,\n validateDimensionQuery,\n validateMeasureQuery,\n} from './ast';\n"],"names":["convertCubeStringToTableSchema","parseQueryToAST","validateDimensionQuery","validateMeasureQuery"],"mappings":";;;;;;;;IACSA,8BAA8B;eAA9BA,2CAA8B;;IAGrCC,eAAe;eAAfA,oBAAe;;IACfC,sBAAsB;eAAtBA,2BAAsB;;IACtBC,oBAAoB;eAApBA,yBAAoB;;;;uBANR;6BAEiC;qBAKxC"}
|