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)

84 lines (82 loc) 4.3 kB
$C('$data.storageProviders.mongoDB.mongoDBOrderCompiler', $data.storageProviders.mongoDB.mongoDBFilterCompiler, null, { constructor: function (provider, lambdaPrefix, compiler) { this.provider = provider; }, compile: function (expression, context) { this.Visit(expression, context); }, VisitOrderExpression: function (expression, context) { context.data = ''; this.Visit(expression.selector, context); if (!(context.include || context).options.sort) (context.include || context).options.sort = {}; (context.include || context).options.sort[context.includeSort || context.data] = expression.nodeType == $data.Expressions.ExpressionType.OrderByDescending ? -1 : 1; delete context.data; delete context.include; delete context.includeSort; delete context.includeOptions; }, VisitParametricQueryExpression: function (expression, context) { this.Visit(expression.expression, context); }, VisitEntityFieldExpression: function (expression, context) { this.Visit(expression.source, context); this.Visit(expression.selector, context); }, VisitComplexTypeExpression: function (expression, context) { this.Visit(expression.source, context); if (context.data) context.data += '.'; this.Visit(expression.selector, context); }, VisitEntitySetExpression: function (expression, context) { if (expression.selector instanceof $data.Expressions.AssociationInfoExpression) { this.Visit(expression.source, context); this.Visit(expression.selector, context); } }, VisitAssociationInfoExpression: function (expression, context) { this.includes = this.includes || []; var from = context.include ? context.include.name + '.' + expression.associationInfo.FromPropertyName : expression.associationInfo.FromPropertyName; var includeFragment = from.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 (context.include && i < includeFragment.length - 1){ if (!context.include.options.sort) context.include.options.sort = {}; context.includeSort += includeFragment[i]; } if (inc.length) { context.includeOptions = inc[0].options; context.include = inc[0]; context.includeSort = tempData; }else{ var inc = { name: tempData, type: association.ToType, from: association.FromType, query: {}, options: {}, mapped: false }; context.includeOptions = inc.options; context.include = inc; context.includeSort = tempData; this.includes.push(inc); } } else { Guard.raise(new Exception("The given include path is invalid: " + expression.associationInfo.FromPropertyName + ", invalid point: " + tempData)); } storageModel = this.mainEntitySet.entityContext._storageModel.getStorageModel(association.ToType); } }, VisitEntityExpression: function (expression, context) { this.Visit(expression.source, context); this.Visit(expression.selector, context); }, VisitMemberInfoExpression: function (expression, context) { if (context.includeSort !== undefined){ if (context.includeSort) context.includeSort += '.'; context.includeSort += expression.memberDefinition.computed ? '_id' : expression.memberName; }else{ if (context.data) context.data += '.'; context.data += expression.memberDefinition.computed ? '_id' : expression.memberName; } } });