[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