solr_collection 0.1.2 → 0.1.3
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.
- data/Gemfile +6 -0
- data/Gemfile.lock +34 -0
- data/Rakefile +6 -5
- data/Readme.md +27 -0
- data/VERSION +1 -1
- data/lib/solr_collection.rb +16 -13
- data/solr_collection.gemspec +8 -9
- data/spec/solr_collection_spec.rb +65 -29
- metadata +25 -14
- data/README.markdown +0 -29
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
diff-lcs (1.1.2)
|
5
|
+
gemcutter (0.6.1)
|
6
|
+
git (1.2.5)
|
7
|
+
jeweler (1.4.0)
|
8
|
+
gemcutter (>= 0.1.0)
|
9
|
+
git (>= 1.2.5)
|
10
|
+
rubyforge (>= 2.0.0)
|
11
|
+
json_pure (1.4.6)
|
12
|
+
rake (0.8.7)
|
13
|
+
rspec (2.0.1)
|
14
|
+
rspec-core (~> 2.0.1)
|
15
|
+
rspec-expectations (~> 2.0.1)
|
16
|
+
rspec-mocks (~> 2.0.1)
|
17
|
+
rspec-core (2.0.1)
|
18
|
+
rspec-expectations (2.0.1)
|
19
|
+
diff-lcs (>= 1.1.2)
|
20
|
+
rspec-mocks (2.0.1)
|
21
|
+
rspec-core (~> 2.0.1)
|
22
|
+
rspec-expectations (~> 2.0.1)
|
23
|
+
rubyforge (2.0.4)
|
24
|
+
json_pure (>= 1.1.7)
|
25
|
+
will_paginate (2.3.14)
|
26
|
+
|
27
|
+
PLATFORMS
|
28
|
+
ruby
|
29
|
+
|
30
|
+
DEPENDENCIES
|
31
|
+
jeweler
|
32
|
+
rake
|
33
|
+
rspec (~> 2)
|
34
|
+
will_paginate
|
data/Rakefile
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
task :default => :spec
|
2
|
-
require
|
3
|
-
|
2
|
+
require "rspec/core/rake_task"
|
3
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
4
|
+
t.rspec_opts = '--backtrace --color'
|
5
|
+
end
|
4
6
|
|
5
7
|
begin
|
6
|
-
project_name = 'solr_collection'
|
7
8
|
require 'jeweler'
|
8
9
|
Jeweler::Tasks.new do |gem|
|
9
|
-
gem.name =
|
10
|
+
gem.name = 'solr_collection'
|
10
11
|
gem.summary = "Wrapper for solr results sets then behaves/feels like will_paginate collection"
|
11
12
|
gem.email = "grosser.michael@gmail.com"
|
12
|
-
gem.homepage = "http://github.com/grosser/#{
|
13
|
+
gem.homepage = "http://github.com/grosser/#{gem.name}"
|
13
14
|
gem.authors = ["Michael Grosser"]
|
14
15
|
gem.add_dependency "will_paginate"
|
15
16
|
end
|
data/Readme.md
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
- Wrap acts_as_solr results to behave like WillPaginate (use same helpers!)
|
2
|
+
- Make arrays behave like solr results (e.g. mock an empty result when solr is down or throws errors)
|
3
|
+
|
4
|
+
Usage
|
5
|
+
=====
|
6
|
+
- As Rails plugin ` rails plugin install git://github.com/grosser/solr_collection.git `
|
7
|
+
- As gem ` sudo gem install solr_collection `
|
8
|
+
|
9
|
+
Example:
|
10
|
+
options = {:limit=>10, :offset=>100, :facets=>{....}, .... }
|
11
|
+
results = MyModel.find_by_solr("abc", options) rescue []
|
12
|
+
results = SolrCollection.new(results, options.slice(:limit, :offset))
|
13
|
+
|
14
|
+
do_something if results.facets
|
15
|
+
do_something if results.total_entries > results.size # more pages ?
|
16
|
+
will_paginate(results)
|
17
|
+
|
18
|
+
Other features:
|
19
|
+
#facet fields can be nil or [] or {} -> use has_facet_fields? to check
|
20
|
+
puts results.facets['facet_fields']['category_id_facet'] if results.has_facet_fields?
|
21
|
+
puts results.facet_field('category_id_facet')
|
22
|
+
|
23
|
+
Author
|
24
|
+
======
|
25
|
+
[Michael Grosser](http://grosser.it)
|
26
|
+
grosser.michael@gmail.com
|
27
|
+
Hereby placed under public domain, do what you want, just do not hold me accountable...
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.3
|
data/lib/solr_collection.rb
CHANGED
@@ -3,7 +3,7 @@ require 'will_paginate/collection'
|
|
3
3
|
#Proxy that delegates all calls to contained subject
|
4
4
|
# except solr related methods in MAPPED_FIELDS
|
5
5
|
class SolrCollection
|
6
|
-
MAPPED_FIELDS = [:facets, :spellcheck,
|
6
|
+
MAPPED_FIELDS = [:facets, :spellcheck, :total_entries]
|
7
7
|
|
8
8
|
def initialize(solr_result, options={})
|
9
9
|
options = options.dup
|
@@ -17,21 +17,18 @@ class SolrCollection
|
|
17
17
|
|
18
18
|
#get fields from solr_result or set them to nil
|
19
19
|
@solr_data = {}
|
20
|
-
MAPPED_FIELDS.each do |
|
21
|
-
if
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
solr_field = collection_field = fields
|
26
|
-
end
|
27
|
-
|
28
|
-
@solr_data[collection_field] = if solr_result.respond_to?(solr_field)
|
29
|
-
solr_result.send(solr_field)
|
20
|
+
MAPPED_FIELDS.each do |field|
|
21
|
+
@solr_data[field] = if options[field]
|
22
|
+
options[field]
|
23
|
+
elsif solr_result.respond_to?(field)
|
24
|
+
solr_result.send(field)
|
30
25
|
else
|
31
26
|
nil
|
32
27
|
end
|
33
28
|
end
|
34
|
-
|
29
|
+
|
30
|
+
# always set a total
|
31
|
+
@solr_data[:total_entries] ||= (results.respond_to?(:total) ? results.total : results.size)
|
35
32
|
|
36
33
|
#build will_paginate collection from given options
|
37
34
|
options = fill_page_and_per_page(options)
|
@@ -41,7 +38,7 @@ class SolrCollection
|
|
41
38
|
options[:per_page],
|
42
39
|
@solr_data[:total_entries]
|
43
40
|
)
|
44
|
-
@subject.replace(results)
|
41
|
+
@subject.replace(results.to_ary)
|
45
42
|
end
|
46
43
|
|
47
44
|
def has_facet_fields?
|
@@ -49,6 +46,12 @@ class SolrCollection
|
|
49
46
|
!!(facets and facets['facet_fields'] and not facets['facet_fields'].empty?)
|
50
47
|
end
|
51
48
|
|
49
|
+
def facet_field(field)
|
50
|
+
if has_facet_fields? and value = facets['facet_fields'][field]
|
51
|
+
value.empty? ? nil : value
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
52
55
|
private
|
53
56
|
|
54
57
|
def fill_page_and_per_page(options)
|
data/solr_collection.gemspec
CHANGED
@@ -5,18 +5,17 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{solr_collection}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Michael Grosser"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2010-12-08}
|
13
13
|
s.email = %q{grosser.michael@gmail.com}
|
14
|
-
s.extra_rdoc_files = [
|
15
|
-
"README.markdown"
|
16
|
-
]
|
17
14
|
s.files = [
|
18
|
-
"
|
15
|
+
"Gemfile",
|
16
|
+
"Gemfile.lock",
|
19
17
|
"Rakefile",
|
18
|
+
"Readme.md",
|
20
19
|
"VERSION",
|
21
20
|
"init.rb",
|
22
21
|
"lib/solr_collection.rb",
|
@@ -27,11 +26,11 @@ Gem::Specification.new do |s|
|
|
27
26
|
s.homepage = %q{http://github.com/grosser/solr_collection}
|
28
27
|
s.rdoc_options = ["--charset=UTF-8"]
|
29
28
|
s.require_paths = ["lib"]
|
30
|
-
s.rubygems_version = %q{1.3.
|
29
|
+
s.rubygems_version = %q{1.3.6}
|
31
30
|
s.summary = %q{Wrapper for solr results sets then behaves/feels like will_paginate collection}
|
32
31
|
s.test_files = [
|
33
|
-
"spec/
|
34
|
-
"spec/
|
32
|
+
"spec/solr_collection_spec.rb",
|
33
|
+
"spec/spec_helper.rb"
|
35
34
|
]
|
36
35
|
|
37
36
|
if s.respond_to? :specification_version then
|
@@ -1,10 +1,15 @@
|
|
1
1
|
require 'spec/spec_helper'
|
2
2
|
|
3
3
|
describe SolrCollection do
|
4
|
-
it "behaves like an array" do
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
it "behaves like an array when built from solr result" do
|
5
|
+
a = []
|
6
|
+
def a.results; [1, 2, 3];end
|
7
|
+
SolrCollection.new(a)[2].should == 3
|
8
|
+
end
|
9
|
+
|
10
|
+
it "behaves like an array when built from array" do
|
11
|
+
a = [1, 2, 3]
|
12
|
+
SolrCollection.new(a)[2].should == 3
|
8
13
|
end
|
9
14
|
|
10
15
|
it "behaves like a will_paginate collection" do
|
@@ -19,22 +24,22 @@ describe SolrCollection do
|
|
19
24
|
end
|
20
25
|
|
21
26
|
describe "pages" do
|
22
|
-
it "does not know
|
23
|
-
lambda{ SolrCollection.new([1,2,3]).page }.should raise_error
|
27
|
+
it "does not know non-will-paginate methods" do
|
28
|
+
lambda{ SolrCollection.new([1,2,3], :page => 3).page }.should raise_error
|
29
|
+
end
|
30
|
+
|
31
|
+
it "can set page" do
|
32
|
+
SolrCollection.new([1,2,3], :page=>3).current_page.should == 3
|
24
33
|
end
|
25
34
|
|
26
35
|
it "knows current_page" do
|
27
36
|
SolrCollection.new([1,2,3]).current_page.should == 1
|
28
37
|
end
|
29
38
|
|
30
|
-
it "knows per_page" do
|
39
|
+
it "knows default per_page" do
|
31
40
|
SolrCollection.new([1,2,3]).per_page.should == 10
|
32
41
|
end
|
33
42
|
|
34
|
-
it "can set page" do
|
35
|
-
SolrCollection.new([1,2,3], :page=>3).current_page.should == 3
|
36
|
-
end
|
37
|
-
|
38
43
|
it "can set per_page" do
|
39
44
|
SolrCollection.new([1,2,3], :per_page=>3).per_page.should == 3
|
40
45
|
end
|
@@ -54,44 +59,57 @@ describe SolrCollection do
|
|
54
59
|
end
|
55
60
|
end
|
56
61
|
|
57
|
-
describe "
|
62
|
+
describe "facets" do
|
58
63
|
it "knows factes" do
|
59
64
|
SolrCollection.new([]).facets.should == nil
|
60
65
|
end
|
61
66
|
|
62
|
-
it "
|
63
|
-
SolrCollection.new([]).
|
67
|
+
it "can set facets via options" do
|
68
|
+
SolrCollection.new([], :facets => [1]).facets.should == [1]
|
64
69
|
end
|
65
70
|
|
66
|
-
it "
|
67
|
-
|
71
|
+
it "can set facets via collection" do
|
72
|
+
a = []
|
73
|
+
def a.facets; [1]; end
|
74
|
+
SolrCollection.new(a).facets.should == [1]
|
68
75
|
end
|
69
76
|
|
70
|
-
it "
|
77
|
+
it "prefers facets from options" do
|
71
78
|
a = []
|
72
|
-
def a.
|
73
|
-
SolrCollection.new(
|
79
|
+
def a.facets; [1]; end
|
80
|
+
SolrCollection.new([], :facets => [2]).facets.should == [2]
|
74
81
|
end
|
82
|
+
end
|
75
83
|
|
76
|
-
|
77
|
-
|
78
|
-
|
84
|
+
it "knows spellcheck" do
|
85
|
+
SolrCollection.new([]).spellcheck.should == nil
|
86
|
+
end
|
79
87
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
end
|
88
|
+
it "does not know non-solr-method" do
|
89
|
+
lambda{ SolrCollection.new([]).fooo }.should raise_error
|
90
|
+
end
|
84
91
|
|
85
|
-
|
92
|
+
describe "total_entries" do
|
93
|
+
it "can get total_entries from a solr result" do
|
86
94
|
a = []
|
87
95
|
def a.total; 22;end
|
88
96
|
SolrCollection.new(a).total_entries.should == 22
|
89
97
|
end
|
90
98
|
|
91
|
-
it "
|
99
|
+
it "can get total_entries from array" do
|
100
|
+
a = [1,2,3]
|
101
|
+
SolrCollection.new(a).total_entries.should == 3
|
102
|
+
end
|
103
|
+
|
104
|
+
it "can get total_entries from self" do
|
105
|
+
a = SolrCollection.new([1,2,3])
|
106
|
+
SolrCollection.new(a).total_entries.should == 3
|
107
|
+
end
|
108
|
+
|
109
|
+
it "prefers total_entries from options" do
|
92
110
|
a = []
|
93
111
|
def a.total; 22;end
|
94
|
-
SolrCollection.new(a, :total_entries=>33).total_entries.should ==
|
112
|
+
SolrCollection.new(a, :total_entries=>33).total_entries.should == 33
|
95
113
|
end
|
96
114
|
end
|
97
115
|
|
@@ -112,4 +130,22 @@ describe SolrCollection do
|
|
112
130
|
SolrCollection.new(a).has_facet_fields?.should == true
|
113
131
|
end
|
114
132
|
end
|
133
|
+
|
134
|
+
describe :facet_field do
|
135
|
+
it "gets info from facet_fields" do
|
136
|
+
SolrCollection.new([], :facets => {'facet_fields' => {'x' => {'xx' => 1}}}).facet_field('x').should == {'xx' => 1}
|
137
|
+
end
|
138
|
+
|
139
|
+
it "returns nil when field is empty" do
|
140
|
+
SolrCollection.new([], :facets => {'facet_fields' => {'x' => []}}).facet_field('x').should == nil
|
141
|
+
end
|
142
|
+
|
143
|
+
it "returns nil when field is not found" do
|
144
|
+
SolrCollection.new([], :facets => {'facet_fields' => []}).facet_field('x').should == nil
|
145
|
+
end
|
146
|
+
|
147
|
+
it "returns nil when facets are empty" do
|
148
|
+
SolrCollection.new([]).facet_field('x').should == nil
|
149
|
+
end
|
150
|
+
end
|
115
151
|
end
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: solr_collection
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 3
|
9
|
+
version: 0.1.3
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- Michael Grosser
|
@@ -9,30 +14,34 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date:
|
17
|
+
date: 2010-12-08 00:00:00 +01:00
|
13
18
|
default_executable:
|
14
19
|
dependencies:
|
15
20
|
- !ruby/object:Gem::Dependency
|
16
|
-
|
17
|
-
type: :runtime
|
18
|
-
version_requirement:
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
21
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
22
|
requirements:
|
21
23
|
- - ">="
|
22
24
|
- !ruby/object:Gem::Version
|
25
|
+
segments:
|
26
|
+
- 0
|
23
27
|
version: "0"
|
24
|
-
|
28
|
+
type: :runtime
|
29
|
+
version_requirements: *id001
|
30
|
+
prerelease: false
|
31
|
+
name: will_paginate
|
25
32
|
description:
|
26
33
|
email: grosser.michael@gmail.com
|
27
34
|
executables: []
|
28
35
|
|
29
36
|
extensions: []
|
30
37
|
|
31
|
-
extra_rdoc_files:
|
32
|
-
|
38
|
+
extra_rdoc_files: []
|
39
|
+
|
33
40
|
files:
|
34
|
-
-
|
41
|
+
- Gemfile
|
42
|
+
- Gemfile.lock
|
35
43
|
- Rakefile
|
44
|
+
- Readme.md
|
36
45
|
- VERSION
|
37
46
|
- init.rb
|
38
47
|
- lib/solr_collection.rb
|
@@ -52,21 +61,23 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
52
61
|
requirements:
|
53
62
|
- - ">="
|
54
63
|
- !ruby/object:Gem::Version
|
64
|
+
segments:
|
65
|
+
- 0
|
55
66
|
version: "0"
|
56
|
-
version:
|
57
67
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
68
|
requirements:
|
59
69
|
- - ">="
|
60
70
|
- !ruby/object:Gem::Version
|
71
|
+
segments:
|
72
|
+
- 0
|
61
73
|
version: "0"
|
62
|
-
version:
|
63
74
|
requirements: []
|
64
75
|
|
65
76
|
rubyforge_project:
|
66
|
-
rubygems_version: 1.3.
|
77
|
+
rubygems_version: 1.3.6
|
67
78
|
signing_key:
|
68
79
|
specification_version: 3
|
69
80
|
summary: Wrapper for solr results sets then behaves/feels like will_paginate collection
|
70
81
|
test_files:
|
71
|
-
- spec/spec_helper.rb
|
72
82
|
- spec/solr_collection_spec.rb
|
83
|
+
- spec/spec_helper.rb
|
data/README.markdown
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
SolrCollection is a wrapper for acts_as_solr results sets that behaves/feels like will_paginate collection
|
2
|
-
|
3
|
-
- no need to separate results from facets / spellcheck information
|
4
|
-
- all pages can use the same pagination helpers
|
5
|
-
- simple to mock an empty result when solr is down or throws errors
|
6
|
-
|
7
|
-
Usage
|
8
|
-
=====
|
9
|
-
- As Rails plugin ` script/plugin install git://github.com/grosser/solr_collection.git `
|
10
|
-
- As gem ` sudo gem install solr_collection `
|
11
|
-
|
12
|
-
Example:
|
13
|
-
options = {:limit=>10, :offset=>100, :facets=>{....}, .... }
|
14
|
-
results = MyModel.find_by_solr("abc", options) rescue []
|
15
|
-
results = SolrCollection.new(results, options)
|
16
|
-
|
17
|
-
do_something if results.facets
|
18
|
-
something_else if results.total_entries > results.size #more pages ?
|
19
|
-
will_paginate(results)
|
20
|
-
|
21
|
-
Other features:
|
22
|
-
#facet fields can be nil or [] or {} -> use has_facet_fields? to check
|
23
|
-
puts results.facets['facet_fields']['categories'] if results.has_facet_fields?
|
24
|
-
|
25
|
-
Author
|
26
|
-
======
|
27
|
-
[Michael Grosser](http://pragmatig.wordpress.com)
|
28
|
-
grosser.michael@gmail.com
|
29
|
-
Hereby placed under public domain, do what you want, just do not hold me accountable...
|