[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