@visactor/vmind
Version:
<div align="center"> <a href="https://github.com/VisActor#gh-light-mode-only" target="_blank"> <img alt="VisActor Logo" width="200" src="https://github.com/VisActor/.github/blob/main/profile/logo_500_200_light.svg"/> </a> <a href="https://githu
52 lines (45 loc) • 3.38 kB
JavaScript
import alasql from "alasql";
import { matchColumnName, parseRespondField, replaceBlankSpace, replaceDataset, replaceInvalidWords, replaceString, sumAllMeasureFields, swapMap } from "./utils";
import { VMIND_DATA_SOURCE } from "./const";
export const patchSQLBeforeQuery = context => {
const {sql: sql, dataTable: dataTable, fieldInfo: fieldInfo, llmFieldInfo: propsLLMFieldInfo} = context, fieldNames = fieldInfo.map((field => field.fieldName)), {validStr: validStr, sqlReplaceMap: sqlReplaceMap, columnReplaceMap: columnReplaceMap} = replaceInvalidWords(sql, fieldNames), validColumnDataset = replaceDataset(dataTable, columnReplaceMap, !0), validDataset = replaceDataset(validColumnDataset, sqlReplaceMap, !1), replacedFieldNames = fieldNames.map((field => replaceString(field, columnReplaceMap))).map((field => replaceString(field, sqlReplaceMap))), validSql = replaceBlankSpace(validStr, replacedFieldNames), llmFieldInfo = propsLLMFieldInfo.map((field => {
const {fieldName: fieldName} = field, temp = replaceString(fieldName, columnReplaceMap), validFieldName = replaceString(temp, sqlReplaceMap), matchedFieldName = replacedFieldNames.find((f => matchColumnName(validFieldName, f)));
return Object.assign(Object.assign({}, field), {
fieldName: null != matchedFieldName ? matchedFieldName : validFieldName
});
}));
return {
finalSql: sumAllMeasureFields(validSql, fieldInfo, columnReplaceMap, sqlReplaceMap),
validDataset: validDataset,
columnReplaceMap: columnReplaceMap,
sqlReplaceMap: sqlReplaceMap,
llmFieldInfo: llmFieldInfo
};
};
export const executeDataQuery = context => {
const {finalSql: finalSql, validDataset: validDataset} = context, sqlParts = (finalSql + " ").split(VMIND_DATA_SOURCE), sqlCount = sqlParts.length - 1, alasqlQuery = sqlParts.join("?");
return {
alasqlDataset: alasql(alasqlQuery, new Array(sqlCount).fill(validDataset))
};
};
export const restoreDatasetAfterQuery = context => {
const {columnReplaceMap: columnReplaceMap, sqlReplaceMap: sqlReplaceMap, alasqlDataset: alasqlDataset, llmFieldInfo: propsLLMFieldInfo} = context, columnReversedMap = swapMap(columnReplaceMap), columnRestoredDataset = replaceDataset(alasqlDataset, columnReversedMap, !0), sqlReversedMap = swapMap(sqlReplaceMap);
return {
datasetAfterQuery: replaceDataset(columnRestoredDataset, sqlReversedMap, !1),
llmFieldInfo: propsLLMFieldInfo.map((field => {
const {fieldName: fieldName} = field, temp = replaceString(fieldName, columnReversedMap), validFieldName = replaceString(temp, sqlReversedMap);
return Object.assign(Object.assign({}, field), {
fieldName: validFieldName
});
}))
};
};
export const getFinalQueryResult = context => {
const {dataTable: sourceDataset, fieldInfo: fieldInfo, llmFieldInfo: responseFieldInfo, datasetAfterQuery: datasetAfterQuery} = context, fieldInfoNew = parseRespondField(responseFieldInfo, datasetAfterQuery);
return 0 === datasetAfterQuery.length && console.warn("empty dataset after query!"),
{
dataTable: 0 === datasetAfterQuery.length ? sourceDataset : datasetAfterQuery,
fieldInfo: 0 === datasetAfterQuery.length ? fieldInfo : fieldInfoNew
};
};
//# sourceMappingURL=executeQuery.js.map