# This module is part of SQLAlchemy and is released under # the MIT License: http://www.opensource.org/licenses/mit-license.php """Defines operators used in SQL expressions.""" from operator import ( and_, or_, inv, add, mul, sub, mod, truediv, lt, le, ne, gt, ge, eq, neg ) # Py2K from operator import (div,) # end Py2K from sqlalchemy.util import symbol def from_(): raise NotImplementedError() def as_(): raise NotImplementedError() def exists(): raise NotImplementedError() def is_(): raise NotImplementedError() def isnot(): raise NotImplementedError() def collate(): raise NotImplementedError() def op(a, opstring, b): return a.op(opstring)(b) def like_op(a, b, escape=None): return a.like(b, escape=escape) def notlike_op(a, b, escape=None): raise NotImplementedError() def ilike_op(a, b, escape=None): return a.ilike(b, escape=escape) def notilike_op(a, b, escape=None): raise NotImplementedError() def between_op(a, b, c): return a.between(b, c) def in_op(a, b): return a.in_(b) def notin_op(a, b): raise NotImplementedError() def distinct_op(a): return a.distinct() def startswith_op(a, b, escape=None): return a.startswith(b, escape=escape) def endswith_op(a, b, escape=None): return a.endswith(b, escape=escape) def contains_op(a, b, escape=None): return a.contains(b, escape=escape) def match_op(a, b): return a.match(b) def comma_op(a, b): raise NotImplementedError() def concat_op(a, b): return a.concat(b) def desc_op(a): return a.desc() def asc_op(a): return a.asc() _commutative = set([eq, ne, add, mul]) def is_commutative(op): return op in _commutative _smallest = symbol('_smallest') _largest = symbol('_largest') _PRECEDENCE = { from_: 15, mul: 7, truediv: 7, # Py2K div: 7, # end Py2K mod: 7, neg: 7, add: 6, sub: 6, concat_op: 6, match_op: 6, ilike_op: 5, notilike_op: 5, like_op: 5, notlike_op: 5, in_op: 5, notin_op: 5, is_: 5, isnot: 5, eq: 5, ne: 5, gt: 5, lt: 5, ge: 5, le: 5, between_op: 5, distinct_op: 5, inv: 5, and_: 3, or_: 2, comma_op: -1, collate: 7, as_: -1, exists: 0, _smallest: -1000, _largest: 1000 } def is_precedent(operator, against): return (_PRECEDENCE.get(operator, _PRECEDENCE[_smallest]) <= _PRECEDENCE.get(against, _PRECEDENCE[_largest]))