[Erp5-report] r9333 - /erp5/trunk/products/ZSQLCatalog/SQLCatalog.py

nobody at svn.erp5.org nobody at svn.erp5.org
Tue Aug 22 18:43:25 CEST 2006


Author: bartek
Date: Tue Aug 22 18:43:21 2006
New Revision: 9333

URL: http://svn.erp5.org?rev=9333&view=rev
Log:
added support for arbitrary select_expression; fulltext searches return relevance values;

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=9333&r1=9332&r2=9333&view=diff
==============================================================================
--- erp5/trunk/products/ZSQLCatalog/SQLCatalog.py (original)
+++ erp5/trunk/products/ZSQLCatalog/SQLCatalog.py Tue Aug 22 18:43:21 2006
@@ -1486,8 +1486,12 @@
       #    kw[key] = REQUEST[key]
 
     # Let us start building the where_expression
+    # and select_expression
     if kw:
       where_expression = []
+      select_expression = []
+      if kw.has_key('select_expression'):
+        select_expression.append(kw['select_expression'])
       from_table_dict = {'catalog' : 'catalog'} # Always include catalog table
 
       sort_on = None
@@ -1622,12 +1626,17 @@
                   # or we fall back to natural mode
                   search_mode=kw.get('search_mode_%s' % key) \
                       or kw.get('search_mode_%s' % key.replace('.','_')) \
-                      or (key.find('.')>-1 and kw.get('search_mode_%s' % key.split('.')[1])) \
+                      or ('.' in key and kw.get('search_mode_%s' % key.split('.')[1])) \
                       or kw.get('search_mode', 'natural')
                   if search_mode is not None:
                     search_mode=search_mode.lower()
                   mode = full_text_search_modes.get(search_mode,'')
                   where_expression += ["MATCH %s AGAINST ('%s' %s)" % (key, value, mode)]
+                  # we return relevance as Table_Key_relevance
+                  select_expression += ["MATCH %s AGAINST ('%s' %s) AS %s_relevance" % (key, value, mode,key.replace('.','_'))]
+                  # and for simplicity as Key_relevance
+                  if '.' in key:
+                    select_expression += ["MATCH %s AGAINST ('%s' %s) AS %s_relevance" % (key, value, mode,key.split('.')[1])]
                 else:
                   where_expression += ["%s = '%s'" % (key, value)]
             elif isinstance(value, (list, tuple)):
@@ -1656,12 +1665,17 @@
                       # or we fall back to natural mode
                       search_mode=kw.get('search_mode_%s' % key) \
                           or kw.get('search_mode_%s' % key.replace('.','_')) \
-                          or (key.find('.')>-1 and kw.get('search_mode_%' % key.split('.')[1])) \
+                          or ('.' in key and kw.get('search_mode_%' % key.split('.')[1])) \
                           or kw.get('search_mode', 'natural')
                       if search_mode is not None:
                         search_mode=search_mode.lower()
                       mode = full_text_search_modes.get(search_mode, '')
                       query_item +=  ["MATCH %s AGAINST ('%s')" % (key, value, mode)]
+                      # we return relevance as Table_Key_relevance
+                      select_expression += ["MATCH %s AGAINST ('%s' %s) AS %s_relevance" % (key, value, mode,key.replace('.','_'))]
+                      # and for simplicity as Key_relevance
+                      if '.' in key:
+                        select_expression += ["MATCH %s AGAINST ('%s' %s) AS %s_relevance" % (key, value, mode,key.split('.')[1])]
                     else:
                       query_item += ["%s = '%s'" % (key, value_item)]
               if len(query_item) > 0:
@@ -1737,12 +1751,13 @@
             from_table_dict[t_tuple[1]] = t_tuple[0]
             table_index += 1
           where_expression.append(related_method(**table_id))
-      # Concatenate where_expressions
+      # Concatenate expressions
       if kw.get('where_expression'):
         if len(where_expression) > 0:
           where_expression = "(%s) AND (%s)" % (kw['where_expression'], join(where_expression, ' AND ') )
       else:
         where_expression = join(where_expression, ' AND ')
+      select_expression= join(select_expression,',')
 
       limit_expression = kw.get('limit', None)
       if isinstance(limit_expression, (list, tuple)):
@@ -1754,7 +1769,8 @@
     return { 'from_table_list' : from_table_dict.items(),
              'order_by_expression' : sort_on,
              'where_expression' : where_expression,
-             'limit_expression' : limit_expression }
+             'limit_expression' : limit_expression,
+             'select_expression': select_expression}
 
   def queryResults(self, sql_method, REQUEST=None, used=None, src__=0, **kw):
     """ Returns a list of brains from a set of constraints on variables """
@@ -1763,6 +1779,7 @@
     kw['sort_on'] = query['order_by_expression']
     kw['from_table_list'] = query['from_table_list']
     kw['limit_expression'] = query['limit_expression']
+    kw['select_expression'] = query['select_expression']
     # Return the result
 
     #LOG('acceptable_keys',0,'acceptable_keys: %s' % str(acceptable_keys))




More information about the Erp5-report mailing list