@sap/odata-v4
Version:
OData V4.0 server library
60 lines (54 loc) • 2.7 kB
JavaScript
;
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;