Class: MultiSolr::SearchRequest

Inherits:
Object
  • Object
show all
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

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(attributes = nil) ⇒ SearchRequest

Create new SolrSearch-Instance

Parameters:

  • attributes (defaults to: nil)

    mit den Attributewerten als Hash (optional)



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_filtersObject

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_paramsObject

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_prefixObject

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

#facetsObject

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_valuesObject (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_fieldObject

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_sizeObject

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_truncateObject

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_sizeObject



174
175
176
# File 'lib/multi_solr/search_request.rb', line 174

def page_size
  @page_size || self.class.default_page_size
end

#sortsObject

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_fieldsObject

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_sizeObject



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, options={}
  @possible_filters ||= {}
  filter_type = options.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, options
  @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_filtersObject

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_filtersObject

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

#pageObject



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_keysObject



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_labelsObject

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