jaydata
Version:
Cross-platform HTML5 data-management, JavaScript Language Query (JSLQ) support for OData, SQLite, WebSQL, IndexedDB, YQL and Facebook (packaged for Node.JS)
120 lines (101 loc) • 5.77 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _index = require('../../../TypeSystem/index.js');
var _index2 = _interopRequireDefault(_index);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
(0, _index.$C)('$data.Expressions.QueryExpressionCreator', _index2.default.Expressions.EntityExpressionVisitor, null, {
constructor: function constructor(scopeContext) {
///<param name="scopeContext" type="$data.Expressions.EntityContext" />
_index.Guard.requireValue("scopeContext", scopeContext);
this.scopeContext = scopeContext;
},
VisitEntitySetExpression: function VisitEntitySetExpression(expression, context) {
if (expression.source instanceof _index2.default.Expressions.EntityContextExpression) {
this.lambdaTypes.push(expression);
}
return expression;
},
VisitServiceOperationExpression: function VisitServiceOperationExpression(expression, context) {
if (expression.source instanceof _index2.default.Expressions.EntityContextExpression) {
this.lambdaTypes.push(expression);
}
return expression;
},
VisitCodeExpression: function VisitCodeExpression(expression, context) {
///<summary>Converts the CodeExpression into an EntityExpression</summary>
///<param name="expression" type="$data.Expressions.CodeExpression" />
var source = expression.source.toString();
var jsCodeTree = _index.Container.createCodeParser(this.scopeContext).createExpression(source);
this.scopeContext.log({ event: "JSCodeExpression", data: jsCodeTree });
//TODO rename classes to reflex variable names
//TODO engage localValueResolver here
//var globalVariableResolver = Container.createGlobalContextProcessor($data.__global);
var constantResolver = _index.Container.createConstantValueResolver(expression.parameters, _index2.default.__global, this.scopeContext);
var parameterProcessor = _index.Container.createParameterResolverVisitor();
jsCodeTree = parameterProcessor.Visit(jsCodeTree, constantResolver);
this.scopeContext.log({ event: "JSCodeExpressionResolved", data: jsCodeTree });
var code2entity = _index.Container.createCodeToEntityConverter(this.scopeContext);
///user provided query parameter object (specified as thisArg earlier) is passed in
var entityExpression = code2entity.Visit(jsCodeTree, { queryParameters: expression.parameters, lambdaParameters: this.lambdaTypes, frameType: context.frameType });
///parameters are referenced, ordered and named, also collected in a flat list of name value pairs
var result = _index.Container.createParametricQueryExpression(entityExpression, code2entity.parameters);
this.scopeContext.log({ event: "EntityExpression", data: entityExpression });
return result;
},
VisitFilterExpression: function VisitFilterExpression(expression, context) {
var source = this.Visit(expression.source, context);
context = context || {};
context.frameType = expression.getType();
var selector = this.Visit(expression.selector, context);
if (source !== expression.source || selector !== expression.selector) {
return _index.Container.createFilterExpression(source, selector, expression.params, expression.instance);
}
return expression;
},
VisitInlineCountExpression: function VisitInlineCountExpression(expression, context) {
var source = this.Visit(expression.source, context);
context = context || {};
context.frameType = expression.getType();
var selector = this.Visit(expression.selector, context);
if (source !== expression.source || selector !== expression.selector) {
return _index.Container.createInlineCountExpression(source, selector, expression.params, expression.instance);
}
return expression;
},
VisitProjectionExpression: function VisitProjectionExpression(expression, context) {
var source = this.Visit(expression.source, context);
context = context || {};
context.frameType = expression.getType();
var selector = this.Visit(expression.selector, context);
if (source !== expression.source || selector !== expression.selector) {
var expr = _index.Container.createProjectionExpression(source, selector, expression.params, expression.instance);
expr.projectionAs = expression.projectionAs;
return expr;
}
return expression;
},
VisitOrderExpression: function VisitOrderExpression(expression, context) {
var source = this.Visit(expression.source, context);
context = context || {};
context.frameType = expression.getType();
var selector = this.Visit(expression.selector, context);
if (source !== expression.source || selector !== expression.selector) {
return _index.Container.createOrderExpression(source, selector, expression.nodeType);
}
return expression;
},
VisitIncludeExpression: function VisitIncludeExpression(expression, context) {
var source = this.Visit(expression.source, context);
context = context || {};
context.frameType = expression.getType();
var selector = this.Visit(expression.selector, context);
if (source !== expression.source || selector !== expression.selector) {
return _index.Container.createIncludeExpression(source, selector);
}
return expression;
}
});
exports.default = _index2.default;
module.exports = exports['default'];