136 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# 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]))
 |