From a2902450c93b48ef54ad104845b09f1a560e60a3 Mon Sep 17 00:00:00 2001 From: Pat Allan Date: Wed, 18 Aug 2010 00:39:22 +1000 Subject: [PATCH] Bulk querying Sphinx for all the facet calls. Not sure how much this speeds up facets yet though. Specs need to be updated as well, but features are all green. --- lib/thinking_sphinx/facet_search.rb | 19 +++++++++++++++---- lib/thinking_sphinx/search.rb | 27 +++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/lib/thinking_sphinx/facet_search.rb b/lib/thinking_sphinx/facet_search.rb index 33d36835c..9fe723220 100644 --- a/lib/thinking_sphinx/facet_search.rb +++ b/lib/thinking_sphinx/facet_search.rb @@ -44,13 +44,24 @@ def set_default_options end def populate - facet_names.each do |name| - add_from_results name, ThinkingSphinx.search( - *(args + [facet_search_options(name)]) - ) + client = config.client + + searches.each do |search| + search.append_to client + end + + client.run.each_with_index do |results, index| + searches[index].populate_from_queue results + add_from_results facet_names[index], searches[index] end end + def searches + @searches ||= facet_names.collect { |name| + ThinkingSphinx.search *(args + [facet_search_options(name)]) + } + end + def facet_search_options(facet_name) options.merge( :group_function => :attr, diff --git a/lib/thinking_sphinx/search.rb b/lib/thinking_sphinx/search.rb index 8bcb5f58b..d74258f1d 100644 --- a/lib/thinking_sphinx/search.rb +++ b/lib/thinking_sphinx/search.rb @@ -269,6 +269,29 @@ def search(*args) self end + def append_to(client) + prepare client + client.append_query query, indexes, comment + client.reset + end + + def populate_from_queue(results) + return if @populated + @populated = true + @results = results + + if options[:ids_only] + replace @results[:matches].collect { |match| + match[:attributes]["sphinx_internal_id"] + } + else + replace instances_from_matches + add_excerpter + add_sphinx_attributes + add_matching_fields if client.rank_mode == :fieldmask + end + end + private def config @@ -370,6 +393,10 @@ def log(*args) def client client = config.client + prepare client + end + + def prepare(client) index_options = one_class ? one_class.sphinx_indexes.first.local_options : {}