jaydata
Version:
Cross-platform HTML5 data-management, JavaScript Language Query (JSLQ) support for OData, SQLite, WebSQL, IndexedDB, YQL and Facebook (packaged for Node.JS)
285 lines (249 loc) • 12.4 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.EntityExpressionVisitor', null, null, {
constructor: function constructor() {
this.lambdaTypes = [];
},
canVisit: function canVisit(expression) {
return expression instanceof _index2.default.Expressions.ExpressionNode;
},
Visit: function Visit(expression, context) {
if (!this.canVisit(expression)) return expression;
var visitorName = "Visit" + expression.getType().name;
if (visitorName in this) {
var fn = this[visitorName];
var result = fn.call(this, expression, context);
if (typeof result === 'undefined') {
return expression;
}
return result;
}
//console.log("unhandled expression type:" + expression.getType().name);
return expression;
},
VisitToArrayExpression: function VisitToArrayExpression(expression, context) {
var source = this.Visit(expression.source, context);
if (source !== expression.source) {
return _index.Container.createToArrayExpression(source);
}
return expression;
},
VisitForEachExpression: function VisitForEachExpression(expression, context) {
var source = this.Visit(expression.source, context);
if (source !== expression.source) {
return _index.Container.createForEachExpression(source);
}
return expression;
},
VisitMemberInfoExpression: function VisitMemberInfoExpression(expression, context) {
return expression;
},
VisitSingleExpression: function VisitSingleExpression(expression, context) {
var source = this.Visit(expression.source, context);
if (source !== expression.source) return _index.Container.createSingleExpression(source);
return expression;
},
VisitFirstExpression: function VisitFirstExpression(expression, context) {
var source = this.Visit(expression.source, context);
if (source !== expression.source) return _index.Container.createFirstExpression(source);
return expression;
},
VisitSomeExpression: function VisitSomeExpression(expression, context) {
var source = this.Visit(expression.source, context);
if (source !== expression.source) return _index.Container.createSomeExpression(source);
return expression;
},
VisitFindExpression: function VisitFindExpression(expression, context) {
var source = this.Visit(expression.source, context);
if (source !== expression.source) return _index.Container.createFindExpression(source, expression.params, expression.subMember);
return expression;
},
VisitEveryExpression: function VisitEveryExpression(expression, context) {
var source = this.Visit(expression.source, context);
if (source !== expression.source) return _index.Container.createEveryExpression(source);
return expression;
},
VisitCountExpression: function VisitCountExpression(expression, context) {
var source = this.Visit(expression.source, context);
if (source !== expression.source) return _index.Container.createCountExpression(source);
return expression;
},
VisitBatchDeleteExpression: function VisitBatchDeleteExpression(expression, context) {
var source = this.Visit(expression.source, context);
if (source !== expression.source) {
return _index.Container.createBatchDeleteExpression(source);
}
return expression;
},
VisitBatchExecuteQueryExpression: function VisitBatchExecuteQueryExpression(expression, context) {
var newQueries = expression.members.map(function (expr) {
return this.Visit(expr, context);
}, this);
var equal = true;
for (var i = 0; i < expression.members.length; i++) {
equal = equal && expression.members[i] === newQueries[i];
}
if (!equal) {
return _index.Container.createBatchExecuteQueryExpression(newQueries);
}
return expression;
},
VisitObjectLiteralExpression: function VisitObjectLiteralExpression(expression, context) {
var newValues = expression.members.map(function (ofe) {
return this.Visit(ofe, context);
}, this);
var equal = true;
for (var i = 0; i < expression.members.length; i++) {
equal = equal && expression.members[i] === newValues[i];
}
if (!equal) {
return _index.Container.createObjectLiteralExpression(newValues);
}
return expression;
},
VisitObjectFieldExpression: function VisitObjectFieldExpression(expression, context) {
var newExpression = this.Visit(expression.expression, context);
if (expression.expression !== newExpression) {
return _index.Container.createObjectFieldExpression(expression.fieldName, newExpression);
}
return expression;
},
VisitIncludeExpression: function VisitIncludeExpression(expression, context) {
var newExpression = this.Visit(expression.source, context);
if (newExpression !== expression.source) {
return _index.Container.createIncludeExpression(newExpression, expression.selector);
}
return expression;
},
VisitUnaryExpression: function VisitUnaryExpression(expression, context) {
/// <param name="expression" type="$data.Expressions.UnaryExpression"></param>
/// <param name="context"></param>
var operand = this.Visit(expression.operand, context);
if (expression.operand !== operand) {
return _index.Container.createUnaryExpression(operand, expression.operator, expression.nodeType, expression.resolution);
};
return expression;
},
VisitSimpleBinaryExpression: function VisitSimpleBinaryExpression(expression, context) {
///<summary></summary>
///<param name="expression" type="$data.Expressions.SimpleBinaryExpression"/>
///<param name="context" type="Object"/>
//<returns type="$data.Expressions.SimpleBinaryExpression"/>
var left = this.Visit(expression.left, context);
var right = this.Visit(expression.right, context);
if (left !== expression.left || right !== expression.right) {
return new _index2.default.Expressions.SimpleBinaryExpression(left, right, expression.nodeType, expression.operator, expression.type, expression.resolution);
}
return expression;
},
VisitEntityContextExpression: function VisitEntityContextExpression(expression, context) {
return expression;
},
VisitCodeExpression: function VisitCodeExpression(expression, context) {
/// <param name="expression" type="$data.Expressions.CodeExpression"></param>
/// <param name="context"></param>
/// <returns type="$data.Expressions.CodeExpression"></returns>
return expression;
},
VisitComplexTypeExpression: function VisitComplexTypeExpression(expression, context) {
var source = this.Visit(expression.source, context);
var selector = this.Visit(expression.selector, context);
if (source !== expression.source || selector !== expression.selector) {
var result = _index.Container.createComplexTypeExpression(source, selector);
return result;
}
return expression;
},
VisitEntityExpression: function VisitEntityExpression(expression, context) {
var source = this.Visit(expression.source, context);
var selector = this.Visit(expression.selector, context);
if (source !== expression.source || selector !== expression.selector) {
var result = _index.Container.createEntityExpression(source, selector);
return result;
}
return expression;
},
VisitEntityFieldExpression: function VisitEntityFieldExpression(expression, context) {
var source = this.Visit(expression.source, context);
var selector = this.Visit(expression.selector, context);
if (source !== expression.source || selector !== expression.selector) {
var result = _index.Container.createEntityFieldExpression(source, selector);
return result;
}
return expression;
},
VisitEntityFieldOperationExpression: function VisitEntityFieldOperationExpression(expression, context) {
var source = this.Visit(expression.source, context);
var operation = this.Visit(expression.operation, context);
var parameters = expression.parameters.map(function (p) {
return this.Visit(p);
}, this);
var result = _index.Container.createEntityFieldOperationExpression(source, operation, parameters);
return result;
},
VisitParametricQueryExpression: function VisitParametricQueryExpression(expression, context) {
var exp = this.Visit(expression.expression, context);
var args = expression.parameters.map(function (p) {
return this.Visit(p);
}, this);
var result = _index.Container.createParametricQueryExpression(exp, args);
return result;
},
VisitEntitySetExpression: function VisitEntitySetExpression(expression, context) {
var source = this.Visit(expression.source, context);
var selector = this.Visit(expression.selector, context);
if (source !== expression.source || selector !== expression.selector) {
return _index.Container.createEntitySetExpression(source, selector, expression.params, expression.instance);
}
return expression;
},
VisitInlineCountExpression: function VisitInlineCountExpression(expression, context) {
var source = this.Visit(expression.source, context);
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;
},
VisitFilterExpression: function VisitFilterExpression(expression, context) {
var source = this.Visit(expression.source, context);
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;
},
VisitProjectionExpression: function VisitProjectionExpression(expression, context) {
var source = this.Visit(expression.source, context);
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);
var selector = this.Visit(expression.selector, context);
if (source !== expression.source || selector !== expression.selector) {
return _index.Container.createOrderExpression(source, selector, expression.nodeType);
}
return expression;
},
VisitPagingExpression: function VisitPagingExpression(expression, context) {
var source = this.Visit(expression.source, context);
var amount = this.Visit(expression.amount, context);
if (source !== expression.source || amount !== expression.amount) {
return _index.Container.createPagingExpression(source, amount, expression.nodeType);
}
return expression;
}
});
exports.default = _index2.default;
module.exports = exports['default'];