[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) |