UNPKG

@wener/miniquery

Version:

SQL Where like **safe** filter expression for ORM.

771 lines (769 loc) 20.3 kB
import { makeRecipe } from 'ohm-js'; const result = makeRecipe([ 'grammar', { source: 'MiniQuery {\n Main = Expr end\n Expr = LogicExpr\n\n LogicExpr\n = LogicExpr logic RelExpr -- match\n | RelExpr\n\n RelExpr\n = RelExpr (">=" | "<=" | ">" | "<") InExpr -- match\n | RelExpr ("==" | "!=" | "<>" | "=") InExpr -- match_eq\n | RelExpr ":" literal -- has\n | InExpr\n InExpr\n = InExpr in Array -- match\n | PredicateExpr\n PredicateExpr\n = PredicateExpr is (null| bool) -- is\n | PredicateExpr like string -- like\n | BetweenExpr\n BetweenExpr\n = BetweenExpr between CallExpr "and" CallExpr -- match\n | CallExpr\n CallExpr\n = ident "(" ListOf<Expr,","> ")" -- match\n | PriExpr\n\n PriExpr\n = "(" Expr ")" -- paren\n | caseInsensitive<"not"> Expr -- not\n | Array\n | Value\n | "+" Expr -- pos\n | "-" Expr -- neg\n\n\n Array = "(" ListOf<Expr,","> ")" | "[" ListOf<Expr,","> "]"\n Value = literal | ref | ident\n\n ListOf<elem, sep>\n := TrailNonEmptyListOf<elem, sep>\n | EmptyListOf<elem, sep>\n\n TrailNonEmptyListOf<elem, sep>\n = elem (sep elem)* sep?\n\n in = (caseInsensitive<"not"> space+)? caseInsensitive<"in">\n is = caseInsensitive<"is"> (space+ caseInsensitive<"not">?)\n logic = caseInsensitive<"and"> | caseInsensitive<"or"> | "&&" | "||"\n like = (caseInsensitive<"not"> space+)? (caseInsensitive<"like"> | caseInsensitive<"ilike">)\n between = (caseInsensitive<"not"> space+)? caseInsensitive<"between">\n\n ref = ident ( "." (ident | string) )+\n ident = letter (alnum | "_")*\n literal = string | float | int | bool | null\n null = "null" | "NULL"\n bool = "true" | "false" | "TRUE" | "FALSE"\n string\n = "\'" (~"\'" any)* "\'"\n | "\\"" (~"\\"" any)* "\\""\n int = (("-"|"+") spaces)? uint\n uint\n = "0"\n | int_non_zero\n int_non_zero = "1".."9" digit*\n float = int? "." digit+\n}', }, 'MiniQuery', null, 'Main', { Main: [ 'define', { sourceInterval: [14, 29] }, null, [], [ 'seq', { sourceInterval: [21, 29] }, ['app', { sourceInterval: [21, 25] }, 'Expr', []], ['app', { sourceInterval: [26, 29] }, 'end', []], ], ], Expr: ['define', { sourceInterval: [32, 48] }, null, [], ['app', { sourceInterval: [39, 48] }, 'LogicExpr', []]], LogicExpr_match: [ 'define', { sourceInterval: [68, 100] }, null, [], [ 'seq', { sourceInterval: [68, 91] }, ['app', { sourceInterval: [68, 77] }, 'LogicExpr', []], ['app', { sourceInterval: [78, 83] }, 'logic', []], ['app', { sourceInterval: [84, 91] }, 'RelExpr', []], ], ], LogicExpr: [ 'define', { sourceInterval: [52, 114] }, null, [], [ 'alt', { sourceInterval: [68, 114] }, ['app', { sourceInterval: [68, 91] }, 'LogicExpr_match', []], ['app', { sourceInterval: [107, 114] }, 'RelExpr', []], ], ], RelExpr_match: [ 'define', { sourceInterval: [132, 182] }, null, [], [ 'seq', { sourceInterval: [132, 173] }, ['app', { sourceInterval: [132, 139] }, 'RelExpr', []], [ 'alt', { sourceInterval: [141, 165] }, ['terminal', { sourceInterval: [141, 145] }, '>='], ['terminal', { sourceInterval: [148, 152] }, '<='], ['terminal', { sourceInterval: [156, 159] }, '>'], ['terminal', { sourceInterval: [162, 165] }, '<'], ], ['app', { sourceInterval: [167, 173] }, 'InExpr', []], ], ], RelExpr_match_eq: [ 'define', { sourceInterval: [189, 242] }, null, [], [ 'seq', { sourceInterval: [189, 230] }, ['app', { sourceInterval: [189, 196] }, 'RelExpr', []], [ 'alt', { sourceInterval: [198, 222] }, ['terminal', { sourceInterval: [198, 202] }, '=='], ['terminal', { sourceInterval: [205, 209] }, '!='], ['terminal', { sourceInterval: [212, 216] }, '<>'], ['terminal', { sourceInterval: [219, 222] }, '='], ], ['app', { sourceInterval: [224, 230] }, 'InExpr', []], ], ], RelExpr_has: [ 'define', { sourceInterval: [249, 275] }, null, [], [ 'seq', { sourceInterval: [249, 268] }, ['app', { sourceInterval: [249, 256] }, 'RelExpr', []], ['terminal', { sourceInterval: [257, 260] }, ':'], ['app', { sourceInterval: [261, 268] }, 'literal', []], ], ], RelExpr: [ 'define', { sourceInterval: [118, 288] }, null, [], [ 'alt', { sourceInterval: [132, 288] }, ['app', { sourceInterval: [132, 173] }, 'RelExpr_match', []], ['app', { sourceInterval: [189, 230] }, 'RelExpr_match_eq', []], ['app', { sourceInterval: [249, 268] }, 'RelExpr_has', []], ['app', { sourceInterval: [282, 288] }, 'InExpr', []], ], ], InExpr_match: [ 'define', { sourceInterval: [304, 328] }, null, [], [ 'seq', { sourceInterval: [304, 319] }, ['app', { sourceInterval: [304, 310] }, 'InExpr', []], ['app', { sourceInterval: [311, 313] }, 'in', []], ['app', { sourceInterval: [314, 319] }, 'Array', []], ], ], InExpr: [ 'define', { sourceInterval: [291, 348] }, null, [], [ 'alt', { sourceInterval: [304, 348] }, ['app', { sourceInterval: [304, 319] }, 'InExpr_match', []], ['app', { sourceInterval: [335, 348] }, 'PredicateExpr', []], ], ], PredicateExpr_is: [ 'define', { sourceInterval: [371, 406] }, null, [], [ 'seq', { sourceInterval: [371, 400] }, ['app', { sourceInterval: [371, 384] }, 'PredicateExpr', []], ['app', { sourceInterval: [385, 387] }, 'is', []], [ 'alt', { sourceInterval: [389, 399] }, ['app', { sourceInterval: [389, 393] }, 'null', []], ['app', { sourceInterval: [395, 399] }, 'bool', []], ], ], ], PredicateExpr_like: [ 'define', { sourceInterval: [413, 446] }, null, [], [ 'seq', { sourceInterval: [413, 438] }, ['app', { sourceInterval: [413, 426] }, 'PredicateExpr', []], ['app', { sourceInterval: [427, 431] }, 'like', []], ['app', { sourceInterval: [432, 438] }, 'string', []], ], ], PredicateExpr: [ 'define', { sourceInterval: [351, 464] }, null, [], [ 'alt', { sourceInterval: [371, 464] }, ['app', { sourceInterval: [371, 400] }, 'PredicateExpr_is', []], ['app', { sourceInterval: [413, 438] }, 'PredicateExpr_like', []], ['app', { sourceInterval: [453, 464] }, 'BetweenExpr', []], ], ], BetweenExpr_match: [ 'define', { sourceInterval: [485, 537] }, null, [], [ 'seq', { sourceInterval: [485, 528] }, ['app', { sourceInterval: [485, 496] }, 'BetweenExpr', []], ['app', { sourceInterval: [497, 504] }, 'between', []], ['app', { sourceInterval: [505, 513] }, 'CallExpr', []], ['terminal', { sourceInterval: [514, 519] }, 'and'], ['app', { sourceInterval: [520, 528] }, 'CallExpr', []], ], ], BetweenExpr: [ 'define', { sourceInterval: [467, 552] }, null, [], [ 'alt', { sourceInterval: [485, 552] }, ['app', { sourceInterval: [485, 528] }, 'BetweenExpr_match', []], ['app', { sourceInterval: [544, 552] }, 'CallExpr', []], ], ], CallExpr_match: [ 'define', { sourceInterval: [570, 609] }, null, [], [ 'seq', { sourceInterval: [570, 600] }, ['app', { sourceInterval: [570, 575] }, 'ident', []], ['terminal', { sourceInterval: [576, 579] }, '('], [ 'app', { sourceInterval: [580, 596] }, 'ListOf', [ ['app', { sourceInterval: [587, 591] }, 'Expr', []], ['terminal', { sourceInterval: [592, 595] }, ','], ], ], ['terminal', { sourceInterval: [597, 600] }, ')'], ], ], CallExpr: [ 'define', { sourceInterval: [555, 623] }, null, [], [ 'alt', { sourceInterval: [570, 623] }, ['app', { sourceInterval: [570, 600] }, 'CallExpr_match', []], ['app', { sourceInterval: [616, 623] }, 'PriExpr', []], ], ], PriExpr_paren: [ 'define', { sourceInterval: [641, 662] }, null, [], [ 'seq', { sourceInterval: [641, 653] }, ['terminal', { sourceInterval: [641, 644] }, '('], ['app', { sourceInterval: [645, 649] }, 'Expr', []], ['terminal', { sourceInterval: [650, 653] }, ')'], ], ], PriExpr_not: [ 'define', { sourceInterval: [669, 703] }, null, [], [ 'seq', { sourceInterval: [669, 696] }, [ 'app', { sourceInterval: [669, 691] }, 'caseInsensitive', [['terminal', { sourceInterval: [685, 690] }, 'not']], ], ['app', { sourceInterval: [692, 696] }, 'Expr', []], ], ], PriExpr_pos: [ 'define', { sourceInterval: [734, 749] }, null, [], [ 'seq', { sourceInterval: [734, 742] }, ['terminal', { sourceInterval: [734, 737] }, '+'], ['app', { sourceInterval: [738, 742] }, 'Expr', []], ], ], PriExpr_neg: [ 'define', { sourceInterval: [756, 771] }, null, [], [ 'seq', { sourceInterval: [756, 764] }, ['terminal', { sourceInterval: [756, 759] }, '-'], ['app', { sourceInterval: [760, 764] }, 'Expr', []], ], ], PriExpr: [ 'define', { sourceInterval: [627, 771] }, null, [], [ 'alt', { sourceInterval: [641, 771] }, ['app', { sourceInterval: [641, 653] }, 'PriExpr_paren', []], ['app', { sourceInterval: [669, 696] }, 'PriExpr_not', []], ['app', { sourceInterval: [710, 715] }, 'Array', []], ['app', { sourceInterval: [722, 727] }, 'Value', []], ['app', { sourceInterval: [734, 742] }, 'PriExpr_pos', []], ['app', { sourceInterval: [756, 764] }, 'PriExpr_neg', []], ], ], Array: [ 'define', { sourceInterval: [776, 837] }, null, [], [ 'alt', { sourceInterval: [786, 837] }, [ 'seq', { sourceInterval: [786, 810] }, ['terminal', { sourceInterval: [786, 789] }, '('], [ 'app', { sourceInterval: [790, 806] }, 'ListOf', [ ['app', { sourceInterval: [797, 801] }, 'Expr', []], ['terminal', { sourceInterval: [802, 805] }, ','], ], ], ['terminal', { sourceInterval: [807, 810] }, ')'], ], [ 'seq', { sourceInterval: [813, 837] }, ['terminal', { sourceInterval: [813, 816] }, '['], [ 'app', { sourceInterval: [817, 833] }, 'ListOf', [ ['app', { sourceInterval: [824, 828] }, 'Expr', []], ['terminal', { sourceInterval: [829, 832] }, ','], ], ], ['terminal', { sourceInterval: [834, 837] }, ']'], ], ], ], Value: [ 'define', { sourceInterval: [840, 871] }, null, [], [ 'alt', { sourceInterval: [850, 871] }, ['app', { sourceInterval: [850, 857] }, 'literal', []], ['app', { sourceInterval: [860, 863] }, 'ref', []], ['app', { sourceInterval: [866, 871] }, 'ident', []], ], ], ListOf: [ 'override', { sourceInterval: [875, 959] }, null, ['elem', 'sep'], [ 'alt', { sourceInterval: [900, 959] }, [ 'app', { sourceInterval: [900, 930] }, 'TrailNonEmptyListOf', [ ['param', { sourceInterval: [920, 924] }, 0], ['param', { sourceInterval: [926, 929] }, 1], ], ], [ 'app', { sourceInterval: [937, 959] }, 'EmptyListOf', [ ['param', { sourceInterval: [949, 953] }, 0], ['param', { sourceInterval: [955, 958] }, 1], ], ], ], ], TrailNonEmptyListOf: [ 'define', { sourceInterval: [963, 1021] }, null, ['elem', 'sep'], [ 'seq', { sourceInterval: [1000, 1021] }, ['param', { sourceInterval: [1000, 1004] }, 0], [ 'star', { sourceInterval: [1005, 1016] }, [ 'seq', { sourceInterval: [1006, 1014] }, ['param', { sourceInterval: [1006, 1009] }, 1], ['param', { sourceInterval: [1010, 1014] }, 0], ], ], ['opt', { sourceInterval: [1017, 1021] }, ['param', { sourceInterval: [1017, 1020] }, 1]], ], ], in: [ 'define', { sourceInterval: [1025, 1084] }, null, [], [ 'seq', { sourceInterval: [1030, 1084] }, [ 'opt', { sourceInterval: [1030, 1062] }, [ 'seq', { sourceInterval: [1031, 1060] }, [ 'app', { sourceInterval: [1031, 1053] }, 'caseInsensitive', [['terminal', { sourceInterval: [1047, 1052] }, 'not']], ], ['plus', { sourceInterval: [1054, 1060] }, ['app', { sourceInterval: [1054, 1059] }, 'space', []]], ], ], [ 'app', { sourceInterval: [1063, 1084] }, 'caseInsensitive', [['terminal', { sourceInterval: [1079, 1083] }, 'in']], ], ], ], is: [ 'define', { sourceInterval: [1087, 1146] }, null, [], [ 'seq', { sourceInterval: [1092, 1146] }, [ 'app', { sourceInterval: [1092, 1113] }, 'caseInsensitive', [['terminal', { sourceInterval: [1108, 1112] }, 'is']], ], ['plus', { sourceInterval: [1115, 1121] }, ['app', { sourceInterval: [1115, 1120] }, 'space', []]], [ 'opt', { sourceInterval: [1122, 1145] }, [ 'app', { sourceInterval: [1122, 1144] }, 'caseInsensitive', [['terminal', { sourceInterval: [1138, 1143] }, 'not']], ], ], ], ], logic: [ 'define', { sourceInterval: [1149, 1217] }, null, [], [ 'alt', { sourceInterval: [1157, 1217] }, [ 'app', { sourceInterval: [1157, 1179] }, 'caseInsensitive', [['terminal', { sourceInterval: [1173, 1178] }, 'and']], ], [ 'app', { sourceInterval: [1182, 1203] }, 'caseInsensitive', [['terminal', { sourceInterval: [1198, 1202] }, 'or']], ], ['terminal', { sourceInterval: [1206, 1210] }, '&&'], ['terminal', { sourceInterval: [1213, 1217] }, '||'], ], ], like: [ 'define', { sourceInterval: [1220, 1312] }, null, [], [ 'seq', { sourceInterval: [1227, 1312] }, [ 'opt', { sourceInterval: [1227, 1259] }, [ 'seq', { sourceInterval: [1228, 1257] }, [ 'app', { sourceInterval: [1228, 1250] }, 'caseInsensitive', [['terminal', { sourceInterval: [1244, 1249] }, 'not']], ], ['plus', { sourceInterval: [1251, 1257] }, ['app', { sourceInterval: [1251, 1256] }, 'space', []]], ], ], [ 'alt', { sourceInterval: [1261, 1311] }, [ 'app', { sourceInterval: [1261, 1284] }, 'caseInsensitive', [['terminal', { sourceInterval: [1277, 1283] }, 'like']], ], [ 'app', { sourceInterval: [1287, 1311] }, 'caseInsensitive', [['terminal', { sourceInterval: [1303, 1310] }, 'ilike']], ], ], ], ], between: [ 'define', { sourceInterval: [1315, 1384] }, null, [], [ 'seq', { sourceInterval: [1325, 1384] }, [ 'opt', { sourceInterval: [1325, 1357] }, [ 'seq', { sourceInterval: [1326, 1355] }, [ 'app', { sourceInterval: [1326, 1348] }, 'caseInsensitive', [['terminal', { sourceInterval: [1342, 1347] }, 'not']], ], ['plus', { sourceInterval: [1349, 1355] }, ['app', { sourceInterval: [1349, 1354] }, 'space', []]], ], ], [ 'app', { sourceInterval: [1358, 1384] }, 'caseInsensitive', [['terminal', { sourceInterval: [1374, 1383] }, 'between']], ], ], ], ref: [ 'define', { sourceInterval: [1388, 1425] }, null, [], [ 'seq', { sourceInterval: [1394, 1425] }, ['app', { sourceInterval: [1394, 1399] }, 'ident', []], [ 'plus', { sourceInterval: [1400, 1425] }, [ 'seq', { sourceInterval: [1402, 1422] }, ['terminal', { sourceInterval: [1402, 1405] }, '.'], [ 'alt', { sourceInterval: [1407, 1421] }, ['app', { sourceInterval: [1407, 1412] }, 'ident', []], ['app', { sourceInterval: [1415, 1421] }, 'string', []], ], ], ], ], ], ident: [ 'define', { sourceInterval: [1428, 1457] }, null, [], [ 'seq', { sourceInterval: [1436, 1457] }, ['app', { sourceInterval: [1436, 1442] }, 'letter', []], [ 'star', { sourceInterval: [1443, 1457] }, [ 'alt', { sourceInterval: [1444, 1455] }, ['app', { sourceInterval: [1444, 1449] }, 'alnum', []], ['terminal', { sourceInterval: [1452, 1455] }, '_'], ], ], ], ], literal: [ 'define', { sourceInterval: [1460, 1504] }, null, [], [ 'alt', { sourceInterval: [1470, 1504] }, ['app', { sourceInterval: [1470, 1476] }, 'string', []], ['app', { sourceInterval: [1479, 1484] }, 'float', []], ['app', { sourceInterval: [1487, 1490] }, 'int', []], ['app', { sourceInterval: [1493, 1497] }, 'bool', []], ['app', { sourceInterval: [1500, 1504] }, 'null', []], ], ], null: [ 'define', { sourceInterval: [1507, 1532] }, null, [], [ 'alt', { sourceInterval: [1517, 1532] }, ['terminal', { sourceInterval: [1517, 1523] }, 'null'], ['terminal', { sourceInterval: [1526, 1532] }, 'NULL'], ], ], bool: [ 'define', { sourceInterval: [1535, 1580] }, null, [], [ 'alt', { sourceInterval: [1545, 1580] }, ['terminal', { sourceInterval: [1545, 1551] }, 'true'], ['terminal', { sourceInterval: [1554, 1561] }, 'false'], ['terminal', { sourceInterval: [1564, 1570] }, 'TRUE'], ['terminal', { sourceInterval: [1573, 1580] }, 'FALSE'], ], ], string: [ 'define', { sourceInterval: [1583, 1644] }, null, [], [ 'alt', { sourceInterval: [1596, 1644] }, [ 'seq', { sourceInterval: [1596, 1615] }, ['terminal', { sourceInterval: [1596, 1599] }, "'"], [ 'star', { sourceInterval: [1600, 1611] }, [ 'seq', { sourceInterval: [1601, 1609] }, ['not', { sourceInterval: [1601, 1605] }, ['terminal', { sourceInterval: [1602, 1605] }, "'"]], ['app', { sourceInterval: [1606, 1609] }, 'any', []], ], ], ['terminal', { sourceInterval: [1612, 1615] }, "'"], ], [ 'seq', { sourceInterval: [1622, 1644] }, ['terminal', { sourceInterval: [1622, 1626] }, '"'], [ 'star', { sourceInterval: [1627, 1639] }, [ 'seq', { sourceInterval: [1628, 1637] }, ['not', { sourceInterval: [1628, 1633] }, ['terminal', { sourceInterval: [1629, 1633] }, '"']], ['app', { sourceInterval: [1634, 1637] }, 'any', []], ], ], ['terminal', { sourceInterval: [1640, 1644] }, '"'], ], ], ], int: [ 'define', { sourceInterval: [1647, 1677] }, null, [], [ 'seq', { sourceInterval: [1653, 1677] }, [ 'opt', { sourceInterval: [1653, 1672] }, [ 'seq', { sourceInterval: [1654, 1670] }, [ 'alt', { sourceInterval: [1655, 1662] }, ['terminal', { sourceInterval: [1655, 1658] }, '-'], ['terminal', { sourceInterval: [1659, 1662] }, '+'], ], ['app', { sourceInterval: [1664, 1670] }, 'spaces', []], ], ], ['app', { sourceInterval: [1673, 1677] }, 'uint', []], ], ], uint: [ 'define', { sourceInterval: [1680, 1713] }, null, [], [ 'alt', { sourceInterval: [1691, 1713] }, ['terminal', { sourceInterval: [1691, 1694] }, '0'], ['app', { sourceInterval: [1701, 1713] }, 'int_non_zero', []], ], ], int_non_zero: [ 'define', { sourceInterval: [1716, 1746] }, null, [], [ 'seq', { sourceInterval: [1731, 1746] }, ['range', { sourceInterval: [1731, 1739] }, '1', '9'], ['star', { sourceInterval: [1740, 1746] }, ['app', { sourceInterval: [1740, 1745] }, 'digit', []]], ], ], float: [ 'define', { sourceInterval: [1749, 1774] }, null, [], [ 'seq', { sourceInterval: [1759, 1774] }, ['opt', { sourceInterval: [1759, 1763] }, ['app', { sourceInterval: [1759, 1762] }, 'int', []]], ['terminal', { sourceInterval: [1764, 1767] }, '.'], ['plus', { sourceInterval: [1768, 1774] }, ['app', { sourceInterval: [1768, 1773] }, 'digit', []]], ], ], }, ]); export default result;