Class: MultiSolr::SolrFilterCollection

Inherits:
SolrFilterSimple show all
Defined in:
lib/multi_solr/solr_filter_collection.rb

Overview

Filter für einfachen Wert mit Wertebereich (und ggf. Trefferanzahl) als Collection. Der Wertebereich wird dabei über eine FacetSuche ermittelt (per Methode ‘list_possible_values’ des Searchers)

Instance Attribute Summary

Attributes inherited from SolrFilterSimple

#field_name, #name, #options

Instance Method Summary collapse

Methods inherited from SolrFilterSimple

#label, #render_value, #sanitize_value

Constructor Details

#initialize(filter_name, options = {}) ⇒ SolrFilterCollection

Constructor des Filters Params:

filter_name: Name des Filters als Symbol
options:     optionale Hash mit den folgenden Optionen (sind alle optional):
  :render_value      siehe Optionen bei MultiSolr::SolrFilterSimple.initialize
  :solr_query        siehe Optionen bei MultiSolr::SolrFilterSimple.initialize
  :collection_data:  Proc, welches den Wertebereich(Array) liefert
                     Wenn nicht angegeben, dann wird per 'Searcher.list_possible_values'
                     mit den Name des Filters der Wertebereich ermittelt.
                     Das Proc bekommt den Such-Context(Hash) als Parameter (enthält i.a. Searcher und force-query-params).
                     Beispiel: :collection_data => lambda{|context| (2..10).to_a }
  :after_collect:    optionales Proc, welches den Wertebereich(Array) nachbearbeitet
                     Das Proc bekommt den Wertebereich(Array) als Parameter
                     Beispiel: :after_collect => lambda{|data| MasterData::LockType.cached_find_for_short_names(data).map{|l| [l.full_label, l.short_name] } }


21
22
23
24
25
26
27
28
# File 'lib/multi_solr/solr_filter_collection.rb', line 21

def initialize filter_name, options={}
  @collection_proc = options.delete(:collection_data)
  @after_collect_proc = options.delete(:after_collect)
  if options[:render_value].nil?
    options[:render_value] = Proc.new{|value| compact_values(value).join(', ') }
  end
  super filter_name, options
end

Instance Method Details

#build_solr_query(value) ⇒ Object

overwrite super for array handling



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/multi_solr/solr_filter_collection.rb', line 32

def build_solr_query value
  return super(value) unless value.is_a? Array
  values = compact_values(value)
  return nil if values.empty?
  sani_values = sanitize_values values
  if @solr_query_proc
    q = @solr_query_proc.call(sani_values)
  else
    q = sani_values.map{|val| "#{@field_name}:#{val}"}.join(' OR ')
    if sani_values.size > 1
      q = "(#{q})"
    end
  end
  q
end

#collection_data(core_handler, context, search_request = nil) ⇒ Object

Ermittelt den Wertebereich entweder über die bei den Options angegebene Proc oder über list_possible_values des Searchers (mit den Namen des Filters als Parameter) Params:

core_handler:   Instanz des konkreten Solr-CoreHandler (MultiSolr::SingleCoreHandler)
context:        Hash mit dem Such-Context.
search_request: optional bestehendes SearchRequest (für DrillDown-Funktionalität)

returns: Array mit dem Wertebereich



58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/multi_solr/solr_filter_collection.rb', line 58

def collection_data core_handler, context, search_request=nil
  if @collection_proc
    data = @collection_proc.call(context)
  else
    data = core_handler.cached_list_possible_values(@field_name, context, search_request)
  end
  if @after_collect_proc
    data = @after_collect_proc.call(data)
    data.compact!
  end
  data
end

#collection_data_with_count(core_handler, context, search_request = nil) ⇒ Object

Ermittelt den Wertebereich und die jeweilige Anzahl entweder über die bei den Options angegebene Proc oder über list_possible_values_with_count des Searchers (mit den Namen des Filters als Parameter) Beispiel: Array mit Etagen: [[Etagennummer, Trefferanzahl],[Etagennummer, Trefferanzahl],…] in der Form: [[0, 3455, 0],[1, 163913],…] Params:

core_handler:   Instanz des konkreten Solr-CoreHandler (MultiSolr::SingleCoreHandler)
context:        Hash mit dem Such-Context.
search_request: optional bestehendes SearchRequest (für DrillDown-Funktionalität)

returns: Array mit dem Wertebereich



80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/multi_solr/solr_filter_collection.rb', line 80

def collection_data_with_count core_handler, context, search_request=nil
  if @collection_proc
    data = @collection_proc.call(context)
  else
    data = core_handler.cached_list_possible_values_with_count(@field_name, context, search_request)
  end
  if @after_collect_proc
    data = @after_collect_proc.call(data)
    data.compact!
  end
  data
end

#compact_values(value) ⇒ Object

Wandelt angegebenen value in ein Array (wenn es noch keins ist) Bereinigt das Array von leeren Elementen



96
97
98
99
100
# File 'lib/multi_solr/solr_filter_collection.rb', line 96

def compact_values value
  value = [value] unless value.is_a?(Array)
  value.delete_if(&:blank?)
  value
end

#sanitize_values(values) ⇒ Object

Sanitize solr query value in a array of values



103
104
105
# File 'lib/multi_solr/solr_filter_collection.rb', line 103

def sanitize_values values
  values.map{|val| sanitize_value(val) }
end