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)

93 lines (78 loc) 3.74 kB
'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.ContinuationExpressionBuilder', _index2.default.Expressions.EntityExpressionVisitor, null, { constructor: function constructor(mode) { this.mode = mode; }, compile: function compile(query) { var findContext = { mode: "find", skipExists: false }; this.Visit(query.expression, findContext); var result = { skip: findContext.skipSize, take: findContext.pageSize, message: '' }; if ('pageSize' in findContext) { var expression; var context = { mode: this.mode, pageSize: findContext.pageSize }; if (!findContext.skipExists && findContext.pageSize) { context.append = true; expression = this.Visit(query.expression, context); } else if (findContext.skipExists) { expression = this.Visit(query.expression, context); } if (!context.abort) { result.expression = expression; } else { result.skip = (result.skip || 0) - result.take; result.message = 'Invalid skip value!'; } } else { result.message = 'take expression not defined in the chain!'; } return result; }, VisitPagingExpression: function VisitPagingExpression(expression, context) { switch (context.mode) { case 'find': if (expression.nodeType === _index2.default.Expressions.ExpressionType.Take) { context.pageSize = expression.amount.value; } else { context.skipSize = expression.amount.value; context.skipExists = true; } break; case 'prev': if (expression.nodeType === _index2.default.Expressions.ExpressionType.Skip) { var amount = expression.amount.value - context.pageSize; context.abort = amount < 0 && expression.amount.value >= context.pageSize; var constExp = _index.Container.createConstantExpression(Math.max(amount, 0), "number"); return _index.Container.createPagingExpression(expression.source, constExp, expression.nodeType); } else if (context.append) { //no skip expression, skip: 0, no prev context.abort = true; } break; case 'next': if (expression.nodeType === _index2.default.Expressions.ExpressionType.Skip) { var amount = context.pageSize + expression.amount.value; var constExp = _index.Container.createConstantExpression(amount, "number"); return _index.Container.createPagingExpression(expression.source, constExp, expression.nodeType); } else if (context.append) { //no skip expression, skip: 0 var constExp = _index.Container.createConstantExpression(context.pageSize, "number"); return _index.Container.createPagingExpression(expression, constExp, _index2.default.Expressions.ExpressionType.Skip); } break; default: } this.Visit(expression.source, context); } }); exports.default = _index2.default; module.exports = exports['default'];