UNPKG

jaydata

Version:

Cross-platform HTML5 data-management, JavaScript Language Query (JSLQ) support for OData, SQLite, WebSQL, IndexedDB, YQL and Facebook (packaged for Node.JS)

238 lines (200 loc) 9.93 kB
'use strict'; var _core = require('../../../../core.js'); var _core2 = _interopRequireDefault(_core); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } (0, _core.$C)('$data.storageProviders.oData.oDataWhereCompiler', _core2.default.Expressions.EntityExpressionVisitor, null, { constructor: function constructor(provider, lambdaPrefix) { this.provider = provider; this.entityContext = provider.context; this.lambdaPrefix = lambdaPrefix; }, compile: function compile(expression, context) { this.Visit(expression, context); }, VisitParametricQueryExpression: function VisitParametricQueryExpression(expression, context) { this.Visit(expression.expression, context); }, VisitUnaryExpression: function VisitUnaryExpression(expression, context) { context.data += expression.resolution.mapTo; context.data += "("; this.Visit(expression.operand, context); context.data += ")"; }, VisitSimpleBinaryExpression: function VisitSimpleBinaryExpression(expression, context) { context.data += "("; //TODO refactor!!! if (expression.nodeType == "in") { _core.Guard.requireType("expression.right", expression.type, _core2.default.Expressions.ConstantExpression); var paramValue = expression.right.value; if (!(paramValue instanceof Array)) { _core.Guard.raise(new _core.Exception("Right to the 'in' operator must be an array value")); } var result = null; var orResolution = { mapTo: "or", dataType: "boolean", name: "or" }; var eqResolution = { mapTo: "eq", dataType: "boolean", name: "equal" }; paramValue.forEach(function (item) { var idValue = item; var idCheck = _core.Container.createSimpleBinaryExpression(expression.left, idValue, _core2.default.Expressions.ExpressionType.Equal, "==", "boolean", eqResolution); if (result) { result = _core.Container.createSimpleBinaryExpression(result, idCheck, _core2.default.Expressions.ExpressionType.Or, "||", "boolean", orResolution); } else { result = idCheck; }; }); var temp = context.data; context.data = ''; this.Visit(result, context); context.data = temp + context.data.replace(/\(/g, '').replace(/\)/g, ''); } else { this.Visit(expression.left, context); context.data += " "; context.data += expression.resolution.mapTo; context.data += " "; this.Visit(expression.right, context); }; context.data += ")"; }, VisitEntityFieldExpression: function VisitEntityFieldExpression(expression, context) { this.Visit(expression.source, context); if (expression.source instanceof _core2.default.Expressions.ComplexTypeExpression) { context.data += "/"; } this.Visit(expression.selector, context); }, VisitAssociationInfoExpression: function VisitAssociationInfoExpression(expression, context) { var propName = expression.associationInfo.FromPropertyName; if (this.entityContext._storageModel.getStorageModel(expression.associationInfo.FromType.inheritsFrom)) { propName = expression.associationInfo.FromType.fullName + "/" + propName; } context.data += propName; }, VisitMemberInfoExpression: function VisitMemberInfoExpression(expression, context) { if (this.entityContext._storageModel.getStorageModel(expression.memberDefinition.definedBy.inheritsFrom)) { context.data += expression.memberDefinition.definedBy.fullName + "/" + expression.memberName; } else context.data += expression.memberName; }, VisitQueryParameterExpression: function VisitQueryParameterExpression(expression, context) { var typeName = _core.Container.resolveName(expression.type); var converter = this.provider.fieldConverter.toDb[typeName]; var value = converter ? converter(expression.value) : expression.value; converter = this.provider.fieldConverter.escape[typeName]; context.data += converter ? converter(value) : value; }, VisitEntityFieldOperationExpression: function VisitEntityFieldOperationExpression(expression, context) { _core.Guard.requireType("expression.operation", expression.operation, _core2.default.Expressions.MemberInfoExpression); //TODO refactor! var opDef = expression.operation.memberDefinition; var opName = opDef.mapTo || opDef.name; context.data += opName; context.data += "("; var paramCounter = 0; var params = opDef.parameters || [{ name: "@expression" }]; var args = params.map(function (item, index) { if (item.name === "@expression") { return expression.source; } else { return expression.parameters[paramCounter++]; }; }); args.forEach(function (arg, index) { if (index > 0) { context.data += ","; }; this.Visit(arg, context); }, this); context.data += ")"; }, VisitEntityFunctionOperationExpression: function VisitEntityFunctionOperationExpression(expression, context) { _core.Guard.requireType("expression.operation", expression.operation, _core2.default.Expressions.MemberInfoExpression); this.Visit(expression.source, context); //TODO refactor! var opDef = expression.operation.memberDefinition; var opName = opDef.mapTo || opDef.name; context.data += opName; context.data += "("; var paramCounter = 0; var params = opDef.method.params || [{ name: "@expression" }]; var args = params.map(function (item, index) { if (item.name === "@expression") { return expression.source; } else { return expression.parameters[paramCounter++]; }; }); var i = 0; args.forEach(function (arg, index) { if (arg === undefined || arg instanceof _core2.default.Expressions.ConstantExpression && typeof arg.value === 'undefined') return; if (i > 0) { context.data += ","; }; i++; context.data += params[index].name + '='; this.Visit(arg, context); }, this); context.data += ")"; }, VisitContextFunctionOperationExpression: function VisitContextFunctionOperationExpression(expression, context) { return this.VisitEntityFunctionOperationExpression(expression, context); }, VisitConstantExpression: function VisitConstantExpression(expression, context) { var typeName = _core.Container.resolveName(expression.type); var converter = this.provider.fieldConverter.toDb[typeName]; var value = converter ? converter(expression.value) : expression.value; converter = this.provider.fieldConverter.escape[typeName]; context.data += converter ? converter(value) : value; }, VisitEntityExpression: function VisitEntityExpression(expression, context) { this.Visit(expression.source, context); if (this.lambdaPrefix && expression.selector.lambda) { context.lambda = expression.selector.lambda; context.data += expression.selector.lambda + '/'; } //if (expression.selector instanceof $data.Expressions.EntityExpression) { // this.Visit(expression.selector, context); //} }, VisitEntitySetExpression: function VisitEntitySetExpression(expression, context) { this.Visit(expression.source, context); if (expression.selector instanceof _core2.default.Expressions.AssociationInfoExpression) { this.Visit(expression.selector, context); context.data += "/"; } }, VisitFrameOperationExpression: function VisitFrameOperationExpression(expression, context) { this.Visit(expression.source, context); _core.Guard.requireType("expression.operation", expression.operation, _core2.default.Expressions.MemberInfoExpression); //TODO refactor! var opDef = expression.operation.memberDefinition; var opName = opDef.mapTo || opDef.name; context.data += opName; context.data += "("; var paramCounter = 0; var params = opDef.parameters || [{ name: "@expression" }]; var args = params.map(function (item, index) { if (item.name === "@expression") { return expression.source; } else { return expression.parameters[paramCounter++]; }; }); for (var i = 0; i < args.length; i++) { var arg = args[i]; if (!opDef.method) { var compiler = new _core2.default.storageProviders.oData.oDataWhereCompiler(this.provider, true); var frameContext = { data: "" }; if (arg && arg.value instanceof _core2.default.Queryable) { var preparator = _core.Container.createQueryExpressionCreator(arg.value.entityContext); var prep_expression = preparator.Visit(arg.value.expression); arg = prep_expression; } else if (arg) { arg = arg.selector; } var compiled = compiler.compile(arg, frameContext); if (frameContext.data) { context.data += frameContext.lambda + ': ' + frameContext.data; } } } context.data += ")"; } });