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)

273 lines (234 loc) 11.7 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.oDataCompiler', _core2.default.Expressions.EntityExpressionVisitor, null, { constructor: function constructor() { this.context = {}; this.provider = {}; //this.logicalType = null; this.includes = null; this.mainEntitySet = null; }, compile: function compile(query) { this.provider = query.context.storageProvider; this.context = query.context; if (query.defaultType) { this.mainEntitySet = query.context.getEntitySetFromElementType(query.defaultType); } var queryFragments = { urlText: "" }; this.Visit(query.expression, queryFragments); if (queryFragments.$expand) { queryFragments.$expand = queryFragments.$expand.toString(); } query.modelBinderConfig = {}; var modelBinder = _core.Container.createModelBinderConfigCompiler(query, this.includes, true); modelBinder.Visit(query.expression); var queryText = queryFragments.urlText; var addAmp = false; if (queryFragments.$funcParams) { queryText += "(" + queryFragments.$funcParams + ")"; } for (var name in queryFragments) { if (name != "urlText" && name != "actionPack" && name != "data" && name != "lambda" && name != "method" && name != "postData" && name != "_isBatchExecuteQuery" && name != "_subQueries" && name != "$funcParams" && queryFragments[name] != "") { if (addAmp) { queryText += "&"; } else { queryText += "?"; } addAmp = true; if (name != "$urlParams") { queryText += name + '=' + queryFragments[name]; } else { queryText += queryFragments[name]; } } } query.queryText = queryText; query.postData = queryFragments.postData; var result = { queryText: queryText, withInlineCount: '$inlinecount' in queryFragments || '$count' in queryFragments, method: queryFragments.method || 'GET', postData: queryFragments.postData, isBatchExecuteQuery: queryFragments._isBatchExecuteQuery, subQueries: queryFragments._subQueries, params: [] }; query._getComplitedData = function () { return result; }; return result; }, VisitOrderExpression: function VisitOrderExpression(expression, context) { this.Visit(expression.source, context); var orderCompiler = _core.Container.createoDataOrderCompiler(this.provider); orderCompiler.compile(expression, context); }, VisitPagingExpression: function VisitPagingExpression(expression, context) { this.Visit(expression.source, context); var pagingCompiler = _core.Container.createoDataPagingCompiler(this.provider); pagingCompiler.compile(expression, context); }, VisitIncludeExpression: function VisitIncludeExpression(expression, context) { this.Visit(expression.source, context); var includeCompiler = _core.Container.createoDataIncludeCompiler(this.provider); this.includes = this.includes || []; var includeContext = { data: context["$expand"], includes: this.includes }; includeCompiler.compile(expression.selector, includeContext); context["$expand"] = includeContext.data; }, VisitFindExpression: function VisitFindExpression(expression, context) { this.Visit(expression.source, context); if (expression.subMember) { context.urlText += "/" + expression.subMember.memberName; } if (expression.params && expression.params.length > 0) { context.urlText += '('; if (expression.params.length === 1) { var param = expression.params[0]; var typeName = _core.Container.resolveName(param.type); var converter = this.provider.fieldConverter.toDb[typeName]; var value = converter ? converter(param.value) : param.value; converter = this.provider.fieldConverter.escape[typeName]; value = converter ? converter(param.value) : param.value; context.urlText += value; } else { for (var i = 0; i < expression.params.length; i++) { var param = expression.params[i]; var typeName = _core.Container.resolveName(param.type); var converter = this.provider.fieldConverter.toDb[typeName]; var value = converter ? converter(param.value) : param.value; converter = this.provider.fieldConverter.escape[typeName]; value = converter ? converter(param.value) : param.value; if (i > 0) context.urlText += ','; context.urlText += param.name + '=' + value; } } context.urlText += ')'; } }, VisitProjectionExpression: function VisitProjectionExpression(expression, context) { this.Visit(expression.source, context); var projectionCompiler = _core.Container.createoDataProjectionCompiler(this.provider); projectionCompiler.compile(expression, context); }, VisitFilterExpression: function VisitFilterExpression(expression, context) { ///<param name="expression" type="$data.Expressions.FilterExpression" /> this.Visit(expression.source, context); var filterCompiler = _core.Container.createoDataWhereCompiler(this.provider); context.data = ""; filterCompiler.compile(expression.selector, context); context["$filter"] = context.data; context.data = ""; }, VisitInlineCountExpression: function VisitInlineCountExpression(expression, context) { this.Visit(expression.source, context); if (this.provider.providerConfiguration.maxDataServiceVersion === "4.0") { context["$count"] = expression.selector.value === 'allpages'; } else { context["$inlinecount"] = expression.selector.value; } }, VisitEntitySetExpression: function VisitEntitySetExpression(expression, context) { this.Visit(expression.source, context); context.urlText += "/" + expression.instance.tableName; //this.logicalType = expression.instance.elementType; if (expression.params) { for (var i = 0; i < expression.params.length; i++) { this.Visit(expression.params[i], context); } } }, VisitServiceOperationExpression: function VisitServiceOperationExpression(expression, context) { if (expression.boundItem) { context.urlText += "/" + expression.boundItem.entitySet.tableName; if (expression.boundItem.data instanceof _core2.default.Entity) { context.urlText += '(' + this.provider.getEntityKeysValue(expression.boundItem) + ')'; } } context.urlText += "/" + (expression.cfg.namespace ? expression.cfg.namespace + "." + expression.cfg.serviceName : expression.cfg.serviceName); context.method = context.method || expression.cfg.method; //this.logicalType = expression.returnType; if (expression.params) { context.serviceConfig = expression.cfg; for (var i = 0; i < expression.params.length; i++) { this.Visit(expression.params[i], context); } delete context.serviceConfig; } }, VisitBatchDeleteExpression: function VisitBatchDeleteExpression(expression, context) { this.Visit(expression.source, context); context.urlText += '/$batchDelete'; context.method = 'DELETE'; }, VisitConstantExpression: function VisitConstantExpression(expression, context) { var typeName = _core.Container.resolveName(expression.type); if (expression.value instanceof _core2.default.Entity) typeName = _core2.default.Entity.fullName; var converter = this.provider.fieldConverter.toDb[typeName]; var value = converter ? converter(expression.value, expression) : expression.value; if (context.method === 'GET' || !context.method) { converter = this.provider.fieldConverter.escape[typeName]; value = converter ? converter(value, expression) : value; if (value !== undefined) { var serviceConfig = context.serviceConfig || {}; var paramConfig = serviceConfig && serviceConfig.params.filter(function (p) { return p.name == expression.name; })[0] || {}; var useAlias = serviceConfig.namespace && (paramConfig.useAlias || serviceConfig.useAlias || this.provider.providerConfiguration.useParameterAlias || _core2.default.defaults.OData.useParameterAlias); var paramValue = useAlias ? "@" + expression.name : value; var paramName = (useAlias ? "@" : "") + expression.name; if (context['$funcParams']) { context['$funcParams'] += ','; } else { context['$funcParams'] = ''; } context['$funcParams'] += expression.name + '=' + paramValue; if (useAlias) { if (context['$urlParams']) { context['$urlParams'] += '&'; } else { context['$urlParams'] = ''; } context['$urlParams'] += paramName + '=' + value; } } } else { context.postData = context.postData || {}; context.postData[expression.name] = value; } }, // VisitConstantExpression: function (expression, context) { // if (context['$urlParams']) { context['$urlParams'] += '&'; } else { context['$urlParams'] = ''; } // // // var valueType = Container.getTypeName(expression.value); // // // // context['$urlParams'] += expression.name + '=' + this.provider.fieldConverter.toDb[Container.resolveName(Container.resolveType(valueType))](expression.value); // }, VisitCountExpression: function VisitCountExpression(expression, context) { this.Visit(expression.source, context); context.urlText += '/$count'; }, VisitBatchExecuteQueryExpression: function VisitBatchExecuteQueryExpression(expression, context) { context.urlText += '/$batch'; context.method = 'POST'; context.postData = { __batchRequests: [] }; context._isBatchExecuteQuery = true; context._subQueries = expression.members; for (var i = 0; i < expression.members.length; i++) { var queryable = expression.members[i]; var compiler = new _core2.default.storageProviders.oData.oDataCompiler(); var compiled = compiler.compile(queryable); context.postData.__batchRequests.push({ requestUri: this.provider.providerConfiguration.oDataServiceHost + compiled.queryText, method: compiled.method, data: compiled.data, headers: compiled.headers }); } } }, {});