solr_mapper 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
data/Manifest CHANGED
@@ -6,8 +6,10 @@ lib/solr_mapper/calculations.rb
6
6
  lib/solr_mapper/locators.rb
7
7
  lib/solr_mapper/relations.rb
8
8
  lib/solr_mapper/solr_document.rb
9
+ solr_mapper.gemspec
9
10
  spec/base.rb
10
11
  spec/calculations_spec.rb
12
+ spec/facets_spec.rb
11
13
  spec/locators_spec.rb
12
14
  spec/misc_spec.rb
13
15
  spec/paginated_spec.rb
data/Rakefile CHANGED
@@ -16,7 +16,7 @@ require 'rubygems'
16
16
  require 'rake'
17
17
  require 'echoe'
18
18
 
19
- Echoe.new('solr_mapper', '0.1.4') do |p|
19
+ Echoe.new('solr_mapper', '0.1.5') do |p|
20
20
  p.description = "Object Document Mapper for the Apache Foundation's Solr search platform"
21
21
  p.url = "http://github.com/skunkworx/solr_mapper"
22
22
  p.author = "Chris Umbel"
@@ -19,14 +19,13 @@ module SolrMapper
19
19
 
20
20
  def has_one(target, opts = {})
21
21
  class_name, field_name, variable_name, id_field = determine_names(target, opts)
22
- id_field = foreign_key(id_field)
23
22
 
24
23
  class_eval do
25
24
  define_method field_name do
26
25
  val = instance_variable_get(variable_name)
27
26
 
28
27
  unless val
29
- id = instance_variable_get(id_field)
28
+ id = instance_variable_get("@#{id_field}")
30
29
  val = Object::const_get(class_name).find(id) if id
31
30
  end
32
31
 
@@ -41,10 +40,30 @@ module SolrMapper
41
40
 
42
41
  def has_many(target, opts = {})
43
42
  class_name, field_name, variable_name, id_field = determine_names(target, opts)
44
- id_field = "#{id_field}_id"
45
-
43
+ @@facet_field_name = field_name
46
44
  has_many_relationships[field_name.to_s] = id_field
47
45
 
46
+ # add class method for loading relations via facets
47
+ class << self
48
+ define_method "#{@@facet_field_name}_facet" do |search|
49
+ fk = has_many_relationships[__method__.to_s.gsub(/_facet$/, '')]
50
+
51
+ solr_results = raw_query(search, {'facet' => 'true', 'facet.field' => fk})
52
+ klass = Object::const_get(classify(singularize(__method__.to_s.gsub(/_facet$/, ''))))
53
+ results = {}
54
+
55
+ solr_results['facet_counts']['facet_fields'][fk].each_slice(2).each do |pair|
56
+ child = klass.find(pair[0])
57
+ results[child] = pair[1] if child
58
+ end
59
+
60
+ results
61
+ end
62
+ end
63
+
64
+ @@facet_field_name = nil
65
+
66
+ # add a helper method that we'll use to hook arrays with manipulation logic we need
48
67
  class_eval do
49
68
  def relationize_array(array)
50
69
  class << array
@@ -75,20 +94,21 @@ module SolrMapper
75
94
 
76
95
  array
77
96
  end
78
-
97
+
98
+ # define a getter for this relation
79
99
  define_method field_name do
80
100
  val = instance_variable_get(variable_name)
81
101
 
82
102
  unless val
83
- ids = instance_variable_get(id_field)
103
+ ids = instance_variable_get("@#{id_field}")
84
104
  val = []
85
105
 
86
106
  val.instance_variable_set("@owner", self)
87
107
  val.instance_variable_set("@field_name", field_name.to_s)
88
108
 
89
109
  unless ids
90
- instance_variable_set(id_field, [])
91
- ids = instance_variable_get(id_field)
110
+ instance_variable_set("@#{id_field}", [])
111
+ ids = instance_variable_get("@#{id_field}")
92
112
  end
93
113
 
94
114
  ids.each do |id|
@@ -104,6 +124,7 @@ module SolrMapper
104
124
  val
105
125
  end
106
126
 
127
+ # define a setter for this relation
107
128
  define_method "#{field_name}=" do |vals|
108
129
  ids = []
109
130
 
@@ -120,7 +141,7 @@ module SolrMapper
120
141
  relationize_array(vals) unless vals.respond_to?(:destroy)
121
142
  end
122
143
 
123
- instance_variable_set(id_field, ids)
144
+ instance_variable_set("@#{id_field}", ids)
124
145
  instance_variable_set("@#{field_name}", val)
125
146
  end
126
147
  end
@@ -156,14 +177,15 @@ module SolrMapper
156
177
  class_name ||= classify(target)
157
178
  field_name = target
158
179
  variable_name = "@#{field_name}"
159
- id_field_prefix = "@#{singularize(target)}"
180
+ id_field = opts[:foreign_key]
181
+ id_field ||= "#{foreign_key(singularize(target))}"
160
182
 
161
- return class_name, field_name, variable_name, id_field_prefix
183
+ return class_name, field_name, variable_name, id_field
162
184
  end
163
185
  end
164
186
 
165
187
  def refresh_relation(field_name)
166
- ids = instance_variable_get(self.class.has_many_relationships[field_name])
188
+ ids = instance_variable_get("@#{self.class.has_many_relationships[field_name]}")
167
189
  ids.clear
168
190
 
169
191
  instance_variable_get("@#{field_name}").each do |child|
@@ -27,7 +27,8 @@ module SolrMapper
27
27
 
28
28
  # send a read REST command to Solr
29
29
  def execute_read(opts)
30
- eval(RestClient.get(build_url('select', opts.merge(:wt => 'ruby'))))
30
+ url = build_url('select', opts.merge(:wt => 'ruby'))
31
+ eval(RestClient.get(url))
31
32
  end
32
33
 
33
34
  # send a write REST command to SOlr
@@ -75,8 +76,8 @@ module SolrMapper
75
76
  results
76
77
  end
77
78
 
78
- # execute solr query and return the count as well as the results
79
- def query_counted(values, opts = {})
79
+ # execute solr query and return the count as well as the RAW results
80
+ def raw_query(values, opts = {})
80
81
  if values.kind_of?(Hash)
81
82
  search_string = ''
82
83
 
@@ -89,7 +90,12 @@ module SolrMapper
89
90
  search_string = values.to_s
90
91
  end
91
92
 
92
- response = execute_read(opts.merge(:q => search_string))
93
+ execute_read(opts.merge(:q => search_string))
94
+ end
95
+
96
+ # execute solr query and return the count as well as OBJECTS
97
+ def query_counted(values, opts = {})
98
+ response = raw_query(values, opts)
93
99
  return map(response), response['response']['numFound']
94
100
  end
95
101
 
data/solr_mapper.gemspec CHANGED
@@ -2,15 +2,15 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{solr_mapper}
5
- s.version = "0.1.4"
5
+ s.version = "0.1.5"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Chris Umbel"]
9
- s.date = %q{2010-10-27}
9
+ s.date = %q{2010-10-29}
10
10
  s.description = %q{Object Document Mapper for the Apache Foundation's Solr search platform}
11
11
  s.email = %q{chrisu@dvdempire.com}
12
12
  s.extra_rdoc_files = ["LICENSE.txt", "README.rdoc", "lib/solr_mapper.rb", "lib/solr_mapper/calculations.rb", "lib/solr_mapper/locators.rb", "lib/solr_mapper/relations.rb", "lib/solr_mapper/solr_document.rb"]
13
- s.files = ["LICENSE.txt", "README.rdoc", "Rakefile", "lib/solr_mapper.rb", "lib/solr_mapper/calculations.rb", "lib/solr_mapper/locators.rb", "lib/solr_mapper/relations.rb", "lib/solr_mapper/solr_document.rb", "spec/base.rb", "spec/calculations_spec.rb", "spec/locators_spec.rb", "spec/misc_spec.rb", "spec/paginated_spec.rb", "spec/query_spec.rb", "spec/relation_spec.rb", "spec/solr/stuff/config/schema.xml", "spec/solr/thing/config/schema.xml", "spec/solr/widget/conf/schema.xml", "spec/url_spec.rb", "Manifest", "solr_mapper.gemspec"]
13
+ s.files = ["LICENSE.txt", "README.rdoc", "Rakefile", "lib/solr_mapper.rb", "lib/solr_mapper/calculations.rb", "lib/solr_mapper/locators.rb", "lib/solr_mapper/relations.rb", "lib/solr_mapper/solr_document.rb", "solr_mapper.gemspec", "spec/base.rb", "spec/calculations_spec.rb", "spec/facets_spec.rb", "spec/locators_spec.rb", "spec/misc_spec.rb", "spec/paginated_spec.rb", "spec/query_spec.rb", "spec/relation_spec.rb", "spec/solr/stuff/config/schema.xml", "spec/solr/thing/config/schema.xml", "spec/solr/widget/conf/schema.xml", "spec/url_spec.rb", "Manifest"]
14
14
  s.homepage = %q{http://github.com/skunkworx/solr_mapper}
15
15
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Solr_mapper", "--main", "README.rdoc"]
16
16
  s.require_paths = ["lib"]
@@ -0,0 +1,56 @@
1
+ # Copyright 2010 The Skunkworx.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require File.dirname(__FILE__) + '/base'
16
+ require 'rest_client'
17
+
18
+ describe SolrMapper::SolrDocument do
19
+ before(:all) do
20
+ url = Thing::base_url
21
+ resource = RestClient::Resource.new("#{url}/update")
22
+ resource.post("<delete><query>id:[* TO *]</query></delete>", {:content_type => 'text/xml'})
23
+ resource.post("<commit/>", {:content_type => 'text/xml'})
24
+
25
+ url = Stuff::base_url
26
+ resource = RestClient::Resource.new("#{url}/update")
27
+ resource.post("<delete><query>id:[* TO *]</query></delete>", {:content_type => 'text/xml'})
28
+ resource.post("<commit/>", {:content_type => 'text/xml'})
29
+
30
+ stuff = Stuff.new({:_id => '04787560-bc23-012d-817c-60334b2add63', :name => 'stuff 1'})
31
+ stuff.save
32
+
33
+ stuff = Stuff.new({:_id => '04787560-bc23-012d-817c-60334b2add64', :name => 'stuff 2'})
34
+ stuff.save
35
+
36
+ stuff = Stuff.new({:_id => '04787560-bc23-012d-817c-60334b2add65', :name => 'stuff 3'})
37
+ stuff.save
38
+
39
+ thing = Thing.new({:_id => '04787560-bc23-012d-817c-60334b2add60', :content => 'A',
40
+ :stuff_id => ['04787560-bc23-012d-817c-60334b2add63', '04787560-bc23-012d-817c-60334b2add64']})
41
+ thing.save
42
+
43
+ thing = Thing.new({:_id => '04787560-bc23-012d-817c-60334b2add61', :content => 'A',
44
+ :stuff_id => ['04787560-bc23-012d-817c-60334b2add63']})
45
+ thing.save
46
+
47
+ thing = Thing.new({:_id => '04787560-bc23-012d-817c-60334b2add62', :content => 'B',
48
+ :stuff_id => ['04787560-bc23-012d-817c-60334b2add65']})
49
+ thing.save
50
+ end
51
+
52
+ it "should lookup related object by facet" do
53
+ Thing.stuffs_facet('*:*').count.should_not == 0
54
+ end
55
+ end
56
+
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solr_mapper
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 17
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
8
  - 1
8
- - 4
9
- version: 0.1.4
9
+ - 5
10
+ version: 0.1.5
10
11
  platform: ruby
11
12
  authors:
12
13
  - Chris Umbel
@@ -14,7 +15,7 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-10-27 00:00:00 +00:00
18
+ date: 2010-10-29 00:00:00 -04:00
18
19
  default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
@@ -25,6 +26,7 @@ dependencies:
25
26
  requirements:
26
27
  - - ">="
27
28
  - !ruby/object:Gem::Version
29
+ hash: 3
28
30
  segments:
29
31
  - 0
30
32
  version: "0"
@@ -38,6 +40,7 @@ dependencies:
38
40
  requirements:
39
41
  - - ">="
40
42
  - !ruby/object:Gem::Version
43
+ hash: 3
41
44
  segments:
42
45
  - 0
43
46
  version: "0"
@@ -51,6 +54,7 @@ dependencies:
51
54
  requirements:
52
55
  - - ">="
53
56
  - !ruby/object:Gem::Version
57
+ hash: 3
54
58
  segments:
55
59
  - 0
56
60
  version: "0"
@@ -64,6 +68,7 @@ dependencies:
64
68
  requirements:
65
69
  - - ">="
66
70
  - !ruby/object:Gem::Version
71
+ hash: 3
67
72
  segments:
68
73
  - 0
69
74
  version: "0"
@@ -92,8 +97,10 @@ files:
92
97
  - lib/solr_mapper/locators.rb
93
98
  - lib/solr_mapper/relations.rb
94
99
  - lib/solr_mapper/solr_document.rb
100
+ - solr_mapper.gemspec
95
101
  - spec/base.rb
96
102
  - spec/calculations_spec.rb
103
+ - spec/facets_spec.rb
97
104
  - spec/locators_spec.rb
98
105
  - spec/misc_spec.rb
99
106
  - spec/paginated_spec.rb
@@ -104,7 +111,6 @@ files:
104
111
  - spec/solr/widget/conf/schema.xml
105
112
  - spec/url_spec.rb
106
113
  - Manifest
107
- - solr_mapper.gemspec
108
114
  has_rdoc: true
109
115
  homepage: http://github.com/skunkworx/solr_mapper
110
116
  licenses: []
@@ -124,6 +130,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
124
130
  requirements:
125
131
  - - ">="
126
132
  - !ruby/object:Gem::Version
133
+ hash: 3
127
134
  segments:
128
135
  - 0
129
136
  version: "0"
@@ -132,6 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
132
139
  requirements:
133
140
  - - ">="
134
141
  - !ruby/object:Gem::Version
142
+ hash: 11
135
143
  segments:
136
144
  - 1
137
145
  - 2