[Erp5-report] r25881 - /erp5/trunk/products/ZSQLCatalog/SQLCatalog.py

nobody at svn.erp5.org nobody at svn.erp5.org
Thu Mar 5 15:06:20 CET 2009


Author: vincent
Date: Thu Mar  5 15:06:20 2009
New Revision: 25881

URL: http://svn.erp5.org?rev=25881&view=rev
Log:
Preserve Abstract Syntax Tree nesting of column nodes vs. other nodes.
  This fixes failing unit tests, because what used to trigger RelatedKey.buildQuery twice no triggers it just once with a ComplexQuery as join_condition.

Modified:
    erp5/trunk/products/ZSQLCatalog/SQLCatalog.py

Modified: erp5/trunk/products/ZSQLCatalog/SQLCatalog.py
URL: http://svn.erp5.org/erp5/trunk/products/ZSQLCatalog/SQLCatalog.py?rev=25881&r1=25880&r2=25881&view=diff
==============================================================================
--- erp5/trunk/products/ZSQLCatalog/SQLCatalog.py [utf8] (original)
+++ erp5/trunk/products/ZSQLCatalog/SQLCatalog.py [utf8] Thu Mar  5 15:06:20 2009
@@ -1917,24 +1917,9 @@
     return result
 
   @profiler_decorator
-  def buildQueryFromAbstractSyntaxTreeNode(self, node, key):
-    """
-      Build a query from given Abstract Syntax Tree (AST) node by recursing in
-      its childs.
-      This method calls itself recursively when walking the tree.
-
-      node
-        AST node being treated.
-      key
-        Default column (used when there is no explicit column in an AST leaf).
-
-      Expected node API is described in Interface/IAbstractSyntaxNode.py .
-    """
+  def _buildQueryFromAbstractSyntaxTreeNode(self, node, search_key):
     if node.isLeaf():
-      result = self.buildSingleQuery(key, node.getValue(), comparison_operator=node.getComparisonOperator())
-      if result is None:
-        # Unknown, skip loudly
-        LOG('SQLCatalog', 100, 'Unknown column %r, skipped.' % (key, ))
+      result = search_key.buildQuery(node.getValue(), comparison_operator=node.getComparisonOperator())
     elif node.isColumn():
       result = self.buildQueryFromAbstractSyntaxTreeNode(node.getSubNode(), node.getColumnName())
     else:
@@ -1945,15 +1930,11 @@
         if subnode.isLeaf():
           value_dict.setdefault(subnode.getComparisonOperator(), []).append(subnode.getValue())
         else:
-          subquery = self.buildQueryFromAbstractSyntaxTreeNode(subnode, key)
+          subquery = self._buildQueryFromAbstractSyntaxTreeNode(subnode, search_key)
           if subquery is not None:
             append(subquery)
       for comparison_operator, value_list in value_dict.iteritems():
-        subquery = self.buildSingleQuery(key, value_list, comparison_operator=comparison_operator)
-        if subquery is None:
-          LOG('SQLCatalog', 100, 'Unknown column %r, skipped.' % (key, ))
-        else:
-          append(subquery)
+        append(search_key.buildQuery(value_list, comparison_operator=comparison_operator))
       operator = node.getLogicalOperator()
       if operator == 'not' or len(query_list) > 1:
         result = ComplexQuery(query_list, operator=operator)
@@ -1961,6 +1942,35 @@
         result = query_list[0]
       else:
         result = None
+    return result
+
+  @profiler_decorator
+  def buildQueryFromAbstractSyntaxTreeNode(self, node, key):
+    """
+      Build a query from given Abstract Syntax Tree (AST) node by recursing in
+      its childs.
+      This method calls itself recursively when walking the tree.
+
+      node
+        AST node being treated.
+      key
+        Default column (used when there is no explicit column in an AST leaf).
+
+      Expected node API is described in Interface/IAbstractSyntaxNode.py .
+    """
+    search_key, related_key_definition = self.getColumnSearchKey(key)
+    if search_key is None:
+      # Unknown, skip loudly
+      LOG('SQLCatalog', 100, 'Unknown column %r, skipped.' % (key, ))
+    else:
+      if related_key_definition is None:
+        build_key = search_key
+      else:
+        build_key = search_key.getSearchKey(self, related_key_definition)
+      result = self._buildQueryFromAbstractSyntaxTreeNode(node, build_key)
+      if related_key_definition is not None:
+        result = search_key.buildQuery(self, related_key_definition,
+                                       search_value=result)
     return result
 
   @profiler_decorator




More information about the Erp5-report mailing list