38 from rql.nodes import (SortTerm, VariableRef, Constant, Function, Not, |
38 from rql.nodes import (SortTerm, VariableRef, Constant, Function, Not, |
39 Variable, ColumnAlias, Relation, SubQuery, Exists) |
39 Variable, ColumnAlias, Relation, SubQuery, Exists) |
40 |
40 |
41 from cubicweb.server.sqlutils import SQL_PREFIX |
41 from cubicweb.server.sqlutils import SQL_PREFIX |
42 from cubicweb.server.utils import cleanup_solutions |
42 from cubicweb.server.utils import cleanup_solutions |
|
43 |
|
44 ColumnAlias._q_invariant = False # avoid to check for ColumnAlias / Variable |
43 |
45 |
44 def _new_var(select, varname): |
46 def _new_var(select, varname): |
45 newvar = select.get_variable(varname) |
47 newvar = select.get_variable(varname) |
46 if not 'relations' in newvar.stinfo: |
48 if not 'relations' in newvar.stinfo: |
47 # not yet initialized |
49 # not yet initialized |
709 if rhsvar._q_invariant: |
711 if rhsvar._q_invariant: |
710 return self._extra_join_sql(relation, lhssql, rhsvar) |
712 return self._extra_join_sql(relation, lhssql, rhsvar) |
711 return '%s=%s' % (lhssql, rhsvar.accept(self)) |
713 return '%s=%s' % (lhssql, rhsvar.accept(self)) |
712 |
714 |
713 def _process_relation_term(self, relation, rid, termvar, termconst, relfield): |
715 def _process_relation_term(self, relation, rid, termvar, termconst, relfield): |
714 if termconst or isinstance(termvar, ColumnAlias) or not termvar._q_invariant: |
716 if termconst or not termvar._q_invariant: |
715 termsql = termconst and termconst.accept(self) or termvar.accept(self) |
717 termsql = termconst and termconst.accept(self) or termvar.accept(self) |
716 yield '%s.%s=%s' % (rid, relfield, termsql) |
718 yield '%s.%s=%s' % (rid, relfield, termsql) |
717 elif termvar._q_invariant: |
719 elif termvar._q_invariant: |
718 # if the variable is mapped, generate restriction anyway |
720 # if the variable is mapped, generate restriction anyway |
719 if termvar.name in self._varmap: |
721 if termvar.name in self._varmap: |