multi-solr 01.10.00 → 01.11.00

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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