--- a/server/sources/rql2sql.py Tue Sep 15 19:04:09 2009 +0200
+++ b/server/sources/rql2sql.py Wed Sep 16 14:16:19 2009 +0200
@@ -336,6 +336,7 @@
self._varmap = varmap
self._query_attrs = {}
self._state = None
+ self._not_scope_offset = 0
try:
# union query for each rqlst / solution
sql = self.union_sql(union)
@@ -553,7 +554,11 @@
def visit_not(self, node):
self._state.push_scope()
+ if isinstance(node.children[0], Relation):
+ self._not_scope_offset += 1
csql = node.children[0].accept(self)
+ if isinstance(node.children[0], Relation):
+ self._not_scope_offset -= 1
sqls, tables = self._state.pop_scope()
if node in self._state.done or not csql:
# already processed or no sql generated by children
@@ -1080,12 +1085,16 @@
# a EXISTS node
if var.sqlscope is var.stmt:
scope = 0
+ # don't consider not_scope_offset if the variable is only used in one
+ # relation
+ elif len(var.stinfo['relations']) > 1:
+ scope = -1 - self._not_scope_offset
else:
scope = -1
try:
sql = self._varmap[var.name]
table = sql.split('.', 1)[0]
- if scope == -1:
+ if scope < 0:
scope = self._varmap_table_scope(var.stmt, table)
self.add_table(table, scope=scope)
except KeyError:
@@ -1146,8 +1155,8 @@
key = table
if key in self._state.tables:
return
- if scope == -1:
- scope = len(self._state.actual_tables) - 1
+ if scope < 0:
+ scope = len(self._state.actual_tables) + scope
self._state.tables[key] = (scope, table)
self._state.actual_tables[scope].append(table)