@salesforce/soql-model
Version:
119 lines • 4.42 kB
JavaScript
/*
* Copyright (c) 2021, salesforce.com, inc.
* All rights reserved.
* Licensed under the BSD 3-Clause license.
* For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.SelectAnalyzer = void 0;
const soql_parser_1 = require("@salesforce/soql-common/lib/soql-parser");
const tree_1 = require("antlr4ts/tree");
const soql_common_1 = require("@salesforce/soql-common");
class SelectAnalyzer {
constructor(queryText) {
this.queryText = queryText;
const parser = (0, soql_parser_1.SOQLParser)({
isApex: true,
isMultiCurrencyEnabled: true,
apiVersion: 50.0,
});
const { headerPaddedSoqlText } = soql_common_1.soqlComments.parseHeaderComments(this.queryText);
const result = parser.parseQuery(headerPaddedSoqlText);
this.parseTree = result.getParseTree();
}
getSelections() {
const visitor = new SelectVisitor();
this.parseTree.accept(visitor);
return visitor.selections;
}
getColumnData() {
const selections = this.getSelections();
const columnData = {
objectName: '',
columns: new Array(),
subTables: new Array(),
};
selections.forEach((selection) => {
if (selection.isSubQuerySelection) {
let subTable = columnData.subTables.find((data) => data.objectName === selection.objectName);
if (!subTable) {
subTable = {
objectName: selection.objectName,
columns: [],
subTables: [],
};
columnData.subTables.push(subTable);
}
subTable.columns.push({
title: selection.columnName,
fieldHelper: selection.queryResultsPath,
});
}
else {
columnData.objectName = selection.objectName;
columnData.columns.push({
title: selection.columnName,
fieldHelper: selection.queryResultsPath,
});
}
});
return columnData;
}
}
exports.SelectAnalyzer = SelectAnalyzer;
class SelectVisitor extends tree_1.AbstractParseTreeVisitor {
constructor() {
super(...arguments);
this.selections = [];
this.currentNamespace = '';
this.currentObjectName = '';
this.currentAggregateExpression = 0;
this.isInnerQuery = false;
}
visitSoqlSelectInnerQueryExpr(ctx) {
this.isInnerQuery = true;
ctx.soqlInnerQuery().accept(this);
this.isInnerQuery = false;
this.currentNamespace = '';
this.currentObjectName = '';
}
visitSoqlFromExpr(ctx) {
this.currentObjectName = ctx.soqlIdentifier()[0].text;
if (this.isInnerQuery) {
this.currentNamespace = `${this.currentObjectName}.`;
}
}
visitSoqlInnerQuery(ctx) {
// visit FROM clause before SELECT clause
ctx.soqlFromClause().accept(this);
ctx.soqlSelectClause().accept(this);
}
visitSoqlSelectColumnExpr(ctx) {
var _a;
const fieldText = ctx.soqlField().text;
const isAggregateExpression = fieldText.includes('(');
const aliasText = (_a = ctx.soqlAlias()) === null || _a === void 0 ? void 0 : _a.text;
let queryResultsPath = [];
if (isAggregateExpression) {
queryResultsPath.push(aliasText || `${SelectVisitor.AGGREGATEEXPR_PREFIX}${this.currentAggregateExpression}`);
}
else {
queryResultsPath = `${fieldText}`.split('.');
}
this.selections.push({
selectionQueryText: fieldText,
queryResultsPath,
objectName: this.currentObjectName,
columnName: aliasText || `${this.currentNamespace}${fieldText}`,
isSubQuerySelection: this.isInnerQuery,
});
if (isAggregateExpression) {
this.currentAggregateExpression++;
}
}
// eslint-disable-next-line @typescript-eslint/no-empty-function
defaultResult() { }
}
SelectVisitor.AGGREGATEEXPR_PREFIX = 'expr';
//# sourceMappingURL=selectAnalyzer.js.map
;