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)

163 lines (140 loc) 8.29 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.mongoDB.mongoDBCompiler', _core2.default.Expressions.EntityExpressionVisitor, null, { constructor: function constructor() { this.context = {}; this.provider = {}; this.includes = []; this.mainEntitySet = null; }, compile: function compile(query) { this.provider = query.context.storageProvider; this.context = query.context; this.mainEntitySet = query.context.getEntitySetFromElementType(query.defaultType); this.query = query; query.find = { query: {}, options: {} }; this.Visit(query.expression, query.find); query.includes = this.includes; query.modelBinderConfig = {}; var modelBinder = new _core2.default.modelBinder.mongoDBModelBinderConfigCompiler(query, this.includes.filter(function (it) { return it.mapped; }), true); modelBinder.Visit(query.expression); delete query.find.field; delete query.find.value; delete query.find.data; delete query.find.stack; delete query.find.or; return query; }, VisitOrderExpression: function VisitOrderExpression(expression, context) { this.Visit(expression.source, context); var orderCompiler = new _core2.default.storageProviders.mongoDB.mongoDBOrderCompiler(this.provider, null, this); orderCompiler.compile(expression, context); }, VisitPagingExpression: function VisitPagingExpression(expression, context) { this.Visit(expression.source, context); var pagingCompiler = new _core2.default.storageProviders.mongoDB.mongoDBPagingCompiler(); pagingCompiler.compile(expression, context); }, VisitFilterExpression: function VisitFilterExpression(expression, context) { this.Visit(expression.source, context); var self = this; var filterCompiler = new _core2.default.storageProviders.mongoDB.mongoDBFilterCompiler(this.provider, null, self); context.data = ""; filterCompiler.compile(expression.selector, context); if (this.includes && this.includes.length) { context.data = ""; context.lambda = ""; var funcCompiler = new _core2.default.storageProviders.mongoDB.mongoDBFunctionCompiler({ supportedBinaryOperators: { equal: { mapTo: ' == ', dataType: "boolean", allowedIn: [_core2.default.Expressions.FilterExpression, _core2.default.Expressions.OrderExpression] }, notEqual: { mapTo: ' != ', dataType: "boolean", allowedIn: [_core2.default.Expressions.FilterExpression, _core2.default.Expressions.OrderExpression] }, equalTyped: { mapTo: ' === ', dataType: "boolean", allowedIn: [_core2.default.Expressions.FilterExpression, _core2.default.Expressions.OrderExpression] }, notEqualTyped: { mapTo: ' !== ', dataType: "boolean", allowedIn: [_core2.default.Expressions.FilterExpression, _core2.default.Expressions.OrderExpression] }, greaterThan: { mapTo: ' > ', dataType: "boolean", allowedIn: [_core2.default.Expressions.FilterExpression, _core2.default.Expressions.OrderExpression] }, greaterThanOrEqual: { mapTo: ' >= ', dataType: "boolean", allowedIn: [_core2.default.Expressions.FilterExpression, _core2.default.Expressions.OrderExpression] }, lessThan: { mapTo: ' < ', dataType: "boolean", allowedIn: [_core2.default.Expressions.FilterExpression, _core2.default.Expressions.OrderExpression] }, lessThenOrEqual: { mapTo: ' <= ', dataType: "boolean", allowedIn: [_core2.default.Expressions.FilterExpression, _core2.default.Expressions.OrderExpression] }, or: { mapTo: ' || ', dataType: "boolean", allowedIn: [_core2.default.Expressions.FilterExpression, _core2.default.Expressions.OrderExpression] }, and: { mapTo: ' && ', dataType: "boolean", allowedIn: [_core2.default.Expressions.FilterExpression, _core2.default.Expressions.OrderExpression] }, "in": { mapTo: ".indexOf(", allowedIn: [_core2.default.Expressions.FilterExpression], rightValue: ') > -1', reverse: true } }, supportedUnaryOperators: { not: { mapTo: '!' } }, supportedFieldOperations: { contains: { mapTo: "$data.StringFunctions.contains(", rightValue: ")", dataType: "boolean", parameters: [{ name: "@expression", dataType: "string" }, { name: "strFragment", dataType: "string" }] }, startsWith: { mapTo: "$data.StringFunctions.startsWith(", rightValue: ")", dataType: "boolean", parameters: [{ name: "@expression", dataType: "string" }, { name: "strFragment", dataType: "string" }] }, endsWith: { mapTo: "$data.StringFunctions.endsWith(", rightValue: ")", dataType: "boolean", parameters: [{ name: "@expression", dataType: "string" }, { name: "strFragment", dataType: "string" }] } }, fieldConverter: { toDb: _core2.default.typeSystem.extend({ '$data.ObjectID': function $dataObjectID(id) { return id ? 'atob("' + id.toString() + '")' : id; } }, _core2.default.InMemoryConverter.escape) } }, null, this); funcCompiler.compile(expression.selector, context); context.filter = new Function(context.lambda, 'return ' + context.data + ';'); context.data = ""; context.lambda = ""; } }, VisitProjectionExpression: function VisitProjectionExpression(expression, context) { this.Visit(expression.source, context); var projectionCompiler = new _core2.default.storageProviders.mongoDB.mongoDBProjectionCompiler(this.provider, null, this); projectionCompiler.compile(expression, context); }, VisitIncludeExpression: function VisitIncludeExpression(expression, context) { this.Visit(expression.source, context); this.includes = this.includes || []; var includeFragment = expression.selector.value.split('.'); var tempData = null; var storageModel = this.mainEntitySet.entityContext._storageModel.getStorageModel(this.mainEntitySet.createNew); for (var i = 0; i < includeFragment.length; i++) { if (tempData) { tempData += '.' + includeFragment[i]; } else { tempData = includeFragment[i]; } var association = storageModel.Associations[includeFragment[i]]; if (association) { var inc = this.includes.filter(function (include) { return include.name == tempData; }, this); if (inc.length) { inc[0].mapped = true; } else { this.includes.push({ name: tempData, type: association.ToType, from: association.FromType, query: {}, options: {}, mapped: true }); } } else { _core.Guard.raise(new _core.Exception("The given include path is invalid: " + expression.selector.value + ", invalid point: " + tempData)); } storageModel = this.mainEntitySet.entityContext._storageModel.getStorageModel(association.ToType); } }, VisitInlineCountExpression: function VisitInlineCountExpression(expression, context) { this.Visit(expression.source, context); this.query.withInlineCount = expression.selector == 'allpages' ? true : false; } });