UNPKG

@sap/odata-v4

Version:

OData V4.0 server library

60 lines (54 loc) 2.7 kB
'use strict'; const ExpressionParser = require('./ExpressionParser'); const TokenKind = require('./UriTokenizer').TokenKind; const OrderByItem = require('./OrderByItem'); const EdmPrimitiveTypeKind = require('../edm/EdmPrimitiveTypeKind'); class OrderByParser { /** * Create an orderby parser. * @param {Edm} edm entity data model */ constructor(edm) { this._edm = edm; } /** * Parse an orderby string into an array of orderby items. * @param {UriTokenizer} tokenizer tokenizer containing the string to be parsed * @param {?EdmType} referencedType type the expression references * @param {?(EdmEntitySet[])} crossjoinEntitySets entity sets in case of a $crossjoin request * @param {?Object} aliases alias definitions * @returns {OrderByItem[]} the parsed items * @throws {UriSyntaxError} * @throws {UriQueryOptionSemanticError} */ parse(tokenizer, referencedType, crossjoinEntitySets, aliases) { const expressionParser = new ExpressionParser(this._edm); let orderByItems = []; do { const orderByExpression = expressionParser .parse(tokenizer, referencedType, crossjoinEntitySets, aliases); expressionParser.checkNoCollection(orderByExpression); // From the specification: // The value of the $orderby System Query option contains a comma-separated list of expressions // whose primitive result values are used to sort the items. [...] // Values of type Edm.Stream or any of the Geo types cannot be sorted. expressionParser.checkType(orderByExpression, EdmPrimitiveTypeKind.Int16, EdmPrimitiveTypeKind.Int32, EdmPrimitiveTypeKind.Int64, EdmPrimitiveTypeKind.Byte, EdmPrimitiveTypeKind.SByte, EdmPrimitiveTypeKind.Decimal, EdmPrimitiveTypeKind.Single, EdmPrimitiveTypeKind.Double, EdmPrimitiveTypeKind.Boolean, EdmPrimitiveTypeKind.Guid, EdmPrimitiveTypeKind.String, EdmPrimitiveTypeKind.Date, EdmPrimitiveTypeKind.TimeOfDay, EdmPrimitiveTypeKind.DateTimeOffset, EdmPrimitiveTypeKind.Duration, EdmPrimitiveTypeKind.Binary); let item = new OrderByItem(); item.setExpression(orderByExpression); if (tokenizer.next(TokenKind.AscSuffix)) { item.setDescending(false); } else if (tokenizer.next(TokenKind.DescSuffix)) { item.setDescending(true); } orderByItems.push(item); } while (tokenizer.next(TokenKind.COMMA)); return orderByItems; } } module.exports = OrderByParser;