multi-solr 01.10.00 → 01.11.00

Sign up to get free protection for your applications and to get access to all the features.
@@ -71,39 +71,60 @@ class MultiSolr::SingleCoreHandler
71
71
  # searcher.list_possible_values :lkz, :whs_id => 5
72
72
  #
73
73
  def list_possible_values fieldname, context=nil, search_request=nil, config=nil
74
+ value_pair_data = list_possible_values_with_count fieldname, context, search_request, config
75
+ values = []
76
+ # es werden nur die Werte benötigt und deshalb aus den [value,count]-Paaren entnommen
77
+ value_pair_data.each do |value_count_pair|
78
+ values << value_count_pair[0]
79
+ end
80
+ # Ergebnis ist ein Array mit Werten
81
+ values
82
+ end
83
+
84
+ # Liefert zu dem spezifizierten Kontext und Feld die möglichen Werte und die dazugehörige Anzahl an Treffern.
85
+ # Parameter:
86
+ # fieldname: Name des Feldes (als Symbol)
87
+ # context: optionales Object mit weiteren Context-Informationen, dieser wird an den Force-Query-Builder übergeben
88
+ # search_request: optional bestehendes SearchRequest (für DrillDown-Funktionalität)
89
+ # config: Config-Data, used as optional parameter for query-build
90
+ # Beispiel:
91
+ # searcher.list_possible_values :lkz, :whs_id => 5
92
+ #
93
+ def list_possible_values_with_count fieldname, context=nil, search_request=nil, config=nil
74
94
  search_request ||= MultiSolr::SearchRequest.new
75
95
  search_request.facets = [fieldname]
76
96
  result = search(search_request, :context => context, :facets_only => true, :config => config)
77
97
  facet_counts = result.facet_counts
78
- values = []
98
+ values = {}
79
99
  if MultiSolr.logger.debug?
80
- MultiSolr.logger.debug "#{self.class.name}.list_possible_values(#{fieldname}, #{context.inspect}, #{search_request.inspect}): facet_counts=#{facet_counts.inspect}"
100
+ MultiSolr.logger.debug "#{self.class.name}.list_possible_values_with_count(#{fieldname}, #{context.inspect}, #{search_request.inspect}): facet_counts=#{facet_counts.inspect}"
81
101
  end
82
102
  if facet_counts
83
103
  value_pairs = facet_counts[fieldname.to_s]
84
104
  if value_pairs && !value_pairs.empty?
85
105
  # das value_pairs besteht Paar-weise aus Value und Anzahl
86
- # Es werden hier nur die Values gebraucht, wo die Anzahl >0 ist
106
+ # Es werden hier nur die Paare gebraucht, wo die Anzahl >0 ist
87
107
  only_int = true
88
108
  value_pairs.each do |value_count_pair|
89
109
  val, count = value_count_pair
90
110
  if val && count > 0
91
111
  only_int = false if only_int && !val.match(/^[0-9]+$/)
92
- values << val
112
+ # Value und Anzahl in die Ergebnis-Hash schreiben
113
+ values[val] = count
93
114
  end
94
115
  end
95
- # wenn val nur aus Zahlen besteht, dann nach Integer konvertieren (wegen der Sortierung)
96
- values.map!(&:to_i) if only_int
97
- values.sort!
116
+ # wenn val nur aus Zahlen besteht, werden die keys nach Integer konvertiert (wegen der Sortierung)
117
+ values = Hash[values.map {|k, v| [k.to_i, v] }] if only_int
118
+ value_pair_data = values.sort_by { |value, count| value }
98
119
  end
99
120
  end
100
121
  if MultiSolr.logger.debug?
101
- MultiSolr.logger.debug "#{self.class.name}.list_possible_values(#{fieldname}, #{context.inspect}) => #{values.inspect}"
122
+ MultiSolr.logger.debug "#{self.class.name}.list_possible_values_with_count(#{fieldname}, #{context.inspect}) => #{values.inspect}"
102
123
  end
103
- values
124
+ # Ergebnis ist ein Array mit Arrays bestehend aus [value,count]-Paaren: [[value, count], [value,count],..]
125
+ value_pair_data
104
126
  end
105
127
 
106
-
107
128
  # Ermittelt und cached die möglichen Werte der als pre_cache_value_fields definierten Felder
108
129
  # Diese werden im Rails-Cache zwischengespeichert
109
130
  # Parameter:
@@ -125,7 +146,26 @@ class MultiSolr::SingleCoreHandler
125
146
  values
126
147
  end
127
148
 
128
-
149
+ # Ermittelt und cached die möglichen Werte mit Anzahl der als pre_cache_value_fields definierten Felder
150
+ # Diese werden im Rails-Cache zwischengespeichert
151
+ # Parameter:
152
+ # fieldname: Name des Feldes (als Symbol)
153
+ # context: optionales Object mit weiteren Context-Informationen, dieser wird an den Force-Query-Builder übergeben
154
+ # config: Config-Data, used as optional parameter for query-build
155
+ # expires_in: optional, Gültigkeit des Cache-Wertes in Sekunden, default ist 3 Stunden
156
+ #
157
+ def cached_list_possible_values_with_count fieldname, context=nil, config=nil, expires_in=3.hours
158
+ cache_key = "solr-#{self.core_name}-#{context}-#{fieldname}-values-with-count"
159
+ values = MultiSolr.cache.read(cache_key)
160
+ if values.nil?
161
+ # dann sind noch gar keine Werte gecached => diese holen
162
+ values = list_possible_values_with_count fieldname, context, nil, config
163
+ # und nun im Cache ablegen
164
+ MultiSolr.logger.debug "#{self.class.name}.cached_list_possible_values_with_count: write in cache '#{cache_key}' => #{values.inspect}" if MultiSolr.logger.debug?
165
+ MultiSolr.cache.write(cache_key, values, :expires_in => expires_in)
166
+ end
167
+ values
168
+ end
129
169
 
130
170
 
131
171
  # ermitteln Zeitstempel des letzten Datenimports
@@ -1,5 +1,4 @@
1
- # Filter für einfachen Wert mit Wertebereich als Collection
2
- # und Darstellung als Select-Box.
1
+ # Filter für einfachen Wert mit Wertebereich (und ggf. Trefferanzahl) als Collection.
3
2
  # Der Wertebereich wird dabei über eine FacetSuche ermittelt (per Methode 'list_possible_values' des Searchers)
4
3
  #
5
4
  class MultiSolr::SolrFilterCollection < MultiSolr::SolrFilterSimple
@@ -69,6 +68,28 @@ class MultiSolr::SolrFilterCollection < MultiSolr::SolrFilterSimple
69
68
  data
70
69
  end
71
70
 
71
+ # Ermittelt den Wertebereich und die jeweilige Anzahl entweder über die bei den Options angegebene Proc
72
+ # oder über list_possible_values_with_count des Searchers (mit den Namen des Filters als Parameter)
73
+ # Beispiel: Array mit Etagen: [[Etagennummer, Trefferanzahl],[Etagennummer, Trefferanzahl],...]
74
+ # in der Form: [[0, 3455, 0],[1, 163913],...]
75
+ # Params:
76
+ # core_handler: Instanz des konkreten Solr-CoreHandler (MultiSolr::SingleCoreHandler)
77
+ # context: Hash mit dem Such-Context.
78
+ # search_request: optional bestehendes SearchRequest (für DrillDown-Funktionalität)
79
+ # returns: Array mit dem Wertebereich
80
+ def collection_data_with_count core_handler, context, search_request=nil
81
+ if @collection_proc
82
+ data = @collection_proc.call(context)
83
+ else
84
+ data = core_handler.cached_list_possible_values_with_count(@field_name, context, search_request)
85
+ end
86
+ if @after_collect_proc
87
+ data = @after_collect_proc.call(data)
88
+ data.compact!
89
+ end
90
+ data
91
+ end
92
+
72
93
 
73
94
  # Wandelt angegebenen value in ein Array (wenn es noch keins ist)
74
95
  # Bereinigt das Array von leeren Elementen
@@ -1,3 +1,3 @@
1
1
  module MultiSolr
2
- VERSION = "01.10.00"
2
+ VERSION = "01.11.00"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: multi-solr
3
3
  version: !ruby/object:Gem::Version
4
- version: 01.10.00
4
+ version: 01.11.00
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-04-28 00:00:00.000000000 Z
12
+ date: 2014-09-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rsolr
@@ -188,18 +188,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
188
188
  - - ! '>='
189
189
  - !ruby/object:Gem::Version
190
190
  version: '0'
191
- segments:
192
- - 0
193
- hash: 727765555297971495
194
191
  required_rubygems_version: !ruby/object:Gem::Requirement
195
192
  none: false
196
193
  requirements:
197
194
  - - ! '>='
198
195
  - !ruby/object:Gem::Version
199
196
  version: '0'
200
- segments:
201
- - 0
202
- hash: 727765555297971495
203
197
  requirements: []
204
198
  rubyforge_project: multi-solr
205
199
  rubygems_version: 1.8.24