jaydata
Version:
Cross-platform HTML5 data-management, JavaScript Language Query (JSLQ) support for OData, SQLite, WebSQL, IndexedDB, YQL and Facebook (packaged for Node.JS)
179 lines (159 loc) • 8.62 kB
JavaScript
'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.oDataProjectionCompiler', _core2.default.Expressions.EntityExpressionVisitor, null, {
constructor: function constructor(provider) {
this.provider = provider;
this.entityContext = provider.context;
this.hasObjectLiteral = false;
this.modelBinderMapping = [];
},
compile: function compile(expression, context) {
this.Visit(expression, context);
},
VisitProjectionExpression: function VisitProjectionExpression(expression, context) {
///<summary></summary>
///<param name="expression" type="$data.Expressions.ProjectionExpression" mayBeNull="false"></param>
///<param name="context" mayBeNull="false"></param>
context.data = "";
this.mapping = [];
this.Visit(expression.selector, context);
if (context['$select']) {
context['$select'] += ',';
} else {
context['$select'] = '';
}
context["$select"] += context.data;
context.data = "";
},
VisitParametricQueryExpression: function VisitParametricQueryExpression(expression, context) {
this.Visit(expression.expression, context);
var m = this.mapping.slice();
if (!(expression.expression instanceof _core2.default.Expressions.EntityExpression) && !(expression.expression instanceof _core2.default.Expressions.EntitySetExpression)) {
m.pop();
}
if (m.length > 0) {
if (!context['$expand'] || !(context['$expand'] instanceof _core2.default.storageProviders.oData.ODataIncludeFragment)) {
context['$expand'] = new _core2.default.storageProviders.oData.ODataIncludeFragment();
}
context['$expand'].addInclude(m);
}
},
VisitObjectLiteralExpression: function VisitObjectLiteralExpression(expression, context) {
///<summary></summary>
///<param name="expression" type="$data.Expressions.ObjectLiteralExpression" mayBeNull="false"></param>
///<param name="context" mayBeNull="false"></param>
this.hasObjectLiteral = true;
expression.members.forEach(function (member, index) {
this.Visit(member, context);
if (index < expression.members.length - 1) {
context.data += ',';
}
this.mapping = [];
}, this);
},
VisitObjectFieldExpression: function VisitObjectFieldExpression(expression, context) {
this.Visit(expression.expression, context);
var m = this.mapping.slice();
var propertyName = "";
if (!(expression.expression instanceof _core2.default.Expressions.EntityExpression) && !(expression.expression instanceof _core2.default.Expressions.EntitySetExpression)) {
propertyName = m.pop();
}
if (m.length > 0) {
if (!context['$expand'] || !(context['$expand'] instanceof _core2.default.storageProviders.oData.ODataIncludeFragment)) {
context['$expand'] = new _core2.default.storageProviders.oData.ODataIncludeFragment();
}
if (expression.expression instanceof _core2.default.Expressions.EntityFieldExpression && expression.expression.selector instanceof _core2.default.Expressions.MemberInfoExpression) {
var storageModel = this.entityContext._storageModel.getStorageModel(expression.expression.selector.memberDefinition.definedBy);
if (!storageModel) return;
var isComplexProperty = storageModel && !!storageModel.ComplexTypes[expression.memberName];
if (isComplexProperty) {
var complexProperty = m.pop();
context['$expand'].addImplicitMap(m, complexProperty);
return;
}
}
if (expression.expression instanceof _core2.default.Expressions.ComplexTypeExpression) {
context['$expand'].addImplicitMap(m, propertyName);
} else {
context['$expand'].addInclude(m);
}
}
},
VisitComplexTypeExpression: function VisitComplexTypeExpression(expression, context) {
this.Visit(expression.source, context);
this.Visit(expression.selector, context);
},
VisitEntityFieldExpression: function VisitEntityFieldExpression(expression, context) {
this.Visit(expression.source, context);
this.Visit(expression.selector, context);
},
VisitEntityExpression: function VisitEntityExpression(expression, context) {
///<summary></summary>
///<param name="expression" type="$data.Expressions.EntityExpression" mayBeNull="false"></param>
///<param name="context" mayBeNull="false"></param>
this.Visit(expression.source, context);
},
VisitEntitySetExpression: function VisitEntitySetExpression(expression, context) {
///<summary></summary>
///<param name="expression" type="$data.Expressions.EntitySetExpression" mayBeNull="false"></param>
///<param name="context" mayBeNull="false"></param>
if (expression.source instanceof _core2.default.Expressions.EntityExpression) {
this.Visit(expression.source, context);
}
if (expression.selector instanceof _core2.default.Expressions.AssociationInfoExpression) {
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;
}
this.mapping.push(propName);
if (context.data && context.data.length > 0 && context.data[context.data.length - 1] != ',') {
if (!context['$expand'] || !(context['$expand'] instanceof _core2.default.storageProviders.oData.ODataIncludeFragment)) {
context['$expand'] = new _core2.default.storageProviders.oData.ODataIncludeFragment();
}
context['$expand'].addInclude(this.mapping);
} else {
context.data += propName;
}
},
VisitMemberInfoExpression: function VisitMemberInfoExpression(expression, context) {
var storageModel = this.entityContext._storageModel.getStorageModel(expression.memberDefinition.definedBy);
var isComplexProperty = storageModel && !!storageModel.ComplexTypes[expression.memberName];
var isComplexField = !storageModel;
var propName = expression.memberName;
if (this.entityContext._storageModel.getStorageModel(expression.memberDefinition.definedBy.inheritsFrom)) {
propName = expression.memberDefinition.definedBy.fullName + "/" + propName;
}
if (context.data && context.data.length > 0 && context.data[context.data.length - 1] != ',') {
if (this.mapping) {
if (!context['$expand'] || !(context['$expand'] instanceof _core2.default.storageProviders.oData.ODataIncludeFragment)) {
context['$expand'] = new _core2.default.storageProviders.oData.ODataIncludeFragment();
}
if (isComplexField) {
var m = this.mapping.slice();
var complexProperty = m.pop();
if (this.provider.checkODataMode("disableCompltexTypeMapping")) {
context['$expand'].addImplicitMap(m, complexProperty);
} else {
context['$expand'].addImplicitMap(m, complexProperty + "/" + expression.memberName);
}
} else if (!isComplexProperty) {
context['$expand'].addImplicitMap(this.mapping, expression.memberName);
}
}
} else {
context.data += propName;
}
this.mapping.push(propName);
},
VisitConstantExpression: function VisitConstantExpression(expression, context) {
//Guard.raise(new Exception('Constant value is not supported in Projection.', 'Not supported!'));
//context.data += expression.value;
context.data = context.data.slice(0, context.data.length - 1);
}
});