[Modeling-cvs] ProjectModeling/Modeling CHANGES,1.121,1.122 SQLExpression.py,1.17,1.18 Qualifier.py,
Status: Abandoned
Brought to you by:
sbigaret
|
From: <sbi...@us...> - 2003-07-10 11:57:58
|
Update of /cvsroot/modeling/ProjectModeling/Modeling
In directory sc8-pr-cvs1:/tmp/cvs-serv32057
Modified Files:
CHANGES SQLExpression.py Qualifier.py QualifierParser.py
Log Message:
Added operator 'in' and 'not in' for fetch qualifiers. Operators 'AND', 'OR'
and 'NOT' can now be written with lower-case characters.
Index: CHANGES
===================================================================
RCS file: /cvsroot/modeling/ProjectModeling/Modeling/CHANGES,v
retrieving revision 1.121
retrieving revision 1.122
diff -C2 -d -r1.121 -r1.122
*** CHANGES 7 Jul 2003 14:57:13 -0000 1.121
--- CHANGES 10 Jul 2003 11:57:54 -0000 1.122
***************
*** 8,11 ****
--- 8,13 ----
--------------------------------------------------------
+ * Added operator 'in' and 'not in' for fetch qualifiers. Operators 'AND',
+ 'OR' and 'NOT' can now be written with lower-case characters.
[Merged branch brch-0_9pre7-1-PyModel]
Index: SQLExpression.py
===================================================================
RCS file: /cvsroot/modeling/ProjectModeling/Modeling/SQLExpression.py,v
retrieving revision 1.17
retrieving revision 1.18
diff -C2 -d -r1.17 -r1.18
*** SQLExpression.py 17 Mar 2003 12:43:21 -0000 1.17
--- SQLExpression.py 10 Jul 2003 11:57:54 -0000 1.18
***************
*** 48,52 ****
QualifierOperatorGreaterThanOrEqualTo, \
QualifierOperatorLike, \
! QualifierOperatorCaseInsensitiveLike
from Relationship import \
--- 48,53 ----
QualifierOperatorGreaterThanOrEqualTo, \
QualifierOperatorLike, \
! QualifierOperatorCaseInsensitiveLike, \
! QualifierOperatorIn, QualifierOperatorNotIn
from Relationship import \
***************
*** 1198,1202 ****
keyString=self.sqlStringForAttributeNamed(key)
! valueString=self.sqlStringForValue(value, key)
if not caseInsensitive:
--- 1199,1206 ----
keyString=self.sqlStringForAttributeNamed(key)
! if aQualifier.operator() in (QualifierOperatorIn, QualifierOperatorNotIn):
! valueString=self.sqlStringForInOperatorValue(value)
! else:
! valueString=self.sqlStringForValue(value, key)
if not caseInsensitive:
***************
*** 1205,1208 ****
--- 1209,1226 ----
return self.sqlStringForCaseInsensitiveLike(keyString, valueString)
+ def sqlStringForInOperatorValue(self, aList):
+ """
+ Returns the SQL string suitable for operator IN and NOT IN.
+ The returned string is a comma-separated list of the values in aList,
+ surrounded by brackets.
+
+ Example: aList=[1], return '(1)'
+ aList=(1,2,4), return '(1, 2, 4)'
+ """
+ if len(aList)==1:
+ return '(%s)'%aList[0]
+ else:
+ return str(tuple(aList))
+
def sqlStringForNegatedQualifier(self, aQualifier):
"""
***************
*** 1342,1345 ****
--- 1360,1369 ----
elif selectorIs(QualifierOperatorLike):
return "LIKE"
+
+ elif selectorIs(QualifierOperatorIn):
+ return "IN"
+
+ elif selectorIs(QualifierOperatorNotIn):
+ return "NOT IN"
raise ValueError, 'Unknown selector: %s'%repr(selector)
Index: Qualifier.py
===================================================================
RCS file: /cvsroot/modeling/ProjectModeling/Modeling/Qualifier.py,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** Qualifier.py 31 May 2003 10:16:57 -0000 1.6
--- Qualifier.py 10 Jul 2003 11:57:55 -0000 1.7
***************
*** 77,83 ****
return re.match(__likeExprToRegexpString__(value2),str(value1),re.IGNORECASE)
# Module
def allQualifierOperators():
! return ('==', '!=', '<', '<=', '>', '>=', 'like', 'caseInsensitiveLike', 'ilike')
def filteredArrayWithQualifier(objects, qualifier):
--- 77,91 ----
return re.match(__likeExprToRegexpString__(value2),str(value1),re.IGNORECASE)
+ def QualifierOperatorIn(value1, value2):
+ if type(value2)==type(''):
+ value2=eval(value2)
+ return value1 in value2
+
+ def QualifierOperatorNotIn(value1, value2):
+ return not QualifierOperatorIn(value1, value2)
+
# Module
def allQualifierOperators():
! return ('==', '!=', '<', '<=', '>', '>=', 'like', 'caseInsensitiveLike', 'ilike', 'in', 'not_in')
def filteredArrayWithQualifier(objects, qualifier):
***************
*** 97,100 ****
--- 105,110 ----
if op == '>=': return QualifierOperatorGreaterThanOrEqualTo
if op == 'like': return QualifierOperatorLike
+ if op == 'in': return QualifierOperatorIn
+ if op == 'not_in': return QualifierOperatorNotIn
if op in ('caseInsensitiveLike', 'ilike'):
return QualifierOperatorCaseInsensitiveLike
***************
*** 131,134 ****
--- 141,146 ----
if operator == QualifierOperatorLike: return 'like'
if operator == QualifierOperatorCaseInsensitiveLike: return 'caseInsensitiveLike'
+ if operator == QualifierOperatorIn: return 'in'
+ if operator == QualifierOperatorNotIn: return 'not_in'
raise ValueError
Index: QualifierParser.py
===================================================================
RCS file: /cvsroot/modeling/ProjectModeling/Modeling/QualifierParser.py,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** QualifierParser.py 31 May 2003 10:16:57 -0000 1.8
--- QualifierParser.py 10 Jul 2003 11:57:55 -0000 1.9
***************
*** 166,183 ****
def t_operator(self, s):
! r' AND | OR '
trace('Token Operator: %s'%s)
! self.rv.append(Token(type=s))
def t_not_operator(self, s):
! r' NOT '
trace('Token NOT: %s'%s)
! self.rv.append(Token(type=s))
def t_comp_op(self, s):
! r' \+ | \* | == | >= | > | <= | < | \!= | like | caseInsensitiveLike | ilike'
trace('Token COMP_OP: %s'%s)
self.rv.append(Token(type=s))
def t_number(self, s):
r' \d+ '
--- 166,188 ----
def t_operator(self, s):
! r' AND | and | OR | or '
trace('Token Operator: %s'%s)
! self.rv.append(Token(type=s.upper()))
def t_not_operator(self, s):
! r' NOT | not '
trace('Token NOT: %s'%s)
! self.rv.append(Token(type=s.upper()))
def t_comp_op(self, s):
! r' \+ | \* | == | >= | > | <= | < | \!= | like | caseInsensitiveLike | ilike '
trace('Token COMP_OP: %s'%s)
self.rv.append(Token(type=s))
+ def t_comp_op2(self, s):
+ r' in | IN '
+ trace('Token COMP_OP2: %s'%s)
+ self.rv.append(Token(type=s.lower()))
+
def t_number(self, s):
r' \d+ '
***************
*** 211,214 ****
--- 216,234 ----
self.rv.append(t)
+ def t_square_bracket_open(self, s):
+ r' \[ '
+ trace('Token square_bracket_open: %s'%s)
+ self.rv.append(Token(type='square_bracket_open'))
+
+ def t_square_bracket_close(self, s):
+ r' \] '
+ trace('Token square_bracket_close: %s'%s)
+ self.rv.append(Token(type='square_bracket_close'))
+
+ def t_comma(self, s):
+ r' , '
+ trace('Token comma: %s'%s)
+ self.rv.append(Token(type='comma'))
+
#def t_simplekeypath(self, s):
# r' \c+ '
***************
*** 265,272 ****
right=args[2])
def p_expr_2(self, args):
r' expr ::= paren_open expr paren_close '
trace('paren expr_2:%s (%s-%s-%s)'%(args[1],args[1].left,args[1].type,args[1].right))
- #inside=AST(args[0])
return AST(Token('paren', args[1]))
--- 285,322 ----
right=args[2])
+ def p_expr_in(self, args):
+ r' expr ::= expr comp_op2 square_bracket_open comma_separated square_bracket_close '
+ trace('p_expr_1a %s/%s/%s/%s/%s'%(args[0],args[1],args[2],args[3],args[4]))
+ return AST(type=args[1],
+ left=args[0],
+ right=args[3])
+
+ def p_expr_not_in(self, args):
+ r' expr ::= expr not_in square_bracket_open comma_separated square_bracket_close '
+ trace('p_expr_1a %s/%s/%s/%s/%s'%(args[0],args[1],args[2],args[3],args[4]))
+ return AST(type=args[1],
+ left=args[0],
+ right=args[3])
+
+ def p_not_in(self, args):
+ r' not_in ::= not_operator comp_op2 '
+ trace('p_not_in %s %s'%(args[0],args[1]))
+ return AST(Token('not_in'))
+
+ def p_comma_separated_1(self, args):
+ r' comma_separated ::= term '
+ trace('p_comma_separated_1 %s'%args[0])
+ return AST(Token('comma_separated', [args[0]]))
+
+ def p_comma_separated_2(self, args):
+ r' comma_separated ::= comma_separated comma term'
+ trace('p_comma_separated_2 %s %s'%(args[0], args[2]))
+ l=args[0].attr[:]
+ l.append(args[2])
+ return AST(Token('comma_separated', l))
+
def p_expr_2(self, args):
r' expr ::= paren_open expr paren_close '
trace('paren expr_2:%s (%s-%s-%s)'%(args[1],args[1].left,args[1].type,args[1].right))
return AST(Token('paren', args[1]))
***************
*** 332,335 ****
--- 382,392 ----
return AST(type=args[0])
+ def p_comp_op2(self, args):
+ '''
+ comp_op2 ::= in
+ '''
+ trace('comp_op2: %s'%args[0])
+ return AST(type=args[0])
+
def p_operator(self, args):
'''
***************
*** 381,387 ****
trace('N_PAREN ######%s %s'%(node.type,repr(node)))
node.exprType = 'paren'
def default(self, node):
# this handles + and * nodes
! trace("node: %s %s"%(node,node.type))
#leftType = node.left.exprType
#rightType = node.right.exprType
--- 438,447 ----
trace('N_PAREN ######%s %s'%(node.type,repr(node)))
node.exprType = 'paren'
+ def n_comma_separated(self, node):
+ trace('COMMA_SEPARATED ######%s %s'%(node.type,repr(node)))
+ node.exprType = 'comma_separated'
def default(self, node):
# this handles + and * nodes
! trace("TypeCheck default: node: %s %s"%(node,node.type))
#leftType = node.left.exprType
#rightType = node.right.exprType
***************
*** 405,408 ****
--- 465,469 ----
class Interpret(ASTTraversal):
def __init__(self, ast):
+ trace('Interpret.init() ast: %s'%ast)
ASTTraversal.__init__(self, ast)
self.postorder()
***************
*** 426,440 ****
node.value = _node.value
#node.attr = _node.attr
!
def n_NOT(self, node):
_node=Interpret(node.attr)
trace('NOT node :%s'%_node.value)
node.value = NotQualifier(_node.value)
!
def default(self, node):
left = right = None
! try:
! left = node.left.value
! right = node.right.value
except: pass
# This is the original calculator!
--- 487,510 ----
node.value = _node.value
#node.attr = _node.attr
! def n_comma_separated(self, node):
! trace('## Interpret comma_separated ###### %s'%repr(node))
! trace('## node.attr: %s'%node.attr)
! #_node=Interpret(node.attr)
! l=[]
! for attr in node.attr:
! l.append(Interpret(attr).value)
! #node.value = list(node.attr)
! node.value = l
def n_NOT(self, node):
_node=Interpret(node.attr)
trace('NOT node :%s'%_node.value)
node.value = NotQualifier(_node.value)
!
def default(self, node):
left = right = None
! trace('default: node: %s'%node)
! try: left = node.left.value
! except: pass
! try: right = node.right.value
except: pass
# This is the original calculator!
***************
*** 455,465 ****
operatorForString(node.type),
node[1].value)
! trace("node.value: %s"%node.value)
! if node[1].type in ('string', 'number', 'float', 'nullValue'):
node.value=KeyValueQualifier(node[0].value,
operatorForString(node.type),
node[1].value)
! trace("node.value: %s"%node.value)
!
--- 525,535 ----
operatorForString(node.type),
node[1].value)
! trace("node.value(keypath): %s"%node.value)
! if node[1].type in ('string', 'number', 'float', 'nullValue',
! 'comma_separated'):
node.value=KeyValueQualifier(node[0].value,
operatorForString(node.type),
node[1].value)
! trace("node.value(other): %s"%node.value)
|