Module: HasHelpers::Search::ElasticsearchShared

Included in:
Query::Elasticsearch, Elasticsearch
Defined in:
app/lib/has_helpers/search/elasticsearch_shared.rb

Instance Method Summary collapse

Instance Method Details

#class_from_resource(resource) ⇒ Object



65
66
67
# File 'app/lib/has_helpers/search/elasticsearch_shared.rb', line 65

def class_from_resource(resource)
  resource.safe_constantize
end

#owner_relation(class_name) ⇒ Object



59
60
61
62
63
# File 'app/lib/has_helpers/search/elasticsearch_shared.rb', line 59

def owner_relation(class_name)
  klass = class_name.dup.safe_constantize
  base_class_name = klass.base_class.name.demodulize
  "Owner#{base_class_name}".classify.constantize rescue klass # Default to owner view class, fallback to model.
end

#searchkick_results(resource, query, options) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'app/lib/has_helpers/search/elasticsearch_shared.rb', line 6

def searchkick_results(resource, query, options)
  organization_id = options[:with]&.symbolize_keys&.dig(:organization_id)
  klasses = Array(resource).map { |r| class_from_resource(r.to_s) }

  if klasses.size === 1
    klass = klasses.first
    if klass != klass.base_class && klass.search_index.fields.include?(:type)
      options[:with][:type] = klass.name
    end
  end

  show_inactive = options[:with] && options[:with][:show_inactive]
  options[:with].delete(:show_inactive) if show_inactive
  searchkick_results = HasHelpers::Index.search(query,
                                                indexes: klasses.map(&:search_index),
                                                where: options[:with].symbolize_keys, # Searchkick expects keys to be symbols
                                                load: false,
                                                per_page: 15,
                                                page: options[:page],
                                                show_inactive: show_inactive
  )

  results = {}
  # group into classes
  searchkick_results.each do |result|
    key = result["_type"].classify.remove("Index")
    results[key] ||= []
    results[key] << result["_id"]
  end

  # remove hidden options
  results = ::HasHelpers::Index.filter_hidden_constants(results, organization_id) || results if organization_id.present?

  # switch ids to active record, preserving order
  results.each { |key, array| results[key] = owner_relation(key).where(id: array).index_by { |r| r.id.to_s } }

  results = searchkick_results.
    map do |result|
    results[result["_type"].classify.remove("Index")][result["_id"]]
  end.
    compact

  results = { results: results }

  self.class::PAGINATION_ATTRS.each do |attr|
    # set the instance variables for will_paginate
    #   { results: [...], current_page: 1, per_page: 15, total_entries: 42 }
    results[attr] = searchkick_results.send(attr)
  end

  results
end