[Erp5-report] r37338 vincent - in /erp5/trunk/products/ZSQLCatalog: ./ Query/ interfaces/ t...

nobody at svn.erp5.org nobody at svn.erp5.org
Wed Jul 28 14:33:16 CEST 2010


Author: vincent
Date: Wed Jul 28 14:33:15 2010
New Revision: 37338

URL: http://svn.erp5.org?rev=37338&view=rev
Log:
Fix providing a sort direction for a full-text column.

This changes SQLExpression API, but this should not be a problem, since
this API is internal to ZSQLCatalog.

Modified:
    erp5/trunk/products/ZSQLCatalog/Query/EntireQuery.py
    erp5/trunk/products/ZSQLCatalog/SQLExpression.py
    erp5/trunk/products/ZSQLCatalog/interfaces/sql_expression.py
    erp5/trunk/products/ZSQLCatalog/tests/testSQLCatalog.py

Modified: erp5/trunk/products/ZSQLCatalog/Query/EntireQuery.py
URL: http://svn.erp5.org/erp5/trunk/products/ZSQLCatalog/Query/EntireQuery.py?rev=37338&r1=37337&r2=37338&view=diff
==============================================================================
--- erp5/trunk/products/ZSQLCatalog/Query/EntireQuery.py [utf8] (original)
+++ erp5/trunk/products/ZSQLCatalog/Query/EntireQuery.py [utf8] Wed Jul 28 14:33:15 2010
@@ -141,11 +141,8 @@ class EntireQuery(object):
             LOG('SQLCatalog', 100, 'Order by %r ignored: it could not be mapped to a known column.' % (order_by, ))
             rendered = None
         if rendered is not None:
-          if len(order_by) > 1:
-            if len(order_by) > 2 and order_by[2] not in (None, ''):
-              rendered = 'CAST(%s AS %s)' % (rendered, order_by[2])
-            rendered = '%s %s' % (rendered, order_by[1])
-          append(rendered)
+          append((rendered, ) + tuple(order_by[1:]) + (
+            None, ) * (3 - len(order_by)))
       self.order_by_list = new_order_by_list
       # generate SQLExpression from query
       sql_expression_list = [self.query.asSQLExpression(sql_catalog, column_map, only_group_columns)]

Modified: erp5/trunk/products/ZSQLCatalog/SQLExpression.py
URL: http://svn.erp5.org/erp5/trunk/products/ZSQLCatalog/SQLExpression.py?rev=37338&r1=37337&r2=37338&view=diff
==============================================================================
--- erp5/trunk/products/ZSQLCatalog/SQLExpression.py [utf8] (original)
+++ erp5/trunk/products/ZSQLCatalog/SQLExpression.py [utf8] Wed Jul 28 14:33:15 2010
@@ -238,9 +238,17 @@ class SQLExpression(object):
 
       Returns a rendered "order by" expression. See getOrderByList.
     """
+    result = []
+    append = result.append
     order_by_dict = self._getOrderByDict()
-    return SQL_LIST_SEPARATOR.join(conflictSafeGet(order_by_dict, x, str(x)) \
-                                   for x in self.getOrderByList())
+    for (column, direction, cast) in self.getOrderByList():
+      expression = conflictSafeGet(order_by_dict, column, str(column))
+      if cast not in (None, ''):
+        expression = 'CAST(%s AS %s)' % (expression, cast)
+      if direction is not None:
+        expression = '%s %s' % (expression, direction)
+      append(expression)
+    return SQL_LIST_SEPARATOR.join(result)
 
   @profiler_decorator
   def getWhereExpression(self):

Modified: erp5/trunk/products/ZSQLCatalog/interfaces/sql_expression.py
URL: http://svn.erp5.org/erp5/trunk/products/ZSQLCatalog/interfaces/sql_expression.py?rev=37338&r1=37337&r2=37338&view=diff
==============================================================================
--- erp5/trunk/products/ZSQLCatalog/interfaces/sql_expression.py [utf8] (original)
+++ erp5/trunk/products/ZSQLCatalog/interfaces/sql_expression.py [utf8] Wed Jul 28 14:33:15 2010
@@ -76,8 +76,11 @@ class ISQLExpression(Interface):
         The Query instance which called this constructor.
       table_alias_dict (dict, key: string, value: string)
         Table alias dict as returned by ColumnMap.getTableAliasDict() .
-      order_by_list (list of strings)
-        List of result ordering, pre-rendered.
+      order_by_list (list of 3-tuples)
+        Result ordering.
+        - column (rendered)
+        - direction (string or None)
+        - cast (string or None)
       order_by_dict (dict, key: string, value: string)
         Column rendering replacement specific to order_by.
       group_by_list (list of strings)

Modified: erp5/trunk/products/ZSQLCatalog/tests/testSQLCatalog.py
URL: http://svn.erp5.org/erp5/trunk/products/ZSQLCatalog/tests/testSQLCatalog.py?rev=37338&r1=37337&r2=37338&view=diff
==============================================================================
--- erp5/trunk/products/ZSQLCatalog/tests/testSQLCatalog.py [utf8] (original)
+++ erp5/trunk/products/ZSQLCatalog/tests/testSQLCatalog.py [utf8] Wed Jul 28 14:33:15 2010
@@ -583,7 +583,23 @@ class TestSQLCatalog(unittest.TestCase):
     # order_by_list on fulltext column, resulting "ORDER BY" must be non-empty.
     sql_expression = self.asSQLExpression({'fulltext': 'foo',
       'order_by_list': [('fulltext', ), ]})
-    self.assertNotEqual(sql_expression.getOrderByExpression(), '')
+    order_by_expression = sql_expression.getOrderByExpression()
+    self.assertNotEqual(order_by_expression, '')
+    # ... and must sort by relevance
+    self.assertTrue('MATCH' in order_by_expression, order_by_expression)
+    # ordering on fulltext column with sort order specified must preserve
+    # sorting by relevance.
+    for direction in ('ASC', 'DESC'):
+      sql_expression = self.asSQLExpression({'fulltext': 'foo',
+        'order_by_list': [('fulltext', direction), ]})
+      order_by_expression = sql_expression.getOrderByExpression()
+      self.assertTrue('MATCH' in order_by_expression, (order_by_expression, direction))
+    # Providing a None cast should work too
+    for direction in ('ASC', 'DESC'):
+      sql_expression = self.asSQLExpression({'fulltext': 'foo',
+        'order_by_list': [('fulltext', direction, None), ]})
+      order_by_expression = sql_expression.getOrderByExpression()
+      self.assertTrue('MATCH' in order_by_expression, (order_by_expression, direction))
 
 ##return catalog(title=Query(title='a', operator='not'))
 #return catalog(title={'query': 'a', 'operator': 'not'})




More information about the Erp5-report mailing list