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}.
|
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
|
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
|
-
|
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,
|
96
|
-
values.map
|
97
|
-
values.
|
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}.
|
122
|
+
MultiSolr.logger.debug "#{self.class.name}.list_possible_values_with_count(#{fieldname}, #{context.inspect}) => #{values.inspect}"
|
102
123
|
end
|
103
|
-
|
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
|
data/lib/multi_solr/version.rb
CHANGED
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.
|
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-
|
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
|