UNPKG

trader-server

Version:

OData server for testing strategies, simulating and real trading.

903 lines 34.7 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 Query; (function (Query) { function queryOptions(value, index, metadataContext) { var token = Query.queryOption(value, index, metadataContext); if (!token) return; var start = index; index = token.next; var options = []; while (token) { options.push(token); // & if (value[index] !== 0x26) break; index++; token = Query.queryOption(value, index, metadataContext); if (!token) return; index = token.next; } return lexer_1.default.tokenize(value, start, index, { options: options }, lexer_1.default.TokenType.QueryOptions); } Query.queryOptions = queryOptions; function queryOption(value, index, metadataContext) { return Query.systemQueryOption(value, index, metadataContext) || Query.aliasAndValue(value, index) || Query.customQueryOption(value, index); } Query.queryOption = queryOption; function systemQueryOption(value, index, metadataContext) { return Query.expand(value, index, metadataContext) || Query.filter(value, index) || Query.format(value, index) || Query.id(value, index) || Query.inlinecount(value, index) || Query.orderby(value, index) || Query.search(value, index) || Query.select(value, index) || Query.skip(value, index) || Query.skiptoken(value, index) || Query.top(value, index); } Query.systemQueryOption = systemQueryOption; function customQueryOption(value, index) { var key = nameOrIdentifier_1.default.odataIdentifier(value, index); if (!key) return; var start = index; index = key.next; var eq = lexer_1.default.EQ(value, index); if (!eq) return; index = eq; while (value[index] !== 0x26 && index < value.length) index++; if (index === eq) return; return lexer_1.default.tokenize(value, start, index, { key: key.raw, value: utils_1.default.stringify(value, eq, index) }, lexer_1.default.TokenType.CustomQueryOption); } Query.customQueryOption = customQueryOption; function id(value, index) { var start = index; if (utils_1.default.equals(value, index, "%24id")) { index += 5; } else if (utils_1.default.equals(value, index, "$id")) { index += 3; } else return; var eq = lexer_1.default.EQ(value, index); if (!eq) return; index = eq; while (value[index] !== 0x26 && index < value.length) index++; if (index === eq) return; return lexer_1.default.tokenize(value, start, index, utils_1.default.stringify(value, eq, index), lexer_1.default.TokenType.Id); } Query.id = id; function expand(value, index, metadataContext) { var start = index; if (utils_1.default.equals(value, index, "%24expand")) { index += 9; } else if (utils_1.default.equals(value, index, "$expand")) { index += 7; } else return; var eq = lexer_1.default.EQ(value, index); if (!eq) return; index = eq; var items = []; var token = Query.expandItem(value, index, metadataContext); if (!token) return; index = token.next; while (token) { items.push(token); var comma = lexer_1.default.COMMA(value, index); if (comma) { index = comma; token = Query.expandItem(value, index, metadataContext); if (!token) return; index = token.next; } else break; } return lexer_1.default.tokenize(value, start, index, { items: items }, lexer_1.default.TokenType.Expand); } Query.expand = expand; function expandItem(value, index, metadataContext) { var start = index; var star = lexer_1.default.STAR(value, index); if (star) { index = star; var ref_1 = expressions_1.default.refExpr(value, index); if (ref_1) { index = ref_1.next; return lexer_1.default.tokenize(value, start, index, { path: "*", ref: ref_1 }, lexer_1.default.TokenType.ExpandItem); } else { var open_1 = lexer_1.default.OPEN(value, index); if (open_1) { index = open_1; var token = Query.levels(value, index); if (!token) return; index = token.next; var close_1 = lexer_1.default.CLOSE(value, index); if (!close_1) return; index = close_1; return lexer_1.default.tokenize(value, start, index, { path: "*", levels: token }, lexer_1.default.TokenType.ExpandItem); } } } var path = Query.expandPath(value, index, metadataContext); if (!path) return; index = path.next; var tokenValue = { path: path }; var ref = expressions_1.default.refExpr(value, index); if (ref) { index = ref.next; tokenValue.ref = ref; var open_2 = lexer_1.default.OPEN(value, index); if (open_2) { index = open_2; var option = Query.expandRefOption(value, index); if (!option) return; var refOptions = []; while (option) { refOptions.push(option); index = option.next; var semi = lexer_1.default.SEMI(value, index); if (semi) { index = semi; option = Query.expandRefOption(value, index); if (!option) return; } else break; } var close_2 = lexer_1.default.CLOSE(value, index); if (!close_2) return; index = close_2; tokenValue.options = refOptions; } } else { var count = expressions_1.default.countExpr(value, index); if (count) { index = count.next; tokenValue.count = count; var open_3 = lexer_1.default.OPEN(value, index); if (open_3) { index = open_3; var option = Query.expandCountOption(value, index); if (!option) return; var countOptions = []; while (option) { countOptions.push(option); index = option.next; var semi = lexer_1.default.SEMI(value, index); if (semi) { index = semi; option = Query.expandCountOption(value, index); if (!option) return; } else break; } var close_3 = lexer_1.default.CLOSE(value, index); if (!close_3) return; index = close_3; tokenValue.options = countOptions; } } else { var open_4 = lexer_1.default.OPEN(value, index); if (open_4) { index = open_4; var option = Query.expandOption(value, index); if (!option) return; var options = []; while (option) { options.push(option); index = option.next; var semi = lexer_1.default.SEMI(value, index); if (semi) { index = semi; option = Query.expandOption(value, index); if (!option) return; } else break; } var close_4 = lexer_1.default.CLOSE(value, index); if (!close_4) return; index = close_4; tokenValue.options = options; } } } return lexer_1.default.tokenize(value, start, index, tokenValue, lexer_1.default.TokenType.ExpandItem); } Query.expandItem = expandItem; function expandCountOption(value, index) { return Query.filter(value, index) || Query.search(value, index); } Query.expandCountOption = expandCountOption; function expandRefOption(value, index) { return Query.expandCountOption(value, index) || Query.orderby(value, index) || Query.skip(value, index) || Query.top(value, index) || Query.inlinecount(value, index); } Query.expandRefOption = expandRefOption; function expandOption(value, index) { return Query.expandRefOption(value, index) || Query.select(value, index) || Query.expand(value, index) || Query.levels(value, index); } Query.expandOption = expandOption; function expandPath(value, index, metadataContext) { var start = index; var path = []; var token = nameOrIdentifier_1.default.qualifiedEntityTypeName(value, index, metadataContext) || nameOrIdentifier_1.default.qualifiedComplexTypeName(value, index, metadataContext); if (token) { index = token.next; path.push(token); if (value[index] !== 0x2f) return; index++; metadataContext = token.value.metadata; delete token.value.metadata; } var complex = nameOrIdentifier_1.default.complexProperty(value, index, metadataContext) || nameOrIdentifier_1.default.complexColProperty(value, index, metadataContext); while (complex) { if (value[complex.next] === 0x2f) { index = complex.next + 1; path.push(complex); var complexTypeName = nameOrIdentifier_1.default.qualifiedComplexTypeName(value, index, metadataContext); if (complexTypeName) { if (value[complexTypeName.next] === 0x2f) { index = complexTypeName.next + 1; path.push(complexTypeName); } metadataContext = complexTypeName.value.metadata; delete complexTypeName.value.metadata; } complex = nameOrIdentifier_1.default.complexProperty(value, index, metadataContext) || nameOrIdentifier_1.default.complexColProperty(value, index, metadataContext); } else break; } var nav = nameOrIdentifier_1.default.navigationProperty(value, index, metadataContext); if (!nav) return; index = nav.next; path.push(nav); metadataContext = nav.metadata; delete nav.metadata; if (value[index] === 0x2f) { var typeName = nameOrIdentifier_1.default.qualifiedEntityTypeName(value, index + 1, metadataContext); if (typeName) { index = typeName.next; path.push(typeName); metadataContext = typeName.value.metadata; delete typeName.value.metadata; } } return lexer_1.default.tokenize(value, start, index, path, lexer_1.default.TokenType.ExpandPath); } Query.expandPath = expandPath; function search(value, index) { var start = index; if (utils_1.default.equals(value, index, "%24search")) { index += 9; } else if (utils_1.default.equals(value, index, "$search")) { index += 7; } else return; var eq = lexer_1.default.EQ(value, index); if (!eq) return; index = eq; var expr = Query.searchExpr(value, index); if (!expr) return; index = expr.next; return lexer_1.default.tokenize(value, start, index, expr, lexer_1.default.TokenType.Search); } Query.search = search; function searchExpr(value, index) { var token = Query.searchParenExpr(value, index) || Query.searchTerm(value, index); if (!token) return; var start = index; index = token.next; var expr = Query.searchAndExpr(value, index) || Query.searchOrExpr(value, index); if (expr) { var left = lexer_1.default.clone(token); token.next = expr.value.next; token.value = { left: left, right: expr.value }; token.type = expr.type; token.raw = utils_1.default.stringify(value, token.position, token.next); if (token.type === lexer_1.default.TokenType.SearchAndExpression && token.value.right.type === lexer_1.default.TokenType.SearchOrExpression) { token.value.left = lexer_1.default.tokenize(value, token.value.left.position, token.value.right.value.left.next, { left: token.value.left, right: token.value.right.value.left }, token.type); token.type = token.value.right.type; token.value.right = token.value.right.value.right; } } return token; } Query.searchExpr = searchExpr; function searchTerm(value, index) { return Query.searchNotExpr(value, index) || Query.searchPhrase(value, index) || Query.searchWord(value, index); } Query.searchTerm = searchTerm; function searchNotExpr(value, index) { var rws = lexer_1.default.RWS(value, index); if (!utils_1.default.equals(value, rws, "NOT")) return; var start = index; index = rws + 3; rws = lexer_1.default.RWS(value, index); if (rws === index) return; index = rws; var expr = Query.searchPhrase(value, index) || Query.searchWord(value, index); if (!expr) return; index = expr.next; return lexer_1.default.tokenize(value, start, index, expr, lexer_1.default.TokenType.SearchNotExpression); } Query.searchNotExpr = searchNotExpr; function searchOrExpr(value, index) { var rws = lexer_1.default.RWS(value, index); if (rws === index || !utils_1.default.equals(value, rws, "OR")) return; var start = index; index = rws + 2; rws = lexer_1.default.RWS(value, index); if (rws === index) return; index = rws; var token = Query.searchExpr(value, index); if (!token) return; index = token.next; return lexer_1.default.tokenize(value, start, index, token, lexer_1.default.TokenType.SearchOrExpression); } Query.searchOrExpr = searchOrExpr; function searchAndExpr(value, index) { var rws = lexer_1.default.RWS(value, index); if (rws === index || !utils_1.default.equals(value, rws, "AND")) return; var start = index; index = rws + 3; rws = lexer_1.default.RWS(value, index); if (rws === index) return; index = rws; var token = Query.searchExpr(value, index); if (!token) return; index = token.next; return lexer_1.default.tokenize(value, start, index, token, lexer_1.default.TokenType.SearchAndExpression); } Query.searchAndExpr = searchAndExpr; function searchPhrase(value, index) { var mark = lexer_1.default.quotationMark(value, index); if (mark === index) return; var start = index; index = mark; var valueStart = index; var ch = lexer_1.default.qcharNoAMPDQUOTE(value, index); while (ch > index && !lexer_1.default.OPEN(value, index) && !lexer_1.default.CLOSE(value, index)) { index = ch; ch = lexer_1.default.qcharNoAMPDQUOTE(value, index); } var valueEnd = index; mark = lexer_1.default.quotationMark(value, index); if (!mark) return; index = mark; return lexer_1.default.tokenize(value, start, index, utils_1.default.stringify(value, valueStart, valueEnd), lexer_1.default.TokenType.SearchPhrase); } Query.searchPhrase = searchPhrase; function searchWord(value, index) { var next = utils_1.default.required(value, index, lexer_1.default.ALPHA, 1); if (!next) return; var start = index; index = next; var token = lexer_1.default.tokenize(value, start, index, null, lexer_1.default.TokenType.SearchWord); token.value = token.raw; return token; } Query.searchWord = searchWord; function searchParenExpr(value, index) { var open = lexer_1.default.OPEN(value, index); if (!open) return; var start = index; index = open; index = lexer_1.default.BWS(value, index); var expr = Query.searchExpr(value, index); if (!expr) return; index = expr.next; index = lexer_1.default.BWS(value, index); var close = lexer_1.default.CLOSE(value, index); if (!close) return; index = close; return lexer_1.default.tokenize(value, start, index, expr, lexer_1.default.TokenType.SearchParenExpression); } Query.searchParenExpr = searchParenExpr; function levels(value, index) { var start = index; if (utils_1.default.equals(value, index, "%24levels")) { index += 9; } else if (utils_1.default.equals(value, index, "$levels")) { index += 7; } else return; var eq = lexer_1.default.EQ(value, index); if (!eq) return; index = eq; var level; if (utils_1.default.equals(value, index, "max")) { level = "max"; index += 3; } else { var token = primitiveLiteral_1.default.int32Value(value, index); if (!token) return; level = token.raw; index = token.next; } return lexer_1.default.tokenize(value, start, index, level, lexer_1.default.TokenType.Levels); } Query.levels = levels; function filter(value, index) { var start = index; if (utils_1.default.equals(value, index, "%24filter")) { index += 9; } else if (utils_1.default.equals(value, index, "$filter")) { index += 7; } else return; var eq = lexer_1.default.EQ(value, index); if (!eq) return; index = eq; var expr = expressions_1.default.boolCommonExpr(value, index); if (!expr) return; index = expr.next; return lexer_1.default.tokenize(value, start, index, expr, lexer_1.default.TokenType.Filter); } Query.filter = filter; function orderby(value, index) { var start = index; if (utils_1.default.equals(value, index, "%24orderby")) { index += 10; } else if (utils_1.default.equals(value, index, "$orderby")) { index += 8; } else return; var eq = lexer_1.default.EQ(value, index); if (!eq) return; index = eq; var items = []; var token = Query.orderbyItem(value, index); if (!token) return; index = token.next; while (token) { items.push(token); var comma = lexer_1.default.COMMA(value, index); if (comma) { index = comma; token = Query.orderbyItem(value, index); if (!token) return; index = token.next; } else break; } return lexer_1.default.tokenize(value, start, index, { items: items }, lexer_1.default.TokenType.OrderBy); } Query.orderby = orderby; function orderbyItem(value, index) { var expr = expressions_1.default.commonExpr(value, index); if (!expr) return; var start = index; index = expr.next; var direction = 1; var rws = lexer_1.default.RWS(value, index); if (rws > index) { index = rws; if (utils_1.default.equals(value, index, "asc")) index += 3; else if (utils_1.default.equals(value, index, "desc")) { index += 4; direction = -1; } else return; } return lexer_1.default.tokenize(value, start, index, { expr: expr, direction: direction }, lexer_1.default.TokenType.OrderByItem); } Query.orderbyItem = orderbyItem; function skip(value, index) { var start = index; if (utils_1.default.equals(value, index, "%24skip")) { index += 7; } else if (utils_1.default.equals(value, index, "$skip")) { index += 5; } else return; var eq = lexer_1.default.EQ(value, index); if (!eq) return; index = eq; var token = primitiveLiteral_1.default.int32Value(value, index); if (!token) return; index = token.next; return lexer_1.default.tokenize(value, start, index, token, lexer_1.default.TokenType.Skip); } Query.skip = skip; function top(value, index) { var start = index; if (utils_1.default.equals(value, index, "%24top")) { index += 6; } else if (utils_1.default.equals(value, index, "$top")) { index += 4; } else return; var eq = lexer_1.default.EQ(value, index); if (!eq) return; index = eq; var token = primitiveLiteral_1.default.int32Value(value, index); if (!token) return; index = token.next; return lexer_1.default.tokenize(value, start, index, token, lexer_1.default.TokenType.Top); } Query.top = top; function format(value, index) { var start = index; if (utils_1.default.equals(value, index, "%24format")) { index += 9; } else if (utils_1.default.equals(value, index, "$format")) { index += 7; } else return; var eq = lexer_1.default.EQ(value, index); if (!eq) return; index = eq; var format; if (utils_1.default.equals(value, index, "atom")) { format = "atom"; index += 4; } else if (utils_1.default.equals(value, index, "json")) { format = "json"; index += 4; } else if (utils_1.default.equals(value, index, "xml")) { format = "xml"; index += 3; } if (format) return lexer_1.default.tokenize(value, start, index, { format: format }, lexer_1.default.TokenType.Format); } Query.format = format; function inlinecount(value, index) { var start = index; if (utils_1.default.equals(value, index, "%24count")) { index += 8; } else if (utils_1.default.equals(value, index, "$count")) { index += 6; } else return; var eq = lexer_1.default.EQ(value, index); if (!eq) return; index = eq; var token = primitiveLiteral_1.default.booleanValue(value, index); if (!token) return; index = token.next; return lexer_1.default.tokenize(value, start, index, token, lexer_1.default.TokenType.InlineCount); } Query.inlinecount = inlinecount; function select(value, index) { var start = index; if (utils_1.default.equals(value, index, "%24select")) { index += 9; } else if (utils_1.default.equals(value, index, "$select")) { index += 7; } else return; var eq = lexer_1.default.EQ(value, index); if (!eq) return; index = eq; var items = []; var token = Query.selectItem(value, index); if (!token) return; while (token) { items.push(token); index = token.next; var comma = lexer_1.default.COMMA(value, index); if (comma) { index = comma; token = Query.selectItem(value, index); if (!token) return; } else break; } return lexer_1.default.tokenize(value, start, index, { items: items }, lexer_1.default.TokenType.Select); } Query.select = select; function selectItem(value, index) { var start = index; var item; var op = Query.allOperationsInSchema(value, index); var star = lexer_1.default.STAR(value, index); if (op > index) { item = { namespace: utils_1.default.stringify(value, index, op - 2), value: "*" }; index = op; } else if (star) { item = { value: "*" }; index = star; } else { item = {}; var name_1 = nameOrIdentifier_1.default.qualifiedEntityTypeName(value, index) || nameOrIdentifier_1.default.qualifiedComplexTypeName(value, index); if (name_1 && value[name_1.next] !== 0x2f) return; else if (name_1 && value[name_1.next] === 0x2f) { index++; item.name = name_1; } var select_1 = Query.selectProperty(value, index) || Query.qualifiedActionName(value, index) || Query.qualifiedFunctionName(value, index); if (!select_1) return; index = select_1.next; item = name_1 ? { name: name_1, select: select_1 } : select_1; } if (index > start) return lexer_1.default.tokenize(value, start, index, item, lexer_1.default.TokenType.SelectItem); } Query.selectItem = selectItem; function allOperationsInSchema(value, index) { var namespaceNext = nameOrIdentifier_1.default.namespace(value, index); var star = lexer_1.default.STAR(value, namespaceNext + 1); if (namespaceNext > index && value[namespaceNext] === 0x2e && star) return star; return index; } Query.allOperationsInSchema = allOperationsInSchema; function selectProperty(value, index) { var token = Query.selectPath(value, index) || nameOrIdentifier_1.default.primitiveProperty(value, index) || nameOrIdentifier_1.default.primitiveColProperty(value, index) || nameOrIdentifier_1.default.navigationProperty(value, index); if (!token) return; var start = index; index = token.next; if (token.type === lexer_1.default.TokenType.SelectPath) { if (value[index] === 0x2f) { index++; var prop = Query.selectProperty(value, index); if (!prop) return; var path = lexer_1.default.clone(token); token.next = prop.next; token.raw = utils_1.default.stringify(value, start, token.next); token.value = { path: path, next: prop }; } } return token; } Query.selectProperty = selectProperty; function selectPath(value, index) { var token = nameOrIdentifier_1.default.complexProperty(value, index) || nameOrIdentifier_1.default.complexColProperty(value, index); if (!token) return; var start = index; index = token.next; var tokenValue = token; if (value[index] === 0x2f) { var name_2 = nameOrIdentifier_1.default.qualifiedComplexTypeName(value, index + 1); if (name_2) { index = name_2.next; tokenValue = { prop: token, name: name_2 }; } } return lexer_1.default.tokenize(value, start, index, tokenValue, lexer_1.default.TokenType.SelectPath); } Query.selectPath = selectPath; function qualifiedActionName(value, index) { var namespaceNext = nameOrIdentifier_1.default.namespace(value, index); if (namespaceNext === index || value[namespaceNext] !== 0x2e) return; var start = index; index = namespaceNext + 1; var action = nameOrIdentifier_1.default.action(value, index); 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.Action); } Query.qualifiedActionName = qualifiedActionName; function qualifiedFunctionName(value, index) { var namespaceNext = nameOrIdentifier_1.default.namespace(value, index); if (namespaceNext === index || value[namespaceNext] !== 0x2e) return; var start = index; index = namespaceNext + 1; var fn = nameOrIdentifier_1.default.odataFunction(value, index); if (!fn) return; fn.value.namespace = utils_1.default.stringify(value, start, namespaceNext); index = fn.next; var tokenValue = { name: fn }; var open = lexer_1.default.OPEN(value, index); if (open) { index = open; tokenValue.parameters = []; var param = expressions_1.default.parameterName(value, index); if (!param) return; while (param) { index = param.next; tokenValue.parameters.push(param); var comma = lexer_1.default.COMMA(value, index); if (comma) { index = comma; var param_1 = expressions_1.default.parameterName(value, index); if (!param_1) return; } else break; } var close_5 = lexer_1.default.CLOSE(value, index); if (!close_5) return; index = close_5; } return lexer_1.default.tokenize(value, start, index, tokenValue, lexer_1.default.TokenType.Function); } Query.qualifiedFunctionName = qualifiedFunctionName; function skiptoken(value, index) { var start = index; if (utils_1.default.equals(value, index, "%24skiptoken")) { index += 12; } else if (utils_1.default.equals(value, index, "$skiptoken")) { index += 10; } else return; var eq = lexer_1.default.EQ(value, index); if (!eq) return; index = eq; var ch = lexer_1.default.qcharNoAMP(value, index); if (!ch) return; var valueStart = index; while (ch > index) { index = ch; ch = lexer_1.default.qcharNoAMP(value, index); } return lexer_1.default.tokenize(value, start, index, utils_1.default.stringify(value, valueStart, index), lexer_1.default.TokenType.SkipToken); } Query.skiptoken = skiptoken; function aliasAndValue(value, index) { var alias = expressions_1.default.parameterAlias(value, index); if (!alias) return; var start = index; index = alias.next; var eq = lexer_1.default.EQ(value, index); if (!eq) return; index = eq; var paramValue = expressions_1.default.parameterValue(value, index); if (!paramValue) return; index = paramValue.next; return lexer_1.default.tokenize(value, start, index, { alias: alias, value: paramValue }, lexer_1.default.TokenType.AliasAndValue); } Query.aliasAndValue = aliasAndValue; })(Query = exports.Query || (exports.Query = {})); exports.default = Query; //# sourceMappingURL=query.js.map