# HG changeset patch # User Sylvain Thénault <sylvain.thenault@logilab.fr> # Date 1255630816 -7200 # Thu Oct 15 20:20:16 2009 +0200 # Node ID ea94772baa773271e774e9dd12296bee188a2bd9 # Parent eff0513d21e855e55ab27d0ef4662249c200a26d use .final instead of .is_final(), comment out assertions in stcheck diff --git a/analyze.py b/analyze.py --- a/analyze.py +++ b/analyze.py @@ -304,7 +304,7 @@ # default domains for a variable self._base_domain = [str(etype) for etype in schema.entities()] self._nonfinal_domain = [str(etype) for etype in schema.entities() - if not etype.is_final()] + if not etype.final] def solve(self, node, constraints): # debug info @@ -441,7 +441,7 @@ if varnames: # add constraint on real relation types if no restriction types = [eschema.type for eschema in self.schema.entities() - if not eschema.is_final()] + if not eschema.final] constraints.vars_have_same_types( varnames, types ) self.solve(node, constraints) @@ -468,7 +468,7 @@ if not isinstance(rhs, nodes.VariableRef): return True self._extract_constraint(constraints, rhs.name, lhs, rschema.objects) - elif isinstance(rhs, nodes.Constant) and not rschema.is_final(): + elif isinstance(rhs, nodes.Constant) and not rschema.final: # rhs.type is None <-> NULL if not isinstance(lhs, nodes.VariableRef) or rhs.type is None: return True @@ -554,5 +554,5 @@ def visit_not(self, et, constraints): child = et.children[0] if isinstance(child, nodes.Relation) and \ - not self.schema.rschema(child.r_type).is_final(): + not self.schema.rschema(child.r_type).final: return True diff --git a/nodes.py b/nodes.py --- a/nodes.py +++ b/nodes.py @@ -712,11 +712,12 @@ def initargs(self, stmt): """return list of arguments to give to __init__ to clone this node""" - if isinstance(self.variable, ColumnAlias): - newvar = stmt.get_variable(self.name, self.variable.colnum) + var = self.variable + if isinstance(var, ColumnAlias): + newvar = stmt.get_variable(self.name, var.colnum) else: newvar = stmt.get_variable(self.name) - newvar.init_copy(self.variable) + newvar.init_copy(var) return (newvar,) def is_equivalent(self, other): @@ -902,7 +903,7 @@ for rel in self.stinfo['relations']: if schema is not None: rschema = schema.rschema(rel.r_type) - if rschema.is_final(): + if rschema.final: if self.name == rel.children[0].name: # ignore final relation where this variable is used as subject continue diff --git a/stcheck.py b/stcheck.py --- a/stcheck.py +++ b/stcheck.py @@ -115,10 +115,10 @@ if node.distinct and node.orderby: # check that variables referenced in the given term are reachable from # a selected variable with only ?1 cardinalityselected - selectidx = frozenset(vref.name for term in selected for vref in term.iget_nodes(VariableRef)) + selectidx = frozenset(vref.name for term in selected for vref in term.get_nodes(VariableRef)) schema = self.schema for sortterm in node.orderby: - for vref in sortterm.term.iget_nodes(VariableRef): + for vref in sortterm.term.get_nodes(VariableRef): if vref.name in selectidx: continue for vname in selectidx: @@ -230,12 +230,12 @@ pass def visit_and(self, et, errors): - assert len(et.children) == 2, len(et.children) + pass #assert len(et.children) == 2, len(et.children) def leave_and(self, node, errors): pass def visit_or(self, ou, errors): - assert len(ou.children) == 2, len(ou.children) + #assert len(ou.children) == 2, len(ou.children) # simplify Ored expression of a symetric relation r1, r2 = ou.children[0], ou.children[1] try: @@ -271,15 +271,15 @@ if relation.r_type == 'identity': lhs, rhs = relation.children #assert not isinstance(relation.parent, Not) - assert rhs.operator == '=' + #assert rhs.operator == '=' elif relation.r_type == 'is': # special case "C is NULL" if relation.children[1].operator == 'IS': lhs, rhs = relation.children - assert isinstance(lhs, VariableRef), lhs - assert isinstance(rhs.children[0], Constant) - assert rhs.operator == 'IS', rhs.operator - assert rhs.children[0].type == None + #assert isinstance(lhs, VariableRef), lhs + #assert isinstance(rhs.children[0], Constant) + #assert rhs.operator == 'IS', rhs.operator + #assert rhs.children[0].type == None elif not relation.r_type in self.schema: errors.append('unknown relation `%s`' % relation.r_type) try: @@ -299,12 +299,12 @@ # relation) def visit_comparison(self, comparison, errors): - assert len(comparison.children) in (1,2), len(comparison.children) + pass #assert len(comparison.children) in (1,2), len(comparison.children) def leave_comparison(self, node, errors): pass def visit_mathexpression(self, mathexpr, errors): - assert len(mathexpr.children) == 2, len(mathexpr.children) + pass #assert len(mathexpr.children) == 2, len(mathexpr.children) def leave_mathexpression(self, node, errors): pass @@ -323,28 +323,30 @@ function.children[0].descr().aggregat: errors.append('can\'t nest aggregat functions') if funcdescr.name == 'IN': - assert function.parent.operator == '=' + #assert function.parent.operator == '=' if len(function.children) == 1: function.parent.append(function.children[0]) function.parent.remove(function) - else: - assert len(function.children) >= 1 + #else: + # assert len(function.children) >= 1 def leave_function(self, node, errors): pass def visit_variableref(self, variableref, errors): - assert len(variableref.children)==0 - assert not variableref.parent is variableref + #assert len(variableref.children)==0 + #assert not variableref.parent is variableref ## try: ## assert variableref.variable in variableref.root().defined_vars.values(), \ ## (variableref.root(), variableref.variable, variableref.root().defined_vars) ## except AttributeError: ## raise Exception((variableref.root(), variableref.variable)) + pass + def leave_variableref(self, node, errors): pass def visit_constant(self, constant, errors): - assert len(constant.children)==0 + #assert len(constant.children)==0 if constant.type == 'etype': if constant.relation().r_type not in ('is', 'is_instance_of'): msg ='using an entity type in only allowed with "is" relation' @@ -382,7 +384,7 @@ node.has_aggregat = True break # register the selection column index - for vref in term.iget_nodes(VariableRef): + for vref in term.get_nodes(VariableRef): vref.variable.stinfo['selected'].add(i) vref.variable.set_scope(node) vref.variable.set_sqlscope(node) @@ -407,7 +409,7 @@ if node.having: # if there is a having clause, bloc simplification of variables used in GROUPBY for term in node.groupby: - for vref in term.iget_nodes(VariableRef): + for vref in term.get_nodes(VariableRef): vref.variable.stinfo['blocsimplification'].add(term) for var in node.defined_vars.itervalues(): if not var.stinfo['relations'] and var.stinfo['typerels'] and not var.stinfo['selected']: @@ -439,7 +441,7 @@ if rel in var.stinfo['rhsrelations']: lhs, rhs = rel.get_parts() if vref is rhs.children[0] and \ - self.schema.rschema(rel.r_type).is_final(): + self.schema.rschema(rel.r_type).final: update_attrvars(newvar, rel, lhs) lhsvar = getattr(lhs, 'variable', None) var.stinfo['attrvars'].remove( (lhsvar, rel.r_type) ) @@ -483,13 +485,13 @@ visit_or = visit_and def visit_relation(self, relation, scope, sqlscope): - assert relation.parent, repr(relation) + #assert relation.parent, repr(relation) lhs, rhs = relation.get_parts() # may be a constant once rqlst has been simplified lhsvar = getattr(lhs, 'variable', None) if relation.is_types_restriction(): - assert rhs.operator == '=' - assert not relation.optional + #assert rhs.operator == '=' + #assert not relation.optional if lhsvar is not None: lhsvar.stinfo['typerels'].add(relation) return @@ -541,15 +543,15 @@ lhsvar.stinfo.setdefault(key, set()).add(relation) else: lhsvar.stinfo.setdefault(key, set()).add(relation) - elif rschema.is_final() or rschema.inlined: + elif rschema.final or rschema.inlined: lhsvar.stinfo['blocsimplification'].add(relation) - for vref in rhs.iget_nodes(VariableRef): + for vref in rhs.get_nodes(VariableRef): var = vref.variable var.set_scope(scope) var.set_sqlscope(sqlscope) var.stinfo['relations'].add(relation) var.stinfo['rhsrelations'].add(relation) - if vref is rhs.children[0] and rschema.is_final(): + if vref is rhs.children[0] and rschema.final: update_attrvars(var, relation, lhs) diff --git a/test/unittest_analyze.py b/test/unittest_analyze.py --- a/test/unittest_analyze.py +++ b/test/unittest_analyze.py @@ -47,7 +47,8 @@ def objects(self, etype=None): return self.obj_types - def is_final(self): + @property + def final(self): return self.obj_types[0] in FINAL_ETYPES def iter_rdefs(self): @@ -63,9 +64,7 @@ def __init__(self, type, specialized_by=None): self.type = type self._specialized_by = specialized_by or () - - def is_final(self): - return self.type in FINAL_ETYPES + self.final = self.type in FINAL_ETYPES def specialized_by(self): return self._specialized_by