[Erp5-report] r33145 yusuke - /erp5/trunk/products/ZSQLCatalog/Query/ComplexQuery.py

nobody at svn.erp5.org nobody at svn.erp5.org
Fri Feb 26 12:22:02 CET 2010


Author: yusuke
Date: Fri Feb 26 12:22:01 2010
New Revision: 33145

URL: http://svn.erp5.org?rev=33145&view=rev
Log:
the query shall raise an exception when buggy case.

Modified:
    erp5/trunk/products/ZSQLCatalog/Query/ComplexQuery.py

Modified: erp5/trunk/products/ZSQLCatalog/Query/ComplexQuery.py
URL: http://svn.erp5.org/erp5/trunk/products/ZSQLCatalog/Query/ComplexQuery.py?rev=33145&r1=33144&r2=33145&view=diff
==============================================================================
--- erp5/trunk/products/ZSQLCatalog/Query/ComplexQuery.py [utf8] (original)
+++ erp5/trunk/products/ZSQLCatalog/Query/ComplexQuery.py [utf8] Fri Feb 26 12:22:01 2010
@@ -34,6 +34,8 @@
 from Products.ZSQLCatalog.interfaces.query import IQuery
 from zope.interface.verify import verifyClass
 from Products.ZSQLCatalog.SQLCatalog import profiler_decorator
+from Products.ZSQLCatalog.Query.AutoQuery import AutoQuery
+from Products.ZSQLCatalog.Query.RelatedQuery import RelatedQuery
 
 logical_operator_search_text_dict = {
   'and': 'AND',
@@ -91,6 +93,45 @@
         query = SQLQuery(query)
       append(query)
     self.query_list = new_query_list
+    self.checkQueryTree()
+
+  def _findRelatedQuery(self, query):
+    """
+      XXX This method is used for checkQueryTree checking.
+      Find RelatedQuery or a query which have RelatedQuery
+      from container queries recursively
+    """
+    result = None
+    if isinstance(query, AutoQuery):
+      result = self._findRelatedQuery(query.wrapped_query)
+    elif isinstance(query, ComplexQuery):
+      if getattr(query, '_has_related_query', False):
+        result = query
+      else:
+        for sub_query in query.query_list:
+          result = self._findRelatedQuery(sub_query)
+          if result:
+            break
+    elif isinstance(query, RelatedQuery):
+      result = query
+    return result
+
+  def checkQueryTree(self):
+    """
+      XXX
+      If self has 'or' operator and a RelatedQuery in the tree,
+      it will not return valid result.
+    """
+    for query in self.query_list:
+      result = self._findRelatedQuery(query)
+      if result:
+        self._has_related_query = True
+        break
+    else:
+      self._has_related_query = False
+    if (self._has_related_query and
+        self.logical_operator == 'or'):
+      raise NotImplementedError
 
   @profiler_decorator
   def _asSearchTextExpression(self, sql_catalog, column=None):




More information about the Erp5-report mailing list