diff --git a/product/ZSQLCatalog/SQLCatalog.py b/product/ZSQLCatalog/SQLCatalog.py index b906adfac86d680180cefaebe64c2450a8004bc0..d51aa9b2769672ed4b22b017ef1059c5b16e2f7a 100644 --- a/product/ZSQLCatalog/SQLCatalog.py +++ b/product/ZSQLCatalog/SQLCatalog.py @@ -1486,8 +1486,12 @@ class Catalog(Folder, Persistent, Acquisition.Implicit, ExtensionClass.Base): # 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 @@ class Catalog(Folder, Persistent, Acquisition.Implicit, ExtensionClass.Base): # 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 @@ class Catalog(Folder, Persistent, Acquisition.Implicit, ExtensionClass.Base): # 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 @@ class Catalog(Folder, Persistent, Acquisition.Implicit, ExtensionClass.Base): 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 @@ class Catalog(Folder, Persistent, Acquisition.Implicit, ExtensionClass.Base): 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 @@ class Catalog(Folder, Persistent, Acquisition.Implicit, ExtensionClass.Base): 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))