UNPKG

trader-server

Version:

OData server for testing strategies, simulating and real trading.

468 lines 24.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var utils_1 = require("./utils"); var lexer_1 = require("./lexer"); var primitiveLiteral_1 = require("./primitiveLiteral"); var nameOrIdentifier_1 = require("./nameOrIdentifier"); var expressions_1 = require("./expressions"); var ResourcePath; (function (ResourcePath) { function resourcePath(value, index, metadataContext) { if (value[index] === 0x2f) index++; var token = ResourcePath.batch(value, index) || ResourcePath.entity(value, index, metadataContext) || ResourcePath.metadata(value, index); if (token) return token; var resource = nameOrIdentifier_1.default.entitySetName(value, index, metadataContext) || ResourcePath.functionImportCall(value, index, metadataContext) || ResourcePath.crossjoin(value, index) || ResourcePath.all(value, index) || ResourcePath.actionImportCall(value, index, metadataContext) || nameOrIdentifier_1.default.singletonEntity(value, index); if (!resource) return; var start = index; index = resource.next; var navigation; switch (resource.type) { case lexer_1.default.TokenType.EntitySetName: navigation = ResourcePath.collectionNavigation(value, resource.next, resource.metadata); metadataContext = resource.metadata; delete resource.metadata; break; case lexer_1.default.TokenType.EntityCollectionFunctionImportCall: navigation = ResourcePath.collectionNavigation(value, resource.next, resource.value.import.metadata); metadataContext = resource.value.import.metadata; delete resource.value.import.metadata; break; case lexer_1.default.TokenType.SingletonEntity: navigation = ResourcePath.singleNavigation(value, resource.next, resource.metadata); metadataContext = resource.metadata; delete resource.metadata; break; case lexer_1.default.TokenType.EntityFunctionImportCall: navigation = ResourcePath.singleNavigation(value, resource.next, resource.value.import.metadata); metadataContext = resource.value.import.metadata; delete resource.value.import.metadata; break; case lexer_1.default.TokenType.ComplexCollectionFunctionImportCall: case lexer_1.default.TokenType.PrimitiveCollectionFunctionImportCall: navigation = ResourcePath.collectionPath(value, resource.next, resource.value.import.metadata); metadataContext = resource.value.import.metadata; delete resource.value.import.metadata; break; case lexer_1.default.TokenType.ComplexFunctionImportCall: navigation = ResourcePath.complexPath(value, resource.next, resource.value.import.metadata); metadataContext = resource.value.import.metadata; delete resource.value.import.metadata; break; case lexer_1.default.TokenType.PrimitiveFunctionImportCall: navigation = ResourcePath.singlePath(value, resource.next, resource.value.import.metadata); metadataContext = resource.value.import.metadata; delete resource.value.import.metadata; break; } if (navigation) index = navigation.next; if (value[index] === 0x2f) index++; if (resource) return lexer_1.default.tokenize(value, start, index, { resource: resource, navigation: navigation }, lexer_1.default.TokenType.ResourcePath, navigation || { metadata: metadataContext }); } ResourcePath.resourcePath = resourcePath; function batch(value, index) { if (utils_1.default.equals(value, index, "$batch")) return lexer_1.default.tokenize(value, index, index + 6, "$batch", lexer_1.default.TokenType.Batch); } ResourcePath.batch = batch; function entity(value, index, metadataContext) { if (utils_1.default.equals(value, index, "$entity")) { var start = index; index += 7; var name_1; if (value[index] === 0x2f) { name_1 = nameOrIdentifier_1.default.qualifiedEntityTypeName(value, index + 1, metadataContext); if (!name_1) return; index = name_1.next; } return lexer_1.default.tokenize(value, start, index, name_1 || "$entity", lexer_1.default.TokenType.Entity); } } ResourcePath.entity = entity; function metadata(value, index) { if (utils_1.default.equals(value, index, "$metadata")) return lexer_1.default.tokenize(value, index, index + 9, "$metadata", lexer_1.default.TokenType.Metadata); } ResourcePath.metadata = metadata; function collectionNavigation(value, index, metadataContext) { var start = index; var name; if (value[index] === 0x2f) { name = nameOrIdentifier_1.default.qualifiedEntityTypeName(value, index + 1, metadataContext); if (name) { index = name.next; metadataContext = name.value.metadata; delete name.value.metadata; } } var path = ResourcePath.collectionNavigationPath(value, index, metadataContext); if (path) index = path.next; if (!name && !path) return; return lexer_1.default.tokenize(value, start, index, { name: name, path: path }, lexer_1.default.TokenType.CollectionNavigation, path || name); } ResourcePath.collectionNavigation = collectionNavigation; function collectionNavigationPath(value, index, metadataContext) { var start = index; var token = ResourcePath.collectionPath(value, index, metadataContext) || expressions_1.default.refExpr(value, index); if (token) return token; var predicate = expressions_1.default.keyPredicate(value, index, metadataContext); if (predicate) { var tokenValue = { predicate: predicate }; index = predicate.next; var navigation = ResourcePath.singleNavigation(value, index, metadataContext); if (navigation) { tokenValue = { predicate: predicate, navigation: navigation }; index = navigation.next; } return lexer_1.default.tokenize(value, start, index, tokenValue, lexer_1.default.TokenType.CollectionNavigationPath, navigation || { metadata: metadataContext }); } } ResourcePath.collectionNavigationPath = collectionNavigationPath; function singleNavigation(value, index, metadataContext) { var token = ResourcePath.boundOperation(value, index, false, metadataContext) || expressions_1.default.refExpr(value, index) || expressions_1.default.valueExpr(value, index); if (token) return token; var start = index; var name; if (value[index] === 0x2f) { name = nameOrIdentifier_1.default.qualifiedEntityTypeName(value, index + 1, metadataContext); if (name) { index = name.next; metadataContext = name.value.metadata; delete name.value.metadata; } } if (value[index] === 0x2f) { token = ResourcePath.propertyPath(value, index + 1, metadataContext); if (token) index = token.next; } if (!name && !token) return; return lexer_1.default.tokenize(value, start, index, { name: name, path: token }, lexer_1.default.TokenType.SingleNavigation, token); } ResourcePath.singleNavigation = singleNavigation; function propertyPath(value, index, metadataContext) { var token = nameOrIdentifier_1.default.entityColNavigationProperty(value, index, metadataContext) || nameOrIdentifier_1.default.entityNavigationProperty(value, index, metadataContext) || nameOrIdentifier_1.default.complexColProperty(value, index, metadataContext) || nameOrIdentifier_1.default.complexProperty(value, index, metadataContext) || nameOrIdentifier_1.default.primitiveColProperty(value, index, metadataContext) || nameOrIdentifier_1.default.primitiveProperty(value, index, metadataContext) || nameOrIdentifier_1.default.streamProperty(value, index, metadataContext); if (!token) return; var start = index; index = token.next; var navigation; switch (token.type) { case lexer_1.default.TokenType.EntityCollectionNavigationProperty: navigation = ResourcePath.collectionNavigation(value, index, token.metadata); delete token.metadata; break; case lexer_1.default.TokenType.EntityNavigationProperty: navigation = ResourcePath.singleNavigation(value, index, token.metadata); delete token.metadata; break; case lexer_1.default.TokenType.ComplexCollectionProperty: navigation = ResourcePath.collectionPath(value, index, token.metadata); delete token.metadata; break; case lexer_1.default.TokenType.ComplexProperty: navigation = ResourcePath.complexPath(value, index, token.metadata); delete token.metadata; break; case lexer_1.default.TokenType.PrimitiveCollectionProperty: navigation = ResourcePath.collectionPath(value, index, token.metadata); delete token.metadata; break; case lexer_1.default.TokenType.PrimitiveKeyProperty: case lexer_1.default.TokenType.PrimitiveProperty: navigation = ResourcePath.singlePath(value, index, token.metadata); delete token.metadata; break; case lexer_1.default.TokenType.StreamProperty: navigation = ResourcePath.boundOperation(value, index, token.metadata); delete token.metadata; break; } if (navigation) index = navigation.next; return lexer_1.default.tokenize(value, start, index, { path: token, navigation: navigation }, lexer_1.default.TokenType.PropertyPath, navigation); } ResourcePath.propertyPath = propertyPath; function collectionPath(value, index, metadataContext) { return expressions_1.default.countExpr(value, index) || ResourcePath.boundOperation(value, index, true, metadataContext); } ResourcePath.collectionPath = collectionPath; function singlePath(value, index, metadataContext) { return expressions_1.default.valueExpr(value, index) || ResourcePath.boundOperation(value, index, false, metadataContext); } ResourcePath.singlePath = singlePath; function complexPath(value, index, metadataContext) { var start = index; var name, token; if (value[index] === 0x2f) { name = nameOrIdentifier_1.default.qualifiedComplexTypeName(value, index + 1, metadataContext); if (name) index = name.next; } if (value[index] === 0x2f) { token = ResourcePath.propertyPath(value, index + 1, metadataContext); if (!token) return; index = token.next; } else token = ResourcePath.boundOperation(value, index, false, metadataContext); if (!name && !token) return; return lexer_1.default.tokenize(value, start, index, { name: name, path: token }, lexer_1.default.TokenType.ComplexPath, token); } ResourcePath.complexPath = complexPath; function boundOperation(value, index, isCollection, metadataContext) { if (value[index] !== 0x2f) return; var start = index; index++; var operation = ResourcePath.boundEntityColFuncCall(value, index, isCollection, metadataContext) || ResourcePath.boundEntityFuncCall(value, index, isCollection, metadataContext) || ResourcePath.boundComplexColFuncCall(value, index, isCollection, metadataContext) || ResourcePath.boundComplexFuncCall(value, index, isCollection, metadataContext) || ResourcePath.boundPrimitiveColFuncCall(value, index, isCollection, metadataContext) || ResourcePath.boundPrimitiveFuncCall(value, index, isCollection, metadataContext) || ResourcePath.boundActionCall(value, index, isCollection, metadataContext); if (!operation) return; index = operation.next; var name, navigation; switch (operation.type) { case lexer_1.default.TokenType.BoundActionCall: break; case lexer_1.default.TokenType.BoundEntityCollectionFunctionCall: navigation = ResourcePath.collectionNavigation(value, index, operation.value.call.metadata); delete operation.metadata; break; case lexer_1.default.TokenType.BoundEntityFunctionCall: navigation = ResourcePath.singleNavigation(value, index, operation.value.call.metadata); delete operation.metadata; break; case lexer_1.default.TokenType.BoundComplexCollectionFunctionCall: if (value[index] === 0x2f) { name = nameOrIdentifier_1.default.qualifiedComplexTypeName(value, index + 1, operation.value.call.metadata); if (name) index = name.next; } navigation = ResourcePath.collectionPath(value, index, operation.value.call.metadata); delete operation.metadata; break; case lexer_1.default.TokenType.BoundComplexFunctionCall: navigation = ResourcePath.complexPath(value, index, operation.value.call.metadata); delete operation.metadata; break; case lexer_1.default.TokenType.BoundPrimitiveCollectionFunctionCall: navigation = ResourcePath.collectionPath(value, index, operation.value.call.metadata); delete operation.metadata; break; case lexer_1.default.TokenType.BoundPrimitiveFunctionCall: navigation = ResourcePath.singlePath(value, index, operation.value.call.metadata); delete operation.metadata; break; } if (navigation) index = navigation.next; return lexer_1.default.tokenize(value, start, index, { operation: operation, name: name, navigation: navigation }, lexer_1.default.TokenType.BoundOperation, navigation); } ResourcePath.boundOperation = boundOperation; function boundActionCall(value, index, isCollection, metadataContext) { var namespaceNext = nameOrIdentifier_1.default.namespace(value, index); if (namespaceNext === index) return; var start = index; index = namespaceNext; if (value[index] !== 0x2e) return; index++; var action = nameOrIdentifier_1.default.action(value, index, isCollection, metadataContext); if (!action) return; action.value.namespace = utils_1.default.stringify(value, start, namespaceNext); return lexer_1.default.tokenize(value, start, action.next, action, lexer_1.default.TokenType.BoundActionCall, action); } ResourcePath.boundActionCall = boundActionCall; function boundFunctionCall(value, index, odataFunction, tokenType, isCollection, metadataContext) { var namespaceNext = nameOrIdentifier_1.default.namespace(value, index); if (namespaceNext === index) return; var start = index; index = namespaceNext; if (value[index] !== 0x2e) return; index++; var call = odataFunction(value, index, isCollection, metadataContext); if (!call) return; call.value.namespace = utils_1.default.stringify(value, start, namespaceNext); index = call.next; var params = ResourcePath.functionParameters(value, index); if (!params) return; index = params.next; return lexer_1.default.tokenize(value, start, index, { call: call, params: params }, tokenType, call); } ResourcePath.boundFunctionCall = boundFunctionCall; function boundEntityFuncCall(value, index, isCollection, metadataContext) { return ResourcePath.boundFunctionCall(value, index, nameOrIdentifier_1.default.entityFunction, lexer_1.default.TokenType.BoundEntityFunctionCall, isCollection, metadataContext); } ResourcePath.boundEntityFuncCall = boundEntityFuncCall; function boundEntityColFuncCall(value, index, isCollection, metadataContext) { return ResourcePath.boundFunctionCall(value, index, nameOrIdentifier_1.default.entityColFunction, lexer_1.default.TokenType.BoundEntityCollectionFunctionCall, isCollection, metadataContext); } ResourcePath.boundEntityColFuncCall = boundEntityColFuncCall; function boundComplexFuncCall(value, index, isCollection, metadataContext) { return ResourcePath.boundFunctionCall(value, index, nameOrIdentifier_1.default.complexFunction, lexer_1.default.TokenType.BoundComplexFunctionCall, isCollection, metadataContext); } ResourcePath.boundComplexFuncCall = boundComplexFuncCall; function boundComplexColFuncCall(value, index, isCollection, metadataContext) { return ResourcePath.boundFunctionCall(value, index, nameOrIdentifier_1.default.complexColFunction, lexer_1.default.TokenType.BoundComplexCollectionFunctionCall, isCollection, metadataContext); } ResourcePath.boundComplexColFuncCall = boundComplexColFuncCall; function boundPrimitiveFuncCall(value, index, isCollection, metadataContext) { return ResourcePath.boundFunctionCall(value, index, nameOrIdentifier_1.default.primitiveFunction, lexer_1.default.TokenType.BoundPrimitiveFunctionCall, isCollection, metadataContext); } ResourcePath.boundPrimitiveFuncCall = boundPrimitiveFuncCall; function boundPrimitiveColFuncCall(value, index, isCollection, metadataContext) { return ResourcePath.boundFunctionCall(value, index, nameOrIdentifier_1.default.primitiveColFunction, lexer_1.default.TokenType.BoundPrimitiveCollectionFunctionCall, isCollection, metadataContext); } ResourcePath.boundPrimitiveColFuncCall = boundPrimitiveColFuncCall; function actionImportCall(value, index, metadataContext) { var action = nameOrIdentifier_1.default.actionImport(value, index, metadataContext); if (action) return lexer_1.default.tokenize(value, index, action.next, action, lexer_1.default.TokenType.ActionImportCall, action); } ResourcePath.actionImportCall = actionImportCall; function functionImportCall(value, index, metadataContext) { var fnImport = nameOrIdentifier_1.default.entityFunctionImport(value, index, metadataContext) || nameOrIdentifier_1.default.entityColFunctionImport(value, index, metadataContext) || nameOrIdentifier_1.default.complexFunctionImport(value, index, metadataContext) || nameOrIdentifier_1.default.complexColFunctionImport(value, index, metadataContext) || nameOrIdentifier_1.default.primitiveFunctionImport(value, index, metadataContext) || nameOrIdentifier_1.default.primitiveColFunctionImport(value, index, metadataContext); if (!fnImport) return; var start = index; index = fnImport.next; var params = ResourcePath.functionParameters(value, index); if (!params) return; index = params.next; return lexer_1.default.tokenize(value, start, index, { import: fnImport, params: params.value }, (fnImport.type + "Call"), fnImport); } ResourcePath.functionImportCall = functionImportCall; function functionParameters(value, index, metadataContext) { var open = lexer_1.default.OPEN(value, index); if (!open) return; var start = index; index = open; var params = []; var token = ResourcePath.functionParameter(value, index); while (token) { params.push(token); index = token.next; var comma = lexer_1.default.COMMA(value, index); if (comma) { index = comma; token = ResourcePath.functionParameter(value, index); if (!token) return; } else break; } var close = lexer_1.default.CLOSE(value, index); if (!close) return; index = close; return lexer_1.default.tokenize(value, start, index, params, lexer_1.default.TokenType.FunctionParameters); } ResourcePath.functionParameters = functionParameters; function functionParameter(value, index, metadataContext) { var name = expressions_1.default.parameterName(value, index); if (!name) return; var start = index; index = name.next; var eq = lexer_1.default.EQ(value, index); if (!eq) return; index = eq; var token = expressions_1.default.parameterAlias(value, index) || primitiveLiteral_1.default.primitiveLiteral(value, index); if (!token) return; index = token.next; return lexer_1.default.tokenize(value, start, index, { name: name, value: token }, lexer_1.default.TokenType.FunctionParameter); } ResourcePath.functionParameter = functionParameter; function crossjoin(value, index, metadataContext) { if (!utils_1.default.equals(value, index, "$crossjoin")) return; var start = index; index += 10; var open = lexer_1.default.OPEN(value, index); if (!open) return; index = open; var names = []; var token = nameOrIdentifier_1.default.entitySetName(value, index, metadataContext); if (!token) return; while (token) { names.push(token); index = token.next; var comma = lexer_1.default.COMMA(value, index); if (comma) { index = comma; token = nameOrIdentifier_1.default.entitySetName(value, index, metadataContext); if (!token) return; } else break; } var close = lexer_1.default.CLOSE(value, index); if (!close) return; return lexer_1.default.tokenize(value, start, index, { names: names }, lexer_1.default.TokenType.Crossjoin); } ResourcePath.crossjoin = crossjoin; function all(value, index) { if (utils_1.default.equals(value, index, "$all")) return lexer_1.default.tokenize(value, index, index + 4, "$all", lexer_1.default.TokenType.AllResource); } ResourcePath.all = all; })(ResourcePath = exports.ResourcePath || (exports.ResourcePath = {})); exports.default = ResourcePath; //# sourceMappingURL=resourcePath.js.map