rawsql-ts
Version:
[beta]High-performance SQL parser and AST analyzer written in TypeScript. Provides fast parsing and advanced transformation capabilities.
107 lines • 2.93 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.OperatorPrecedence = void 0;
/**
* SQL operator precedence definitions
* Higher numbers indicate higher precedence (tighter binding)
*/
class OperatorPrecedence {
/**
* Get the precedence of an operator
* @param operator The operator string
* @returns The precedence number (higher = tighter binding)
*/
static getPrecedence(operator) {
const precedence = this.precedenceMap[operator.toLowerCase()];
return precedence !== undefined ? precedence : 0;
}
/**
* Check if operator1 has higher or equal precedence than operator2
*/
static hasHigherOrEqualPrecedence(operator1, operator2) {
return this.getPrecedence(operator1) >= this.getPrecedence(operator2);
}
/**
* Check if an operator is a logical operator (AND/OR)
*/
static isLogicalOperator(operator) {
const op = operator.toLowerCase();
return op === 'and' || op === 'or';
}
/**
* Check if an operator is a BETWEEN operator
*/
static isBetweenOperator(operator) {
const op = operator.toLowerCase();
return op === 'between' || op === 'not between';
}
/**
* Check if a string is a comparison operator
*/
static isComparisonOperator(operator) {
const lowerOp = operator.toLowerCase();
return ['=', '!=', '<>', '<', '>', '<=', '>=', 'like', 'ilike', 'similar to', 'in', 'not in',
'->', '->>', '#>', '#>>', '@>', '<@', '?', '?|', '?&',
'~', '~*', '!~', '!~*', 'rlike', 'regexp'].includes(lowerOp);
}
}
exports.OperatorPrecedence = OperatorPrecedence;
OperatorPrecedence.precedenceMap = {
// Logical operators (lowest precedence)
'or': 1,
'and': 2,
// Comparison operators
'=': 10,
'!=': 10,
'<>': 10,
'<': 10,
'<=': 10,
'>': 10,
'>=': 10,
'like': 10,
'ilike': 10,
'not like': 10,
'not ilike': 10,
'similar to': 10,
'not similar to': 10,
'in': 10,
'not in': 10,
'is': 10,
'is not': 10,
// JSON operators (PostgreSQL/MySQL)
'->': 10,
'->>': 10,
'#>': 10,
'#>>': 10,
'@>': 10,
'<@': 10,
'?': 10,
'?|': 10,
'?&': 10,
// Regular expression operators (PostgreSQL/MySQL)
'~': 10,
'~*': 10,
'!~': 10,
'!~*': 10,
'rlike': 10,
'regexp': 10,
// MySQL arithmetic/logical operators
'mod': 30, // Same precedence as %
'xor': 2, // Same precedence as OR
'between': 15, // BETWEEN has higher precedence than logical operators
'not between': 15,
// Arithmetic operators
'+': 20,
'-': 20,
'*': 30,
'/': 30,
'%': 30,
'^': 40,
// Type casting
'::': 50,
// Highest precedence operators
'unary+': 100,
'unary-': 100,
'not': 100
};
//# sourceMappingURL=OperatorPrecedence.js.map
;