@jitterbit/soql-parser-js
Version:
Salesforce.com SOQL parser and composer
866 lines (865 loc) • 34.8 kB
JavaScript
"use strict";
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.isQueryValid = exports.parseQuery = void 0;
var utils_1 = require("../utils");
var parser_1 = require("./parser");
var parser = new parser_1.SoqlParser();
var BaseSoqlVisitor = parser.getBaseCstVisitorConstructor();
var BOOLEANS = ['TRUE', 'FALSE'];
var DATE_LITERALS = [
'YESTERDAY',
'TODAY',
'TOMORROW',
'LAST_WEEK',
'THIS_WEEK',
'NEXT_WEEK',
'LAST_MONTH',
'THIS_MONTH',
'NEXT_MONTH',
'LAST_90_DAYS',
'NEXT_90_DAYS',
'THIS_QUARTER',
'LAST_QUARTER',
'NEXT_QUARTER',
'THIS_YEAR',
'LAST_YEAR',
'NEXT_YEAR',
'THIS_FISCAL_QUARTER',
'LAST_FISCAL_QUARTER',
'NEXT_FISCAL_QUARTER',
'THIS_FISCAL_YEAR',
'LAST_FISCAL_YEAR',
'NEXT_FISCAL_YEAR',
];
var DATE_N_LITERALS = [
'NEXT_N_DAYS',
'LAST_N_DAYS',
'N_DAYS_AGO',
'NEXT_N_WEEKS',
'LAST_N_WEEKS',
'N_WEEKS_AGO',
'NEXT_N_MONTHS',
'LAST_N_MONTHS',
'N_MONTHS_AGO',
'NEXT_N_QUARTERS',
'LAST_N_QUARTERS',
'N_QUARTERS_AGO',
'NEXT_N_YEARS',
'LAST_N_YEARS',
'N_YEARS_AGO',
'NEXT_N_FISCAL_QUARTERS',
'LAST_N_FISCAL_QUARTERS',
'N_FISCAL_QUARTERS_AGO',
'NEXT_N_FISCAL_YEARS',
'LAST_N_FISCAL_YEARS',
'N_FISCAL_YEARS_AGO',
];
var SOQLVisitor = (function (_super) {
__extends(SOQLVisitor, _super);
function SOQLVisitor() {
var _this = _super.call(this) || this;
_this.helpers = {
$_getFieldFunction: function (ctx, isAggregateFn, includeType) {
if (isAggregateFn === void 0) { isAggregateFn = false; }
if (includeType === void 0) { includeType = true; }
var args = ctx.functionExpression ? ctx.functionExpression.map(function (node) { return _this.visit(node, { includeType: includeType }); }).flat() : [];
var output = {};
if (includeType) {
output.type = 'FieldFunctionExpression';
}
output.functionName = ctx.fn[0].tokenType.name;
output.parameters = args;
if (includeType && isAggregateFn) {
output.isAggregateFn = isAggregateFn;
}
output.rawValue = "".concat(ctx.fn[0].image, "(").concat(args.map(function (arg) { return (typeof arg === 'string' ? arg : arg.rawValue); }).join(', '), ")");
return output;
},
$_getLiteralTypeFromTokenType: function (tokenTypeName) {
if (tokenTypeName === 'REAL_NUMBER') {
return 'DECIMAL';
}
else if (tokenTypeName === 'CURRENCY_PREFIXED_DECIMAL') {
return 'DECIMAL_WITH_CURRENCY_PREFIX';
}
else if (tokenTypeName === 'CURRENCY_PREFIXED_INTEGER') {
return 'INTEGER_WITH_CURRENCY_PREFIX';
}
else if (tokenTypeName === 'SIGNED_DECIMAL') {
return 'DECIMAL';
}
else if (tokenTypeName === 'UNSIGNED_DECIMAL') {
return 'DECIMAL';
}
else if (tokenTypeName === 'UNSIGNED_INTEGER') {
return 'INTEGER';
}
else if (tokenTypeName === 'SIGNED_INTEGER') {
return 'INTEGER';
}
else if (tokenTypeName === 'DATETIME') {
return 'DATETIME';
}
else if (tokenTypeName === 'DATE') {
return 'DATE';
}
else if (tokenTypeName === 'NULL') {
return 'NULL';
}
else if (tokenTypeName === 'StringIdentifier') {
return 'STRING';
}
else if (tokenTypeName === 'Identifier') {
return 'STRING';
}
else if (BOOLEANS.includes(tokenTypeName)) {
return 'BOOLEAN';
}
else if (DATE_LITERALS.includes(tokenTypeName)) {
return 'DATE_LITERAL';
}
else if (DATE_N_LITERALS.includes(tokenTypeName)) {
return 'DATE_N_LITERAL';
}
else {
return 'STRING';
}
},
$_parseSelect: function (ctx, options) {
var isSubquery = (options || { isSubquery: false }).isSubquery;
var output = {};
if (ctx.selectClause) {
output.fields = this.visit(ctx.selectClause);
}
if (ctx.fromClause) {
if ((0, utils_1.isSubqueryFromFlag)(output, isSubquery)) {
var _a = this.visit(ctx.fromClause), sObject = _a.sObject, alias = _a.alias, sObjectPrefix = _a.sObjectPrefix;
output.relationshipName = sObject;
if (alias) {
output.sObjectAlias = alias;
}
if (sObjectPrefix) {
output.sObjectPrefix = sObjectPrefix;
}
}
else {
var _b = this.visit(ctx.fromClause), sObject = _b.sObject, alias = _b.alias;
output.sObject = sObject;
if (alias) {
output.sObjectAlias = alias;
}
}
}
if (Array.isArray(output.fields)) {
if (!!output.sObjectAlias) {
output.fields.forEach(function (field) {
if (field.relationships && field.relationships[0] === output.sObjectAlias) {
field.relationships = field.relationships.slice(1);
field.objectPrefix = output.sObjectAlias;
}
if (field.relationships && field.relationships.length === 0) {
delete field.relationships;
field.type = 'Field';
}
});
}
}
output = __assign(__assign({}, output), this.visit(ctx.clauseStatements));
return output;
},
};
_this.validateVisitor();
return _this;
}
SOQLVisitor.prototype.selectStatement = function (ctx, options) {
return this.helpers.$_parseSelect.bind(this)(ctx, options);
};
SOQLVisitor.prototype.selectStatementPartial = function (ctx, options) {
return this.helpers.$_parseSelect.bind(this)(ctx, options);
};
SOQLVisitor.prototype.clauseStatements = function (ctx) {
var _this = this;
var query = {};
if (ctx.usingScopeClause && !ctx.usingScopeClause[0].recoveredNode) {
query.usingScope = this.visit(ctx.usingScopeClause);
}
if (ctx.whereClause && !ctx.whereClause[0].recoveredNode) {
query.where = this.visit(ctx.whereClause);
}
if (ctx.withClause) {
ctx.withClause
.filter(function (item) { return !item.recoveredNode; })
.forEach(function (item) {
var _a = _this.visit(item), withSecurityEnforced = _a.withSecurityEnforced, withAccessLevel = _a.withAccessLevel, withDataCategory = _a.withDataCategory;
if (withSecurityEnforced) {
query.withSecurityEnforced = withSecurityEnforced;
}
if (withAccessLevel) {
query.withAccessLevel = withAccessLevel;
}
if (withDataCategory) {
query.withDataCategory = withDataCategory;
}
});
}
if (ctx.groupByClause && !ctx.groupByClause[0].recoveredNode) {
query.groupBy = this.visit(ctx.groupByClause);
}
if (ctx.havingClause && !ctx.havingClause[0].recoveredNode) {
query.having = this.visit(ctx.havingClause);
}
if (ctx.orderByClause && !ctx.orderByClause[0].recoveredNode) {
query.orderBy = this.visit(ctx.orderByClause);
}
if (ctx.limitClause && !ctx.limitClause[0].recoveredNode) {
query.limit = Number(this.visit(ctx.limitClause));
}
if (ctx.offsetClause && !ctx.offsetClause[0].recoveredNode) {
query.offset = Number(this.visit(ctx.offsetClause));
}
if (ctx.forViewOrReference && !ctx.forViewOrReference[0].recoveredNode) {
query.for = this.visit(ctx.forViewOrReference);
}
if (ctx.updateTrackingViewstat && !ctx.updateTrackingViewstat[0].recoveredNode) {
query.update = this.visit(ctx.updateTrackingViewstat);
}
return query;
};
SOQLVisitor.prototype.selectClause = function (ctx) {
var _this = this;
if (ctx.field) {
return ctx.field.map(function (item) {
if ((0, utils_1.isToken)(item)) {
var field = item.image;
var output = void 0;
if (!field.includes('.')) {
output = {
type: 'Field',
field: field,
};
}
else {
var splitFields = field.split('.');
output = {
type: 'FieldRelationship',
field: splitFields[splitFields.length - 1],
relationships: splitFields.slice(0, splitFields.length - 1),
rawValue: field,
};
}
return output;
}
else {
return _this.visit(item);
}
});
}
return [];
};
SOQLVisitor.prototype.selectClauseFunctionIdentifier = function (ctx) {
var output = __assign({}, this.visit(ctx.fn));
if (ctx.alias) {
output.alias = ctx.alias[0].image;
}
return output;
};
SOQLVisitor.prototype.selectClauseSubqueryIdentifier = function (ctx) {
return {
type: 'FieldSubquery',
subquery: this.visit(ctx.selectStatement, { isSubquery: true }),
};
};
SOQLVisitor.prototype.selectClauseTypeOf = function (ctx) {
var _this = this;
var conditions = ctx.selectClauseTypeOfThen.map(function (item) { return _this.visit(item); });
if (ctx.selectClauseTypeOfElse) {
conditions.push(this.visit(ctx.selectClauseTypeOfElse));
}
return {
type: 'FieldTypeof',
field: ctx.typeOfField[0].image,
conditions: conditions,
};
};
SOQLVisitor.prototype.selectClauseIdentifier = function (ctx) {
var item = ctx.field[0];
var alias = !!ctx.alias ? ctx.alias[0].image : undefined;
var field = item.image;
var output;
if (!field.includes('.')) {
output = {
type: 'Field',
field: field,
};
}
else {
var splitFields = field.split('.');
output = {
type: 'FieldRelationship',
field: splitFields[splitFields.length - 1],
relationships: splitFields.slice(0, splitFields.length - 1),
rawValue: field,
};
}
if (alias) {
output.alias = alias;
}
return output;
};
SOQLVisitor.prototype.selectClauseTypeOfThen = function (ctx) {
return {
type: 'WHEN',
objectType: ctx.typeOfField[0].image,
fieldList: ctx.field.map(function (item) { return item.image; }),
};
};
SOQLVisitor.prototype.selectClauseTypeOfElse = function (ctx) {
return {
type: 'ELSE',
fieldList: ctx.field.map(function (item) { return item.image; }),
};
};
SOQLVisitor.prototype.fromClause = function (ctx) {
var sObject = ctx.Identifier[0].image;
var output;
if (sObject.includes('.')) {
var sObjectPrefix = sObject.split('.');
output = {
sObjectPrefix: sObjectPrefix.slice(0, sObjectPrefix.length - 1),
sObject: sObjectPrefix[sObjectPrefix.length - 1],
};
}
else {
output = {
sObject: sObject,
};
}
if (ctx.alias && ctx.alias[0]) {
output.alias = ctx.alias[0].image;
}
return output;
};
SOQLVisitor.prototype.usingScopeClause = function (ctx) {
return ctx.UsingScopeEnumeration[0].image;
};
SOQLVisitor.prototype.whereClauseSubqueryIdentifier = function (ctx) {
return this.visit(ctx.selectStatement, { isSubquery: false });
};
SOQLVisitor.prototype.whereClause = function (ctx) {
var _this = this;
var where = ctx.conditionExpression.reduce(function (expressions, currExpression) {
var tempExpression;
if (!expressions.expressionTree) {
tempExpression = _this.visit(currExpression);
expressions.expressionTree = tempExpression;
}
else {
tempExpression = _this.visit(currExpression, { prevExpression: expressions.prevExpression });
expressions.prevExpression.right = tempExpression;
}
var currentRightExpression = tempExpression.right;
var nextRightExpression = tempExpression.right;
while ((0, utils_1.isWhereClauseWithRightCondition)(nextRightExpression)) {
currentRightExpression = nextRightExpression;
nextRightExpression = nextRightExpression.right;
}
expressions.prevExpression = nextRightExpression || tempExpression;
return expressions;
}, { prevExpression: undefined, expressionTree: undefined });
return where.expressionTree;
};
SOQLVisitor.prototype.conditionExpression = function (ctx, options) {
var _this = this;
options = options || {};
if (options.prevExpression && ctx.logicalOperator) {
options.prevExpression.operator = ctx.logicalOperator[0].tokenType.name;
}
var baseExpression = {};
var currExpression = baseExpression;
if (Array.isArray(ctx.expressionNegation)) {
if (ctx.expressionNegation.length === 1) {
baseExpression = this.visit(ctx.expressionNegation);
currExpression = baseExpression.right;
}
else {
baseExpression = this.visit(ctx.expressionNegation[0]);
var currNestedExpression_1 = baseExpression;
ctx.expressionNegation.slice(1).forEach(function (item) {
currNestedExpression_1.right = _this.visit(item);
currExpression = currNestedExpression_1.right.right;
});
}
}
currExpression.left = this.visit(ctx.expression);
return baseExpression;
};
SOQLVisitor.prototype.withClause = function (ctx) {
if (ctx.withSecurityEnforced) {
return {
withSecurityEnforced: true,
};
}
if (ctx.withAccessLevel) {
return {
withAccessLevel: ctx.withAccessLevel[0].image,
};
}
return {
withDataCategory: {
conditions: this.visit(ctx.withDataCategory),
},
};
};
SOQLVisitor.prototype.withDataCategory = function (ctx) {
var _this = this;
return ctx.withDataCategoryArr.map(function (item) { return _this.visit(item); });
};
SOQLVisitor.prototype.withDataCategoryArr = function (ctx) {
return {
groupName: ctx.dataCategoryGroupName[0].image,
selector: ctx.filteringSelector[0].image,
parameters: ctx.dataCategoryName.map(function (item) { return item.image; }),
};
};
SOQLVisitor.prototype.groupByClause = function (ctx) {
var _this = this;
return ctx.groupBy.map(function (groupBy) { return ((0, utils_1.isToken)(groupBy) ? { field: groupBy.image } : { fn: _this.visit(groupBy, { includeType: false }) }); });
};
SOQLVisitor.prototype.havingClause = function (ctx) {
var _this = this;
var having = ctx.conditionExpression.reduce(function (expressions, currExpression) {
if (!expressions.expressionTree) {
expressions.expressionTree = _this.visit(currExpression);
expressions.prevExpression = expressions.expressionTree;
}
else {
expressions.prevExpression.right = _this.visit(currExpression, {
prevExpression: expressions.prevExpression,
});
expressions.prevExpression = expressions.prevExpression.right;
}
return expressions;
}, { prevExpression: undefined, expressionTree: undefined });
return having.expressionTree;
};
SOQLVisitor.prototype.orderByClause = function (ctx) {
var _this = this;
return ctx.orderByExpressionOrFn.map(function (item) { return _this.visit(item); });
};
SOQLVisitor.prototype.orderByExpression = function (ctx) {
var orderByClause = {
field: ctx.Identifier[0].image,
};
if (ctx.order && ctx.order[0]) {
orderByClause.order = ctx.order[0].tokenType.name;
}
if (ctx.nulls && ctx.nulls[0]) {
orderByClause.nulls = ctx.nulls[0].tokenType.name;
}
return orderByClause;
};
SOQLVisitor.prototype.orderByGroupingFunctionExpression = function (ctx) {
var orderByClause = {
fn: this.helpers.$_getFieldFunction(ctx, false, false),
};
if (ctx.order && ctx.order[0]) {
orderByClause.order = ctx.order[0].tokenType.name;
}
if (ctx.nulls && ctx.nulls[0]) {
orderByClause.nulls = ctx.nulls[0].tokenType.name;
}
return orderByClause;
};
SOQLVisitor.prototype.orderBySpecialFunctionExpression = function (ctx) {
var orderByClause = {};
if (ctx.aggregateFunction) {
orderByClause.fn = this.visit(ctx.aggregateFunction, { includeType: false });
}
else if (ctx.dateFunction) {
orderByClause.fn = this.visit(ctx.dateFunction, { includeType: false });
}
else if (ctx.locationFunction) {
orderByClause.fn = this.visit(ctx.locationFunction, { includeType: false });
}
if (ctx.order && ctx.order[0]) {
orderByClause.order = ctx.order[0].tokenType.name;
}
if (ctx.nulls && ctx.nulls[0]) {
orderByClause.nulls = ctx.nulls[0].tokenType.name;
}
return orderByClause;
};
SOQLVisitor.prototype.limitClause = function (ctx) {
return ctx.value[0].image;
};
SOQLVisitor.prototype.offsetClause = function (ctx) {
return ctx.value[0].image;
};
SOQLVisitor.prototype.dateFunction = function (ctx, options) {
if (options === void 0) { options = { includeType: true }; }
return this.helpers.$_getFieldFunction(ctx, true, options.includeType);
};
SOQLVisitor.prototype.aggregateFunction = function (ctx, options) {
if (options === void 0) { options = { includeType: true }; }
return this.helpers.$_getFieldFunction(ctx, true, options.includeType);
};
SOQLVisitor.prototype.fieldsFunction = function (ctx, options) {
if (options === void 0) { options = { includeType: true }; }
var output = {};
if (options.includeType) {
output.type = 'FieldFunctionExpression';
}
output = __assign(__assign({}, output), {
functionName: 'FIELDS',
parameters: [ctx.params[0].image],
});
output.rawValue = "FIELDS(".concat(output.parameters[0], ")");
return output;
};
SOQLVisitor.prototype.otherFunction = function (ctx, options) {
if (options === void 0) { options = { includeType: true }; }
return this.helpers.$_getFieldFunction(ctx, false, options.includeType);
};
SOQLVisitor.prototype.cubeFunction = function (ctx) {
return this.helpers.$_getFieldFunction(ctx, false, false);
};
SOQLVisitor.prototype.rollupFunction = function (ctx) {
return this.helpers.$_getFieldFunction(ctx, false, false);
};
SOQLVisitor.prototype.locationFunction = function (ctx, options) {
if (options === void 0) { options = { includeType: true }; }
var output = {};
if (options.includeType) {
output.type = 'FieldFunctionExpression';
}
output = __assign(__assign({}, output), {
functionName: 'DISTANCE',
parameters: [
ctx.location1[0].image,
(0, utils_1.isToken)(ctx.location2) ? ctx.location2[0].image : this.visit(ctx.location2, options),
ctx.unit[0].image,
],
});
if (options.includeType) {
output.isAggregateFn = true;
}
output.rawValue = "DISTANCE(".concat(output.parameters[0], ", ").concat((0, utils_1.isString)(output.parameters[1]) ? output.parameters[1] : output.parameters[1].rawValue, ", ").concat(output.parameters[2], ")");
return output;
};
SOQLVisitor.prototype.geolocationFunction = function (ctx, options) {
if (options === void 0) { options = { includeType: true }; }
var output = {};
if (options.includeType) {
output.type = 'FieldFunctionExpression';
}
output = __assign(__assign({}, output), {
functionName: 'GEOLOCATION',
parameters: [ctx.latitude[0].image, ctx.longitude[0].image],
rawValue: "GEOLOCATION(".concat(ctx.latitude[0].image, ", ").concat(ctx.longitude[0].image, ")"),
});
return output;
};
SOQLVisitor.prototype.functionExpression = function (ctx, options) {
var _this = this;
if (options === void 0) { options = { includeType: true }; }
if (ctx.params) {
return ctx.params.map(function (item) {
if (item.image) {
return item.image;
}
return _this.visit(item, options);
});
}
return [];
};
SOQLVisitor.prototype.expression = function (ctx) {
var _a = this.visit(ctx.operator, { returnLiteralType: true }), value = _a.value, literalType = _a.literalType, dateLiteralVariable = _a.dateLiteralVariable, operator = _a.operator;
var output = {};
if ((0, utils_1.isToken)(ctx.lhs)) {
output.field = ctx.lhs[0].image;
}
else {
output.fn = this.visit(ctx.lhs, { includeType: false });
}
output.operator = operator;
output.literalType = literalType;
if (literalType === 'SUBQUERY') {
output.valueQuery = value;
}
else {
output.value = value;
}
if (dateLiteralVariable) {
output.dateLiteralVariable = dateLiteralVariable;
}
if (ctx.L_PAREN) {
output.openParen = ctx.L_PAREN.length;
}
if (ctx.R_PAREN) {
output.closeParen = ctx.R_PAREN.length;
}
return output;
};
SOQLVisitor.prototype.expressionPartWithNegation = function (ctx) {
var output = {
left: ctx.L_PAREN ? { openParen: ctx.L_PAREN.length } : null,
operator: 'NOT',
right: {
left: {},
},
};
return output;
};
SOQLVisitor.prototype.expressionWithRelationalOperator = function (ctx) {
if (ctx.relationalOperator) {
return __assign({ operator: this.visit(ctx.relationalOperator) }, this.visit(ctx.rhs, { returnLiteralType: true }));
}
return __assign({ operator: this.visit(ctx.setOperator) }, this.visit(ctx.rhs, { returnLiteralType: true }));
};
SOQLVisitor.prototype.expressionWithSetOperator = function (ctx) {
if (ctx.relationalOperator) {
return __assign({ operator: this.visit(ctx.relationalOperator) }, this.visit(ctx.rhs, { returnLiteralType: true }));
}
return __assign({ operator: this.visit(ctx.setOperator) }, this.visit(ctx.rhs, { returnLiteralType: true }));
};
SOQLVisitor.prototype.atomicExpression = function (ctx, options) {
var _this = this;
options = options || {};
var value;
var literalType;
var dateLiteralVariable;
if (ctx.apexBindVariableExpression) {
value = this.visit(ctx.apexBindVariableExpression);
literalType = 'APEX_BIND_VARIABLE';
}
else if (ctx.jitterbitVariableExpression) {
var data = ctx.jitterbitVariableExpression[0];
value = {
text: data.image,
variable: data.payload.variable,
defaultValue: data.payload.defaultValue,
};
literalType = 'JITTERBIT_VARIABLE';
}
else if (ctx.NumberIdentifier) {
value = ctx.NumberIdentifier[0].image;
literalType = this.helpers.$_getLiteralTypeFromTokenType(ctx.NumberIdentifier[0].tokenType.name);
}
else if (ctx.UnsignedInteger) {
value = ctx.UnsignedInteger[0].image;
literalType = 'INTEGER';
}
else if (ctx.SignedInteger) {
value = ctx.SignedInteger[0].image;
literalType = 'INTEGER';
}
else if (ctx.RealNumber) {
value = ctx.RealNumber[0].image;
literalType = 'DECIMAL';
}
else if (ctx.DateIdentifier) {
value = ctx.DateIdentifier[0].image;
literalType = this.helpers.$_getLiteralTypeFromTokenType(ctx.DateIdentifier[0].tokenType.name);
}
else if (ctx.CurrencyPrefixedInteger) {
value = ctx.CurrencyPrefixedInteger[0].image;
literalType = 'INTEGER_WITH_CURRENCY_PREFIX';
}
else if (ctx.CurrencyPrefixedDecimal) {
value = ctx.CurrencyPrefixedDecimal[0].image;
literalType = 'DECIMAL_WITH_CURRENCY_PREFIX';
}
else if (ctx.DateTime) {
value = ctx.DateTime[0].image;
literalType = 'DATETIME';
}
else if (ctx.date) {
value = ctx.DateToken[0].image;
literalType = 'DATE';
}
else if (ctx.NULL) {
value = 'NULL';
literalType = 'NULL';
}
else if (ctx.StringIdentifier) {
value = ctx.StringIdentifier[0].image;
literalType = 'STRING';
}
else if (ctx.Identifier) {
value = ctx.Identifier[0].image;
literalType = 'STRING';
}
else if (ctx.booleanValue) {
value = this.visit(ctx.booleanValue);
literalType = 'BOOLEAN';
}
else if (ctx.DateLiteral) {
value = ctx.DateLiteral[0].image;
literalType = 'DATE_LITERAL';
}
else if (ctx.dateNLiteral) {
var valueAndVariable = this.visit(ctx.dateNLiteral);
value = valueAndVariable.value;
dateLiteralVariable = valueAndVariable.variable;
literalType = 'DATE_N_LITERAL';
}
else if (ctx.arrayExpression) {
var arrayValues = this.visit(ctx.arrayExpression);
value = arrayValues.map(function (item) { return item.value; });
var dateLiteralTemp = arrayValues.map(function (item) { return item.variable || null; });
var hasDateLiterals = dateLiteralTemp.some(function (item) { return item !== null; });
if (new Set(arrayValues.map(function (item) { return item.type; })).size === 1) {
literalType = this.helpers.$_getLiteralTypeFromTokenType(arrayValues[0].type);
}
else {
literalType = arrayValues.map(function (item) { return _this.helpers.$_getLiteralTypeFromTokenType(item.type); });
}
if (hasDateLiterals) {
dateLiteralVariable = dateLiteralTemp;
}
literalType = literalType || 'STRING';
}
else if (ctx.whereClauseSubqueryIdentifier) {
value = this.visit(ctx.whereClauseSubqueryIdentifier);
literalType = 'SUBQUERY';
}
if (options.returnLiteralType) {
return {
value: value,
literalType: literalType,
dateLiteralVariable: dateLiteralVariable,
};
}
else {
return value;
}
};
SOQLVisitor.prototype.apexBindVariableExpression = function (ctx) {
var _this = this;
return ctx.apex.map(function (item) { return _this.visit(item); }).join('.');
};
SOQLVisitor.prototype.apexBindVariableIdentifier = function (ctx) {
var output = ctx.Identifier[0].image;
if (ctx.apexBindVariableFunctionArrayAccessor) {
output += this.visit(ctx.apexBindVariableFunctionArrayAccessor[0]);
}
return output;
};
SOQLVisitor.prototype.apexBindVariableNewInstantiation = function (ctx) {
var output = "new ".concat(ctx.function[0].image);
if (ctx.apexBindVariableGeneric) {
output += this.visit(ctx.apexBindVariableGeneric[0]);
}
output += this.visit(ctx.apexBindVariableFunctionParams[0]);
if (ctx.apexBindVariableFunctionArrayAccessor) {
output += this.visit(ctx.apexBindVariableFunctionArrayAccessor[0]);
}
return output;
};
SOQLVisitor.prototype.apexBindVariableFunctionCall = function (ctx) {
var output = "".concat(ctx.function[0].image).concat(this.visit(ctx.apexBindVariableFunctionParams[0]));
if (ctx.apexBindVariableFunctionArrayAccessor) {
output += this.visit(ctx.apexBindVariableFunctionArrayAccessor[0]);
}
return output;
};
SOQLVisitor.prototype.apexBindVariableGeneric = function (ctx) {
return "<".concat(ctx.parameter.map(function (item) { return item.image; }).join(', '), ">");
};
SOQLVisitor.prototype.apexBindVariableFunctionParams = function (ctx) {
var params = Array.isArray(ctx.parameter) ? ctx.parameter : [];
return "(".concat(params.map(function (item) { return item.image; }).join(', '), ")");
};
SOQLVisitor.prototype.apexBindVariableFunctionArrayAccessor = function (ctx) {
return "[".concat(ctx.value[0].image, "]");
};
SOQLVisitor.prototype.arrayExpression = function (ctx) {
var _this = this;
return ctx.value.map(function (item) {
if ((0, utils_1.isToken)(item)) {
return {
type: item.tokenType.name,
value: item.image,
};
}
return _this.visit(item, { includeType: true });
});
};
SOQLVisitor.prototype.relationalOperator = function (ctx) {
return ctx.operator[0].image;
};
SOQLVisitor.prototype.setOperator = function (ctx) {
if (Array.isArray(ctx.operator)) {
return ctx.operator[0].tokenType.name.replace('_', ' ');
}
if (Array.isArray(ctx.notIn)) {
return this.visit(ctx.notIn);
}
};
SOQLVisitor.prototype.notInOperator = function (ctx) {
return 'NOT IN';
};
SOQLVisitor.prototype.booleanValue = function (ctx) {
return ctx.boolean[0].tokenType.name;
};
SOQLVisitor.prototype.dateNLiteral = function (ctx, options) {
var output = {
value: "".concat(ctx.dateNLiteral[0].image, ":").concat(ctx.variable[0].image),
variable: Number(ctx.variable[0].image),
};
if (options && options.includeType) {
output.type = ctx.dateNLiteral[0].tokenType.name;
}
return output;
};
SOQLVisitor.prototype.forViewOrReference = function (ctx) {
return ctx.value[0].tokenType.name;
};
SOQLVisitor.prototype.updateTrackingViewstat = function (ctx) {
return ctx.value[0].tokenType.name;
};
return SOQLVisitor;
}(BaseSoqlVisitor));
var visitor = new SOQLVisitor();
function parseQuery(soql, options) {
var cst = (0, parser_1.parse)(soql, options).cst;
var query = visitor.visit(cst);
return query;
}
exports.parseQuery = parseQuery;
function isQueryValid(soql, options) {
try {
var parseErrors = (0, parser_1.parse)(soql, options).parseErrors;
return parseErrors.length === 0 ? true : false;
}
catch (ex) {
return false;
}
}
exports.isQueryValid = isQueryValid;