UNPKG

odatafy-parser

Version:

generate odatafy ast from odata query parameters

99 lines (76 loc) 3.69 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const peggy_1 = __importDefault(require("peggy")); const searchExpressionPreProc_1 = __importDefault(require("../processing/searchExpressionPreProc")); const errors_1 = require("../types/errors"); const utils_1 = require("../utils"); const searchParser = peggy_1.default.generate(` search = node:(searchExpr / searchExpr_incomplete) {return node} searchExpr = ( searchOrExpr / searchAndExpr / searchParenExpr / searchNegateExpr / searchPhrase / searchWord ) searchParenExpr = OPEN BWS searchExpr:searchExpr BWS CLOSE {return searchExpr} searchNegateExpr = 'NOT' RWS right:searchExpr {return{nodeType: "SearchOperatorNode", op: "NOT", right: right}} searchOrExpr = left:(searchParenExpr / searchNegateExpr / searchPhrase / searchWord) RWS 'OR' RWS right:searchExpr {return{nodeType: "SearchOperatorNode", op: "OR", left: left, right: right}} searchAndExpr = left:(searchParenExpr / searchNegateExpr / searchPhrase / searchWord) (RWS 'AND')? RWS right:searchExpr {return{nodeType: "SearchOperatorNode", op: "AND", left: left, right: right}} searchPhrase = quotation_mark value:$( qchar_no_AMP_DQUOTE / SP )* quotation_mark {return {nodeType: "SearchItemNode", type: "Phrase", value: value}} searchWord = value:$(searchChar ( searchChar / SQUOTE )*) {return {nodeType: "SearchItemNode", type: "Word", value: value}} searchChar = unreserved / pct_encoded_no_DQUOTE / "!" / "*" / "+" / "," / ":" / "@" / "/" / "?" / "$" / "=" searchExpr_incomplete = SQUOTE value:$( SQUOTE_in_string / qchar_no_AMP_SQUOTE / quotation_mark / SP )* SQUOTE {return {nodeType: "SearchItemNode", type: "Phrase", value: value}} qchar_no_AMP_SQUOTE = unreserved / pct_encoded / other_delims / ":" / "@" / "/" / "?" / "$" / "=" qchar_no_AMP_DQUOTE = unreserved / pct_encoded_no_DQUOTE / other_delims / ":" / "@" / "/" / "?" / "$" / "'" / "=" pct_encoded = "%" HEXDIG HEXDIG other_delims = "!" / "(" / ")" / "*" / "+" / "," / ";" pct_encoded_no_DQUOTE = "%" ( "0" / "1" / "3" / "4" / "5" / "6" / "7" / "8" / "9" / A_to_F ) HEXDIG / "%" "2" ( "0" / "1" / "3" / "4" / "5" / "6" / "7" / "8" / "9" / A_to_F ) SQUOTE_in_string = SQUOTE SQUOTE unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" quotation_mark = DQUOTE / "%22" RWS = ( SP / HTAB / "%20" / "%09" )+ BWS = ( SP / HTAB / "%20" / "%09" )* AT = "@" / "%40" COLON = ":" / "%3A" COMMA = "," / "%2C" EQ = "=" HASH = "%23" SIGN = "+" / "%2B" / "-" SEMI = ";" / "%3B" STAR = "*" / "%2A" SQUOTE = "'" / "%27" OPEN = "(" / "%28" CLOSE = ")" / "%29" ALPHA = [a-z] / [A-Z] / "ä" / "ö" / "ü" / "Ä" / "Ö" / "Ü" / "ß" DIGIT = [0-9] HEXDIG = DIGIT / A_to_F A_to_F = "A" / "B" / "C" / "D" / "E" / "F" DQUOTE = '"' SP = ' ' HTAB = ' ' `); function parseSearch(expr) { try { expr = (0, searchExpressionPreProc_1.default)(expr); const searchNode = searchParser.parse(expr); return searchNode; } catch (e) { throw (0, utils_1.getOdatafyParserError)('malformed search expression', errors_1.OdatafyQueryOptions.Search); } } exports.default = { /** * Parser for search expressions * @param expr search expression as string * @example searchParser.parse("blue OR green OR red") * @returns Abstract Syntax Tree (AST) of type SearchNode */ parse: parseSearch };