UNPKG

jaydata-mongodb

Version:

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

169 lines (150 loc) 6.91 kB
$C('$data.storageProviders.mongoDB.mongoDBFunctionCompiler', $data.Expressions.EntityExpressionVisitor, null, { constructor: function (provider, lambdaPrefix, compiler) { this.provider = provider; if (compiler){ this.compiler = compiler; this.includes = compiler.includes; this.mainEntitySet = compiler.mainEntitySet; } }, compile: function (expression, context) { this.Visit(expression, context); }, VisitParametricQueryExpression: function (expression, context) { this.Visit(expression.expression, context); }, VisitUnaryExpression: function (expression, context) { context.data += this.provider.supportedBinaryOperators[expression.resolution.name].mapTo; context.data += "("; this.Visit(expression.operand, context); context.data += ")"; }, VisitSimpleBinaryExpression: function (expression, context) { if (expression.resolution.reverse) { context.data += "("; var right = this.Visit(expression.right, context); context.data += this.provider.supportedBinaryOperators[expression.resolution.name].mapTo; var left = this.Visit(expression.left, context); if (expression.resolution.rightValue) context.data += expression.resolution.rightValue; context.data += ")"; } else { context.data += "("; var left = this.Visit(expression.left, context); context.data += this.provider.supportedBinaryOperators[expression.resolution.name].mapTo; var right = this.Visit(expression.right, context); context.data += ")"; } }, VisitConstantExpression: function (expression, context) { var type = Container.resolveType(expression.type); var typeName = Container.resolveName(type); context.data += this.provider.fieldConverter.toDb[typeName](expression.value); }, VisitMemberInfoExpression: function (expression, context) { var member = context.data.slice(context.data.lastIndexOf('(') + 1); if (Container.resolveType(expression.memberDefinition.type) == $data.ObjectID){ context.data += expression.memberDefinition.computed ? '_id ? ' + member + '_id.toString() : ' + member + '_id)' : expression.memberName + ' ? ' + member + expression.memberName + '.toString() : ' + member + expression.memberName + ')'; }else{ context.data += expression.memberDefinition.computed ? '_id)' : expression.memberName + ')'; } }, VisitComplexTypeExpression: function (expression, context) { this.Visit(expression.source, context); this.Visit(expression.selector, context); context.data += "."; }, VisitEntityExpression: function (expression, context) { this.Visit(expression.source, context); context.entityType = expression.entityType; if (expression.selector.lambda){ context.data += '(' + expression.selector.lambda + '.'; context.lambda = expression.selector.lambda; } }, VisitEntitySetExpression: function (expression, context) { this.Visit(expression.source, context); if (expression.selector instanceof $data.Expressions.AssociationInfoExpression) { this.Visit(expression.selector, context); } }, VisitObjectLiteralExpression: function (expression, context) { context.data += '{ '; for (var i = 0; i < expression.members.length; i++) { var member = expression.members[i]; if (i > 0) context.data += ', '; this.Visit(member, context); } context.data += ' }'; }, VisitObjectFieldExpression: function (expression, context) { context.data += expression.fieldName + ': '; this.Visit(expression.expression, context); }, VisitAssociationInfoExpression: function(expression, context){ context.data += expression.associationInfo.FromPropertyName + '.'; }, VisitEntityFieldOperationExpression: function (expression, context) { Guard.requireType("expression.operation", expression.operation, $data.Expressions.MemberInfoExpression); var opDef = expression.operation.memberDefinition; opDef = this.provider.supportedFieldOperations[opDef.name]; if (opDef.propertyFunction) { this.Visit(expression.source, context); context.data += '.'; } var opName = opDef.mapTo || opDef.name; context.data += opName; var paramCounter = 0; var params = opDef.parameters || []; 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 (arg) { if (index > 0) { context.data += ","; }; this.Visit(arg, context); } }, this); context.data += opDef.rightValue || ""; }, VisitFrameOperationExpression: function (expression, context) { var self = this; this.Visit(expression.source, context); Guard.requireType("expression.operation", expression.operation, $data.Expressions.MemberInfoExpression); 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 (arg && arg.value instanceof $data.Queryable) { var frameExpression = new opDef.frameType(arg.value.expression); var preparator = new $data.Expressions.QueryExpressionCreator(arg.value.entityContext); var prep_expression = preparator.Visit(frameExpression); var compiler = new (self.constructor)(this.provider, true); var frameContext = { data: "" }; var compiled = compiler.compile(prep_expression, frameContext); context.data += ('function(' + frameContext.lambda + '){ return ' + frameContext.data + '; }'); }else context.data += 'function(){ return true; }'; } context.data += "))"; } });