[Erp5-report] r9225 - in /erp5/trunk/products: ERP5Catalog/tests/ ZSQLCatalog/

nobody at svn.erp5.org nobody at svn.erp5.org
Wed Aug 16 13:40:49 CEST 2006


Author: jerome
Date: Wed Aug 16 13:40:37 2006
New Revision: 9225

URL: http://svn.erp5.org?rev=9225&view=rev
Log:
sort-index was not workfing for dynamic related keys, and was poorly tested.


Modified:
    erp5/trunk/products/ERP5Catalog/tests/testERP5Catalog.py
    erp5/trunk/products/ZSQLCatalog/SQLCatalog.py

Modified: erp5/trunk/products/ERP5Catalog/tests/testERP5Catalog.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Catalog/tests/testERP5Catalog.py?rev=9225&r1=9224&r2=9225&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Catalog/tests/testERP5Catalog.py (original)
+++ erp5/trunk/products/ERP5Catalog/tests/testERP5Catalog.py Wed Aug 16 13:40:37 2006
@@ -39,13 +39,14 @@
 from AccessControl.SecurityManagement import newSecurityManager
 from zLOG import LOG
 from DateTime import DateTime
+from Products.CMFCore.tests.base.testcase import LogInterceptor
 
 try:
   from transaction import get as get_transaction
 except ImportError:
   pass
 
-class TestERP5Catalog(ERP5TypeTestCase):
+class TestERP5Catalog(ERP5TypeTestCase, LogInterceptor):
   """
     Tests for ERP5 Catalog.
   """
@@ -62,10 +63,15 @@
 
   def afterSetUp(self, quiet=1, run=1):
     self.login()
-    portal = self.getPortal()
-    catalog_tool = self.getCatalogTool()
-    # XXX This does not works
-    #catalog_tool.reindexObject(portal)
+
+  def beforeTearDown(self):
+    for module in [ self.getPersonModule(),
+                    self.getOrganisationModule(),
+                    self.getCategoryTool().region,
+                    self.getCategoryTool().group ]:
+      module.manage_delObjects(list(module.objectIds()))
+    self.getPortal().portal_activities.manageClearActivities()
+    get_transaction().commit()
 
   def login(self, quiet=0, run=run_all_test):
     uf = self.getPortal().acl_users
@@ -740,3 +746,70 @@
     self.assertNotEquals([], self.getCatalogTool().searchResults(
                                           portal_type='Person', title=u'A Person'))
 
+  def test_SortOn(self, quiet=quiet, run=run_all_test):
+    if not run: return
+    self.assertEquals('catalog.title',
+            self.getCatalogTool().buildSQLQuery(
+            sort_on=(('catalog.title', 'ascending'),))['order_by_expression'])
+
+  def test_SortOnDescending(self, quiet=quiet, run=run_all_test):
+    if not run: return
+    self.assertEquals('catalog.title DESC',
+            self.getCatalogTool().buildSQLQuery(
+            sort_on=(('catalog.title', 'descending'),))['order_by_expression'])
+    
+  def test_SortOnUnknownKeys(self, quiet=quiet, run=run_all_test):
+    if not run: return
+    self.assertEquals('',
+          self.getCatalogTool().buildSQLQuery(
+          sort_on=(('ignored', 'ascending'),))['order_by_expression'])
+  
+  def test_SortOnAmbigousKeys(self, quiet=quiet, run=run_all_test):
+    if not run: return
+    # if the sort key is found on the catalog table, it will use that catalog
+    # table.
+    self.assertEquals('catalog.title',
+          self.getCatalogTool().buildSQLQuery(
+          sort_on=(('title', 'ascending'),))['order_by_expression'])
+    
+    # if not found on catalog, it won't do any filtering
+    # in the above, start_date exists both in delivery and movement table.
+    self._catch_log_errors(ignored_level = sys.maxint)
+    self.assertEquals('',
+          self.getCatalogTool().buildSQLQuery(
+          sort_on=(('start_date', 'ascending'),))['order_by_expression'])
+    self._ignore_log_errors()
+    # buildSQLQuery will simply put a warning in the error log and ignore
+    # this key
+    logged_errors = [ logrecord for logrecord in self.logged
+                       if logrecord[0] == 'SQLCatalog' ]
+    self.failUnless(
+        'could not build the new sort index' in logged_errors[0][2])
+    
+    # of course, in that case, it's possible to prefix with table name
+    self.assertEquals('delivery.start_date',
+          self.getCatalogTool().buildSQLQuery(
+          sort_on=(('delivery.start_date', 'ascending'),
+                    ))['order_by_expression'])
+    
+  def test_SortOnMultipleKeys(self, quiet=quiet, run=run_all_test):
+    if not run: return
+    self.assertEquals('catalog.title,catalog.id',
+              self.getCatalogTool().buildSQLQuery(
+              sort_on=(('catalog.title', 'ascending'),
+                       ('catalog.id', 'asc')))
+                       ['order_by_expression'].replace(' ', ''))
+
+  def test_SortOnRelatedKey(self, quiet=quiet, run=run_all_test):
+    """Sort-on parameter and related key. (Assumes that region_title is a \
+    valid related key)"""
+    if not run: return
+    self.assertNotEquals('',
+              self.getCatalogTool().buildSQLQuery(region_title='',
+              sort_on=(('region_title', 'ascending'),))['order_by_expression'])
+    self.assertNotEquals('',
+              self.getCatalogTool().buildSQLQuery(
+              sort_on=(('region_title', 'ascending'),))['order_by_expression'],
+              'sort_on parameter must be taken into account even if related key '
+              'is not a parameter of the current query')
+

Modified: erp5/trunk/products/ZSQLCatalog/SQLCatalog.py
URL: http://svn.erp5.org/erp5/trunk/products/ZSQLCatalog/SQLCatalog.py?rev=9225&r1=9224&r2=9225&view=diff
==============================================================================
--- erp5/trunk/products/ZSQLCatalog/SQLCatalog.py (original)
+++ erp5/trunk/products/ZSQLCatalog/SQLCatalog.py Wed Aug 16 13:40:37 2006
@@ -1380,7 +1380,7 @@
     return full_list
 
   def buildSQLQuery(self, query_table='catalog', REQUEST=None,
-                          ignore_empty_string=1,**kw):
+                          ignore_empty_string=1, **kw):
     """ Builds a complex SQL query to simulate ZCalatog behaviour """
     # Get search arguments:
     if REQUEST is None and (kw is None or kw == {}):
@@ -1401,10 +1401,45 @@
     topic_search_keys = self.sql_catalog_topic_search_keys
     multivalue_keys = self.sql_catalog_multivalue_keys
     
+    
+    # Compute "sort_index", which is a sort index, or none:
+    if kw.has_key('sort-on'):
+      sort_index=kw['sort-on']
+    elif hasattr(self, 'sort-on'):
+      sort_index=getattr(self, 'sort-on')
+    elif kw.has_key('sort_on'):
+      sort_index=kw['sort_on']
+    else: sort_index=None
+
+    # Compute the sort order
+    if kw.has_key('sort-order'):
+      so=kw['sort-order']
+    elif hasattr(self, 'sort-order'):
+      so=getattr(self, 'sort-order')
+    elif kw.has_key('sort_order'):
+      so=kw['sort_order']
+    else: so=None
+
+    # We must now turn sort_index into
+    # a dict with keys as sort keys and values as sort order
+    if isinstance(sort_index, basestring):
+      sort_index = [(sort_index, so)]
+    elif not isinstance(sort_index, (list, tuple)):
+      sort_index = None
+    
+    # if we have a sort index, we must take it into account to get related
+    # keys.
+    if sort_index:
+      related_key_kw = dict(kw)
+      for sort_info in sort_index:
+        related_key_kw.setdefault(sort_info[0], '')
+      related_tuples = self.getSqlCatalogRelatedKeyList(**related_key_kw)
+    else:
+      related_tuples = self.getSqlCatalogRelatedKeyList(**kw)
+    
     # Define related maps
-    # each tuple has the form (key, 'table1,table2,table3/column/where_expression')
-    related_tuples = self.getSqlCatalogRelatedKeyList(**kw)
-    #LOG('related_tuples', 0, str(related_tuples))
+    # each tuple from `related_tuples` has the form (key,
+    # 'table1,table2,table3/column/where_expression')
     related_keys = []
     related_method = {}
     related_table_map = {}
@@ -1451,35 +1486,6 @@
       where_expression = []
       from_table_dict = {'catalog' : 'catalog'} # Always include catalog table
 
-
-      # Compute "sort_index", which is a sort index, or none:
-      if kw.has_key('sort-on'):
-        sort_index=kw['sort-on']
-      elif hasattr(self, 'sort-on'):
-        sort_index=getattr(self, 'sort-on')
-      elif kw.has_key('sort_on'):
-        sort_index=kw['sort_on']
-      else: sort_index=None
-
-      # Compute the sort order
-      if kw.has_key('sort-order'):
-        so=kw['sort-order']
-      elif hasattr(self, 'sort-order'):
-        so=getattr(self, 'sort-order')
-      elif kw.has_key('sort_order'):
-        so=kw['sort_order']
-      else: so=None
-
-      # We must now turn sort_index into
-      # a dict with keys as sort keys and values as sort order
-      if isinstance(sort_index, basestring):
-        sort_index = [(sort_index, so)]
-      elif not isinstance(sort_index, (list, tuple)):
-        sort_index = None
-
-
-      # If sort_index is a dictionnary
-      # then parse it and change it
       sort_on = None
       if sort_index is not None:
         new_sort_index = []
@@ -1528,7 +1534,7 @@
           raise
         except:
           LOG('SQLCatalog', WARNING, 'buildSQLQuery could not build the new sort index', error=sys.exc_info())
-          pass
+          sort_on = ''
 
       # Rebuild keywords to behave as new style query (_usage='toto:titi' becomes {'toto':'titi'})
       new_kw = {}
@@ -1698,7 +1704,7 @@
         if k != query_table:
           where_expression.append('%s.uid = %s.uid' % (query_table, tid))
       # Calculate extra where_expressions based on related definition
-      for (table_list,method_id) in related_methods.keys():
+      for (table_list, method_id) in related_methods.keys():
         related_method = getattr(self, method_id, None)
         if related_method is not None:
           table_id = {'src__' : 1} # Return query source, do not evaluate




More information about the Erp5-report mailing list