solr_mapper 0.1.8 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
data/Manifest CHANGED
@@ -11,6 +11,7 @@ solr_mapper.gemspec
11
11
  spec/base.rb
12
12
  spec/calculations_spec.rb
13
13
  spec/facets_spec.rb
14
+ spec/generation.rb
14
15
  spec/locators_spec.rb
15
16
  spec/misc_spec.rb
16
17
  spec/paginated_spec.rb
data/README.rdoc CHANGED
@@ -44,6 +44,20 @@ gem install solr_mapper
44
44
  has_one :widget
45
45
  end
46
46
 
47
+ === Auto Generated IDs
48
+
49
+ as of 0.1.9 you can cause a document to create a UUID id
50
+ for new objects with:
51
+
52
+ class Stuff
53
+ include SolrDocument
54
+
55
+ # tells solr_mapper to generate the id
56
+ auto_generate_id
57
+
58
+ bind_service_url 'http://localhost:8080/solr/stuff'
59
+ end
60
+
47
61
  === Reading
48
62
 
49
63
  thing = Thing.find(1)
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.8') do |p|
19
+ Echoe.new('solr_mapper', '0.1.9') 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"
@@ -17,6 +17,7 @@ module SolrMapper
17
17
  module ClassMethods
18
18
  attr_accessor :has_many_relationships
19
19
 
20
+ # handle a has one relationship. this document contains a foreign key to a doc in another index
20
21
  def has_one(target, opts = {})
21
22
  class_name, field_name, variable_name, id_field = determine_names(target, opts)
22
23
 
@@ -38,6 +39,7 @@ module SolrMapper
38
39
  end
39
40
  end
40
41
 
42
+ # handle a has one relationship. this document contains a foreign key to another index's documents
41
43
  def has_many(target, opts = {})
42
44
  class_name, field_name, variable_name, id_field = determine_names(target, opts)
43
45
  @@facet_field_name = field_name
@@ -147,14 +149,17 @@ module SolrMapper
147
149
  end
148
150
  end
149
151
 
152
+ # handle a belongs to relation. target index contains document with foreign keys to this document
150
153
  def belongs_to(target_name, opts = {})
151
154
  target_id_field_name = foreign_key(self.name)
152
155
 
153
156
  class_eval do
157
+ # create getter for owner object
154
158
  define_method target_name do
155
159
  owner = instance_variable_get("@#{target_name}")
156
160
 
157
161
  unless owner
162
+ # owner object hasn't been lazy loaded. do so now.
158
163
  owner = Object::const_get(classify(target_name)).query(target_id_field_name => instance_variable_get("@_id"))[0]
159
164
  instance_variable_set("@#{target_name}", owner)
160
165
  end
@@ -162,6 +167,7 @@ module SolrMapper
162
167
  owner
163
168
  end
164
169
 
170
+ # create setter for owner object
165
171
  define_method "#{target_name}=" do |val|
166
172
  instance_variable_set("@#{target_name}", val)
167
173
  val.instance_variable_set("@#{target_id_field_name}", instance_variable_get("@_id"))
@@ -172,6 +178,7 @@ module SolrMapper
172
178
 
173
179
  protected
174
180
 
181
+ # figure out the names of properties and classes involved in the relation
175
182
  def determine_names(target, opts = {})
176
183
  class_name = opts[:class_name]
177
184
  class_name ||= classify(target)
@@ -184,6 +191,7 @@ module SolrMapper
184
191
  end
185
192
  end
186
193
 
194
+ # when the owner collection is modified this will be called sync the relation up
187
195
  def refresh_relation(field_name)
188
196
  ids = instance_variable_get("@#{self.class.has_many_relationships[field_name]}")
189
197
  ids.clear
@@ -38,6 +38,14 @@ module SolrMapper
38
38
  @base_url
39
39
  end
40
40
 
41
+ def auto_generate_id
42
+ @auto_geneerate_id = true
43
+ end
44
+
45
+ def auto_generate_id?
46
+ @auto_geneerate_id
47
+ end
48
+
41
49
  # send a read REST command to Solr
42
50
  def execute_read(opts)
43
51
  url = build_url('select', opts.merge(:wt => 'ruby'))
@@ -47,7 +55,7 @@ module SolrMapper
47
55
  # send a write REST command to Solr
48
56
  def execute_write(data, opts = nil)
49
57
  send_update(data, opts)
50
-
58
+
51
59
  # make an xml commit message Solr will be happy with
52
60
  commit_message = ''
53
61
  builder = Builder::XmlMarkup.new(:target => commit_message, :indent => 2)
@@ -180,6 +188,7 @@ module SolrMapper
180
188
 
181
189
  attr_accessor :_id
182
190
 
191
+ # the property doesn't exist for this document. add it now.
183
192
  def method_missing(m, *args, &block)
184
193
  method_name = m.to_s
185
194
  assignment = method_name.match(/\=$/)
@@ -190,9 +199,13 @@ module SolrMapper
190
199
 
191
200
  def save()
192
201
  send(:before_save) if respond_to?(:before_save)
202
+
203
+ if not @_id and self.class.auto_generate_id?
204
+ @_id = UUID.new().generate()
205
+ self.class.solr_fields << '_id' unless self.class.solr_fields.include?('_id')
206
+ end
193
207
 
194
208
  self.class.execute_write(to_solr_xml, {:overwrite => true})
195
-
196
209
  send(:after_save) if respond_to?(:after_save)
197
210
  end
198
211
 
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.8"
5
+ s.version = "0.1.9"
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-12-02}
9
+ s.date = %q{2010-12-28}
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", "Manifest", "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"]
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/facets_spec.rb", "spec/generation.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"]
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,49 @@
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
+
17
+ include SolrMapper
18
+
19
+ describe SolrDocument do
20
+ before(:all) do
21
+ class Thing
22
+ auto_generate_id
23
+ end
24
+
25
+ url = Thing::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
+ thing = Thing.new({:name => 'A', :content => 'sample content 1'})
31
+ thing.save
32
+ end
33
+
34
+ it "should have an auto generated id" do
35
+ thing = Thing.first()
36
+ thing._id.should_not be(nil)
37
+ end
38
+
39
+ it "shouldn't let the id change after successive saves" do
40
+ thing = Thing.first()
41
+ old_id = thing._id
42
+ thing.save()
43
+ thing._id.should == old_id
44
+ end
45
+
46
+ after(:all) do
47
+ Thing.class_eval("@auto_generate_id = false")
48
+ end
49
+ end
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solr_mapper
3
3
  version: !ruby/object:Gem::Version
4
- hash: 11
5
4
  prerelease: false
6
5
  segments:
7
6
  - 0
8
7
  - 1
9
- - 8
10
- version: 0.1.8
8
+ - 9
9
+ version: 0.1.9
11
10
  platform: ruby
12
11
  authors:
13
12
  - Chris Umbel
@@ -15,7 +14,7 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2010-12-02 00:00:00 -05:00
17
+ date: 2010-12-28 00:00:00 +00:00
19
18
  default_executable:
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
@@ -26,7 +25,6 @@ dependencies:
26
25
  requirements:
27
26
  - - ">="
28
27
  - !ruby/object:Gem::Version
29
- hash: 3
30
28
  segments:
31
29
  - 0
32
30
  version: "0"
@@ -40,7 +38,6 @@ dependencies:
40
38
  requirements:
41
39
  - - ">="
42
40
  - !ruby/object:Gem::Version
43
- hash: 3
44
41
  segments:
45
42
  - 0
46
43
  version: "0"
@@ -54,7 +51,6 @@ dependencies:
54
51
  requirements:
55
52
  - - ">="
56
53
  - !ruby/object:Gem::Version
57
- hash: 3
58
54
  segments:
59
55
  - 0
60
56
  version: "0"
@@ -68,7 +64,6 @@ dependencies:
68
64
  requirements:
69
65
  - - ">="
70
66
  - !ruby/object:Gem::Version
71
- hash: 3
72
67
  segments:
73
68
  - 0
74
69
  version: "0"
@@ -82,7 +77,6 @@ dependencies:
82
77
  requirements:
83
78
  - - ">="
84
79
  - !ruby/object:Gem::Version
85
- hash: 3
86
80
  segments:
87
81
  - 2
88
82
  - 0
@@ -105,7 +99,6 @@ extra_rdoc_files:
105
99
  - lib/solr_mapper/solr_document.rb
106
100
  files:
107
101
  - LICENSE.txt
108
- - Manifest
109
102
  - README.rdoc
110
103
  - Rakefile
111
104
  - lib/solr_mapper.rb
@@ -113,10 +106,10 @@ files:
113
106
  - lib/solr_mapper/locators.rb
114
107
  - lib/solr_mapper/relations.rb
115
108
  - lib/solr_mapper/solr_document.rb
116
- - solr_mapper.gemspec
117
109
  - spec/base.rb
118
110
  - spec/calculations_spec.rb
119
111
  - spec/facets_spec.rb
112
+ - spec/generation.rb
120
113
  - spec/locators_spec.rb
121
114
  - spec/misc_spec.rb
122
115
  - spec/paginated_spec.rb
@@ -126,6 +119,8 @@ files:
126
119
  - spec/solr/thing/config/schema.xml
127
120
  - spec/solr/widget/conf/schema.xml
128
121
  - spec/url_spec.rb
122
+ - Manifest
123
+ - solr_mapper.gemspec
129
124
  has_rdoc: true
130
125
  homepage: http://github.com/skunkworx/solr_mapper
131
126
  licenses: []
@@ -145,7 +140,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
145
140
  requirements:
146
141
  - - ">="
147
142
  - !ruby/object:Gem::Version
148
- hash: 3
149
143
  segments:
150
144
  - 0
151
145
  version: "0"
@@ -154,7 +148,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
154
148
  requirements:
155
149
  - - ">="
156
150
  - !ruby/object:Gem::Version
157
- hash: 11
158
151
  segments:
159
152
  - 1
160
153
  - 2