Class: MultiSolr::SearchRequest
- Inherits:
-
Object
- Object
- MultiSolr::SearchRequest
- Defined in:
- lib/multi_solr/search_request.rb
Overview
Solr-Suchanfrage Diese enthält einmal die möglichen Suchfilter und die konkreten Such-Werte sowie andere Suchparameter (Paginierung etc.)
Constant Summary collapse
- BASE_FILTER_MAP =
{ :simple => MultiSolr::SolrFilterSimple, :collection => MultiSolr::SolrFilterCollection, :range => MultiSolr::SolrFilterRange, :date_range => MultiSolr::SolrFilterDateRange, :date => MultiSolr::SolrFilterDate, :free_query => MultiSolr::SolrFilterFreeQuery }
Instance Attribute Summary collapse
-
#active_filters ⇒ Object
Array mit den Namen der aktiven Filter (als Symbole).
-
#facet_params ⇒ Object
Hash mit optionalen Parametern zur Facet-Bildung z.B.
-
#facet_prefix ⇒ Object
optinaler Facet-Prefix bei Facetsuche.
-
#facets ⇒ Object
Array(String) mit den Feldnamen zu denen eine Facet gebildet werden soll.
-
#filter_values ⇒ Object
readonly
Hash(Symbol => String,Hash) mit den konkreten Filter-Werten.
-
#group_field ⇒ Object
Name des Feldes nach dem gruppiert werden soll.
-
#group_size ⇒ Object
Anzahl der Ergebnisse je Gruppe, wenn nil so ist laut SOLR default=1.
-
#group_truncate ⇒ Object
wenn true, dann werden Facets auf Basis der Gruppierung gebildet.
- #page_size ⇒ Object
-
#sorts ⇒ Object
Array(String) mit den Feldnamen für die Sortierung (optional mit Sortierrichtung).
-
#stats_fields ⇒ Object
Array(String) mit den Feldnamen für die Gesamt-Statistiken berechnet werden sollen (Summe, min, max,…).
Class Method Summary collapse
- .default_page_size ⇒ Object
-
.define_filter(filter_name, options = {}) ⇒ Object
Definieren eines Filters Erzeugt für den Filter entsprechende Attribut-Methoden Dies vereinfacht die Nutzung in Formularen Z.B.
-
.possible_filters ⇒ Object
mögliche Filter (Hash Filtername(Smybol) => Filter(SolrFilterSimple-Instance)).
- .set_default_page_size(size) ⇒ Object
Instance Method Summary collapse
-
#build_filter_value_composite(filter_name, value = nil) ⇒ Object
Erzeugen ein FilterValue-Composite-Object welches aus dem Filter und den in @filter_values hinterlegten Wert erzeugt wird params: filter_name: Name des Filters als Symbol returns: MultiSolr::FilterValueComposite-Instance mit dem Filter und den zugehörigen Wert.
-
#build_query(config = nil) ⇒ Object
Erzeugt aus den filter_values die Solr-Query liefert die Query als String.
-
#inactive_filters ⇒ Object
Liefert die Liste der inactiven Filter (possible-filters - active-filters) returns Array of Symbols.
-
#initialize(attributes = nil) ⇒ SearchRequest
constructor
Create new SolrSearch-Instance.
- #page ⇒ Object
- #page=(page_nr) ⇒ Object
- #possible_filter_keys ⇒ Object
-
#possible_filter_keys_sorted_with_labels ⇒ Object
liefert Liste der möglichen Filternamen incl.
- #remove_facet(facet_name) ⇒ Object
- #render_filter_description(config = nil) ⇒ Object
-
#set_filter(filter_name, value) ⇒ Object
Filter mit konkreten Wert belegen.
Constructor Details
#initialize(attributes = nil) ⇒ SearchRequest
Create new SolrSearch-Instance
100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/multi_solr/search_request.rb', line 100 def initialize attributes=nil @filter_values = {} @active_filters = [] @sorts = [] @facets = [] if attributes.is_a? Hash attributes.each do |aname, value| m_name = "#{aname}=" send(m_name, value) if self.respond_to?(m_name) end end end |
Instance Attribute Details
#active_filters ⇒ Object
Array mit den Namen der aktiven Filter (als Symbole)
24 25 26 |
# File 'lib/multi_solr/search_request.rb', line 24 def active_filters @active_filters end |
#facet_params ⇒ Object
Hash mit optionalen Parametern zur Facet-Bildung z.B. => {:limit => 1000, :sort => :index,
:mdate => {:range => true, :start => 'NOW/DAY-5Day', :end => 'NOW/DAY', :gap => '+1DAY'},
:saison => {:stats_field => 'volumen'}}
14 15 16 |
# File 'lib/multi_solr/search_request.rb', line 14 def facet_params @facet_params end |
#facet_prefix ⇒ Object
optinaler Facet-Prefix bei Facetsuche. Wird als facet.prefix an Solr weitergegeben
15 16 17 |
# File 'lib/multi_solr/search_request.rb', line 15 def facet_prefix @facet_prefix end |
#facets ⇒ Object
Array(String) mit den Feldnamen zu denen eine Facet gebildet werden soll
8 9 10 |
# File 'lib/multi_solr/search_request.rb', line 8 def facets @facets end |
#filter_values ⇒ Object (readonly)
Hash(Symbol => String,Hash) mit den konkreten Filter-Werten
22 23 24 |
# File 'lib/multi_solr/search_request.rb', line 22 def filter_values @filter_values end |
#group_field ⇒ Object
Name des Feldes nach dem gruppiert werden soll. Wenn nil, dann erfolgt keine Gruppierung(default)
19 20 21 |
# File 'lib/multi_solr/search_request.rb', line 19 def group_field @group_field end |
#group_size ⇒ Object
Anzahl der Ergebnisse je Gruppe, wenn nil so ist laut SOLR default=1
20 21 22 |
# File 'lib/multi_solr/search_request.rb', line 20 def group_size @group_size end |
#group_truncate ⇒ Object
wenn true, dann werden Facets auf Basis der Gruppierung gebildet
21 22 23 |
# File 'lib/multi_solr/search_request.rb', line 21 def group_truncate @group_truncate end |
#page_size ⇒ Object
174 175 176 |
# File 'lib/multi_solr/search_request.rb', line 174 def page_size @page_size || self.class.default_page_size end |
#sorts ⇒ Object
Array(String) mit den Feldnamen für die Sortierung (optional mit Sortierrichtung)
17 18 19 |
# File 'lib/multi_solr/search_request.rb', line 17 def sorts @sorts end |
#stats_fields ⇒ Object
Array(String) mit den Feldnamen für die Gesamt-Statistiken berechnet werden sollen (Summe, min, max,…)
18 19 20 |
# File 'lib/multi_solr/search_request.rb', line 18 def stats_fields @stats_fields end |
Class Method Details
.default_page_size ⇒ Object
90 91 92 |
# File 'lib/multi_solr/search_request.rb', line 90 def default_page_size @default_page_size end |
.define_filter(filter_name, options = {}) ⇒ Object
Definieren eines Filters Erzeugt für den Filter entsprechende Attribut-Methoden Dies vereinfacht die Nutzung in Formularen Z.B. für einen Filter mit den Namen :firma_nr werden die Methoden filter_firma_nr und filter_firma_nr=(value) generiert
Params:
filter_name: Name des Filters als Symbol
options: optionale Hash mit:
:type Typ des Filters, entweder Typ-Bezeichner ein Symbol oder die Klasse des Filters
Der Typ-Bezeichner muss in MultiSolr::SearchRequest::BASE_FILTER_MAP definiert sein.
Ist kein Type angegeben so wird
andere: Alle anderen Angaben in den Options werden an den Filter weitergereicht.
Siehe also dazu die Beschreibungen am Constructor der einzelnen Filtertypen
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/multi_solr/search_request.rb', line 53 def define_filter filter_name, ={} @possible_filters ||= {} filter_type = .delete(:type) || :simple if filter_type.is_a?(Symbol) # Zum Symbol die konkrete Filterklasse holen filter_type = BASE_FILTER_MAP[filter_type] raise "Unknown type: #{filter_type}" if filter_type.nil? end filter = filter_type.new filter_name, @possible_filters[filter_name] = filter # Definieren der Methode zum Lesen des Values dieses Filters define_method "filter_#{filter_name}" do @filter_values[filter_name] end # # Definieren der Methode zum zuweisen des Wertes dieses Filters define_method "filter_#{filter_name}=" do |value| if value.blank? || (value.is_a?(Array) && (value.empty? || value.all?(&:blank?)) ) || (value.is_a?(Hash) && value.values.all?(&:blank?)) @active_filters.delete(filter_name) return end @filter_values[filter_name] = value @active_filters << filter_name unless @active_filters.include?(filter_name) end end |
.possible_filters ⇒ Object
mögliche Filter (Hash Filtername(Smybol) => Filter(SolrFilterSimple-Instance))
81 82 83 |
# File 'lib/multi_solr/search_request.rb', line 81 def possible_filters @possible_filters || {} end |
.set_default_page_size(size) ⇒ Object
86 87 88 |
# File 'lib/multi_solr/search_request.rb', line 86 def set_default_page_size size @default_page_size = size end |
Instance Method Details
#build_filter_value_composite(filter_name, value = nil) ⇒ Object
Erzeugen ein FilterValue-Composite-Object welches aus dem Filter und den in @filter_values hinterlegten Wert erzeugt wird params:
filter_name: Name des Filters als Symbol
returns: MultiSolr::FilterValueComposite-Instance mit dem Filter und den zugehörigen Wert
119 120 121 122 123 124 |
# File 'lib/multi_solr/search_request.rb', line 119 def build_filter_value_composite filter_name, value=nil filter = self.class.possible_filters[filter_name] raise "Unknown filter: #{filter_name}" if filter.nil? value ||= @filter_values[filter_name] MultiSolr::FilterValueComposite.new filter, value end |
#build_query(config = nil) ⇒ Object
Erzeugt aus den filter_values die Solr-Query liefert die Query als String
129 130 131 132 133 134 135 136 137 |
# File 'lib/multi_solr/search_request.rb', line 129 def build_query config=nil solr_queries = [] @filter_values.each do |fname, value| fa_composite = build_filter_value_composite fname, value solr_query = fa_composite.build_solr_query solr_queries << solr_query unless solr_query.blank? end solr_queries.join(' ') end |
#inactive_filters ⇒ Object
Liefert die Liste der inactiven Filter (possible-filters - active-filters) returns Array of Symbols
197 198 199 |
# File 'lib/multi_solr/search_request.rb', line 197 def inactive_filters self.class.possible_filters.keys - @active_filters end |
#page ⇒ Object
170 171 172 |
# File 'lib/multi_solr/search_request.rb', line 170 def page @page || 1 end |
#page=(page_nr) ⇒ Object
166 167 168 |
# File 'lib/multi_solr/search_request.rb', line 166 def page= page_nr @page = [1, page_nr.to_i].max end |
#possible_filter_keys ⇒ Object
179 180 181 |
# File 'lib/multi_solr/search_request.rb', line 179 def possible_filter_keys self.class.possible_filters.keys end |
#possible_filter_keys_sorted_with_labels ⇒ Object
liefert Liste der möglichen Filternamen incl. der Labels sortiert nach Labels als Array aus Tuples z.B. [ [:firma_nr, ‘Bestandsfirma’], [:lkz, ‘LKZ’] ]
187 188 189 190 191 192 |
# File 'lib/multi_solr/search_request.rb', line 187 def possible_filter_keys_sorted_with_labels keys = self.class.possible_filters.keys result = keys.map{|k| [k, I18n.t("solr_search.#{k}")]} result.sort!{|e1,e2| e1.last <=> e2.last} result end |
#remove_facet(facet_name) ⇒ Object
161 162 163 |
# File 'lib/multi_solr/search_request.rb', line 161 def remove_facet facet_name @facets.delete(facet_name.to_s) if @facets end |
#render_filter_description(config = nil) ⇒ Object
140 141 142 143 144 145 146 147 148 149 |
# File 'lib/multi_solr/search_request.rb', line 140 def render_filter_description config=nil descriptions = [] @filter_values.each do |fname, value| filter = self.class.possible_filters[fname] raise "Unknown filter: #{fname}" if filter.nil? value = filter.render_value value descriptions << "#{filter.label} = #{value}" end descriptions end |
#set_filter(filter_name, value) ⇒ Object
Filter mit konkreten Wert belegen
153 154 155 156 157 158 |
# File 'lib/multi_solr/search_request.rb', line 153 def set_filter filter_name, value filter_name = filter_name.to_sym raise "Unbekannter Filter'#{filter_name}'" unless self.class.possible_filters.has_key?(filter_name) @filter_values[filter_name] = value @active_filters << filter_name unless @active_filters.include?(filter_name) end |