UNPKG

@salesforce/soql-model

Version:
119 lines 4.42 kB
"use strict"; /* * 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