diff --git a/app/controllers/avo/search_controller.rb b/app/controllers/avo/search_controller.rb index 9e1174d3bb..8fbf5ca824 100644 --- a/app/controllers/avo/search_controller.rb +++ b/app/controllers/avo/search_controller.rb @@ -47,15 +47,7 @@ def search_resource(resource) query: resource.query_scope ).handle - query = apply_scope(query) if should_apply_any_scope? - - # Get the count - results_count = query.reselect(resource.model_class.primary_key).count - - # Get the results - query = query.limit(search_results_count(resource)) - - results = apply_search_metadata(query, resource) + results_count, results = parse_results(query) header = resource.plural_name @@ -212,5 +204,33 @@ def search_results_count(resource) Avo.configuration.search_results_count end end + + def parse_results(query) + # When using custom search services query should return an array of hashes + if query.is_a?(Array) + # Apply highlight + query.map do |result| + result[:_label] = highlight(result[:_label].to_s, CGI.escapeHTML(params[:q] || "")) + end + + # Force count to 0 until implement an API to pass the count + results_count = 0 + + # Apply the limit + results = query.first(search_results_count(resource)) + else + query = apply_scope(query) if should_apply_any_scope? + + # Get the count + results_count = query.reselect(resource.model_class.primary_key).count + + # Get the results + query = query.limit(search_results_count(resource)) + + results = apply_search_metadata(query, resource) + end + + [results_count, results] + end end end diff --git a/spec/features/avo/search_custom_results_spec.rb b/spec/features/avo/search_custom_results_spec.rb new file mode 100644 index 0000000000..7a31bdc8b8 --- /dev/null +++ b/spec/features/avo/search_custom_results_spec.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +require "rails_helper" + +RSpec.feature Avo::SearchController, type: :controller do + let!(:project) { create :project } + + it "active record search" do + get :show, params: { + resource_name: "projects" + } + + expect(json["projects"]["results"].count).to eq 1 + end + + it "custom search" do + old_query = Avo::Resources::Project.search[:query] + + limit = 8 # default + total_results = 9 + + Avo::Resources::Project.search[:query] = -> do + array = [] + + total_results.times do |iteration| + array << { + _id: iteration, + _label: "Label nr #{iteration}", + _url: "www.#{iteration}.ro" + } + end + + array + end + + get :show, params: { + resource_name: "projects" + } + + expect(json["projects"]["results"].count).to eq limit + + limit.times do |index| + expect(json["projects"]["results"][index]).to eq({ + "_id" => index, + "_label" => "Label nr #{index}", + "_url" => "www.#{index}.ro" + }) + end + + Avo::Resources::Project.search[:query] = old_query + end +end