active-fedora 4.0.0.rc1 → 4.0.0.rc2

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.
Files changed (44) hide show
  1. data/Gemfile.lock +2 -11
  2. data/History.txt +4 -1
  3. data/active-fedora.gemspec +2 -2
  4. data/lib/active_fedora/associations/association_collection.rb +1 -1
  5. data/lib/active_fedora/associations/belongs_to_association.rb +1 -1
  6. data/lib/active_fedora/associations/has_and_belongs_to_many_association.rb +1 -1
  7. data/lib/active_fedora/base.rb +10 -6
  8. data/lib/active_fedora/file_management.rb +1 -1
  9. data/lib/active_fedora/fixture_loader.rb +1 -1
  10. data/lib/active_fedora/model.rb +39 -38
  11. data/lib/active_fedora/nokogiri_datastream.rb +1 -1
  12. data/lib/active_fedora/persistence.rb +9 -11
  13. data/lib/active_fedora/predicates.rb +2 -2
  14. data/lib/active_fedora/rdf_datastream.rb +49 -7
  15. data/lib/active_fedora/relationships.rb +6 -9
  16. data/lib/active_fedora/service_definitions.rb +1 -1
  17. data/lib/active_fedora/solr_service.rb +15 -8
  18. data/lib/active_fedora/version.rb +1 -1
  19. data/lib/tasks/active_fedora.rake +3 -5
  20. data/lib/tasks/active_fedora_dev.rake +2 -1
  21. data/spec/fixtures/solr_rdf_descMetadata.nt +7 -0
  22. data/spec/integration/base_file_management_spec.rb +1 -1
  23. data/spec/integration/base_find_by_fields_spec.rb +16 -14
  24. data/spec/integration/base_spec.rb +10 -9
  25. data/spec/integration/datastream_collections_spec.rb +5 -5
  26. data/spec/integration/datastream_spec.rb +1 -1
  27. data/spec/integration/full_featured_model_spec.rb +1 -1
  28. data/spec/integration/model_spec.rb +14 -11
  29. data/spec/integration/mods_article_integration_spec.rb +2 -2
  30. data/spec/integration/nokogiri_datastream_spec.rb +1 -1
  31. data/spec/integration/ntriples_datastream_spec.rb +1 -0
  32. data/spec/integration/rels_ext_datastream_spec.rb +5 -6
  33. data/spec/integration/semantic_node_spec.rb +0 -1
  34. data/spec/integration/solr_service_spec.rb +8 -8
  35. data/spec/unit/base_extra_spec.rb +47 -7
  36. data/spec/unit/base_file_management_spec.rb +1 -1
  37. data/spec/unit/base_spec.rb +44 -15
  38. data/spec/unit/model_spec.rb +16 -29
  39. data/spec/unit/ntriples_datastream_spec.rb +152 -1
  40. data/spec/unit/relationships_spec.rb +16 -18
  41. data/spec/unit/solr_config_options_spec.rb +1 -3
  42. data/spec/unit/solr_service_spec.rb +12 -24
  43. metadata +68 -86
  44. data/spec/integration/base_loader_spec.rb +0 -40
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- active-fedora (4.0.0.rc1)
4
+ active-fedora (4.0.0.rc2)
5
5
  activeresource (>= 3.0.0)
6
6
  activesupport (>= 3.0.0)
7
7
  equivalent-xml
@@ -12,8 +12,8 @@ PATH
12
12
  om (>= 1.5.3)
13
13
  rdf
14
14
  rdf-rdfxml
15
+ rsolr
15
16
  rubydora (~> 0.5.4)
16
- solr-ruby (>= 0.0.6)
17
17
  solrizer (~> 1.2.0)
18
18
  xml-simple (>= 1.0.12)
19
19
 
@@ -101,7 +101,6 @@ GEM
101
101
  nokogiri (>= 1.4.0)
102
102
  nori (~> 1.1)
103
103
  wasabi (~> 2.1)
104
- solr-ruby (0.0.8)
105
104
  solrizer (1.2.0)
106
105
  daemons
107
106
  mediashelf-loggable (~> 0.4.7)
@@ -109,13 +108,6 @@ GEM
109
108
  om (>= 1.5.0)
110
109
  stomp
111
110
  xml-simple
112
- solrizer-fedora (1.2.5)
113
- active-fedora (>= 3.2.0)
114
- activesupport (>= 3.0.11)
115
- fastercsv
116
- rsolr (= 1.0.6)
117
- solr-ruby (>= 0.0.6)
118
- solrizer (>= 1.0.0)
119
111
  stomp (1.2.0)
120
112
  wasabi (2.1.0)
121
113
  nokogiri (>= 1.4.0)
@@ -132,5 +124,4 @@ DEPENDENCIES
132
124
  mocha (>= 0.9.8)
133
125
  rake
134
126
  rspec (~> 2.0)
135
- solrizer-fedora (~> 1.2.5)
136
127
  yard
data/History.txt CHANGED
@@ -1,4 +1,4 @@
1
- 4.0.0.rc1
1
+ 4.0.0.rc2
2
2
  Removed deprecations
3
3
  * allowing :fedora level in fedora.yml
4
4
  * automatic includes of Relationships and FileMethods is removed
@@ -6,6 +6,9 @@ Added sharding TODO add documentation
6
6
  Added find_document which determines the correct model and then casts the object to that.
7
7
  Improved loading from solr
8
8
  RDF datastreams
9
+ Replaced solr-ruby with rsolr. Note: remove any calls to .hits
10
+ load_instance is now deprecated, replaced with find
11
+ Find alwasy casts to the appropriate object.
9
12
 
10
13
  3.3.2
11
14
  HYDRA-745 No need to require :url be present on external datastreams
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
15
15
  s.rubyforge_project = "rubyfedora"
16
16
  s.rubygems_version = %q{1.3.7}
17
17
 
18
- s.add_dependency('solr-ruby', '>= 0.0.6')
18
+ s.add_dependency('rsolr')
19
19
  s.add_dependency('xml-simple', '>= 1.0.12')
20
20
  s.add_dependency('mime-types', '>= 1.16')
21
21
  s.add_dependency('multipart-post', "= 1.1.2")
@@ -33,7 +33,7 @@ Gem::Specification.new do |s|
33
33
  s.add_development_dependency("RedCloth") # for RDoc formatting
34
34
  s.add_development_dependency("rake")
35
35
  # s.add_development_dependency("rcov") # not ruby 1.9 compatible
36
- s.add_development_dependency("solrizer-fedora", "~>1.2.5") # used by the fixtures rake tasks
36
+ # s.add_development_dependency("solrizer-fedora", "~>1.2.5") # used by the fixtures rake tasks
37
37
  s.add_development_dependency("jettywrapper", ">=1.2.0")
38
38
  s.add_development_dependency("rspec", "~> 2.0")
39
39
  s.add_development_dependency("mocha", ">= 0.9.8")
@@ -131,7 +131,7 @@ module ActiveFedora
131
131
 
132
132
  def find_target
133
133
  return [] if @finder_query.empty?
134
- solr_result = SolrService.instance.conn.query(@finder_query, :rows=>1000)
134
+ solr_result = SolrService.query(@finder_query, :rows=>1000)
135
135
  #TODO, don't reify, just store the solr results and lazily reify.
136
136
  return ActiveFedora::SolrService.reify_solr_results(solr_result)
137
137
  end
@@ -27,7 +27,7 @@ module ActiveFedora
27
27
  pid = @owner.ids_for_outbound(@reflection.options[:property]).first
28
28
  return if pid.nil?
29
29
  query = ActiveFedora::SolrService.construct_query_for_pids([pid])
30
- solr_result = SolrService.instance.conn.query(query)
30
+ solr_result = SolrService.query(query)
31
31
  return ActiveFedora::SolrService.reify_solr_results(solr_result).first
32
32
  end
33
33
 
@@ -10,7 +10,7 @@ module ActiveFedora
10
10
  pids = @owner.ids_for_outbound(@reflection.options[:property])
11
11
  return [] if pids.empty?
12
12
  query = ActiveFedora::SolrService.construct_query_for_pids(pids)
13
- solr_result = SolrService.instance.conn.query(query)
13
+ solr_result = SolrService.query(query)
14
14
  return ActiveFedora::SolrService.reify_solr_results(solr_result)
15
15
  end
16
16
 
@@ -271,13 +271,17 @@ module ActiveFedora
271
271
  # If opts[:model_only] == true, the base object metadata and the RELS-EXT datastream will be omitted. This is mainly to support shelver, which calls .to_solr for each model an object subscribes to.
272
272
  def to_solr(solr_doc = Hash.new, opts={})
273
273
  unless opts[:model_only]
274
- solr_doc.merge!(SOLR_DOCUMENT_ID.to_sym => pid, ActiveFedora::SolrService.solr_name(:system_create, :date) => self.create_date, ActiveFedora::SolrService.solr_name(:system_modified, :date) => self.modified_date, ActiveFedora::SolrService.solr_name(:active_fedora_model, :symbol) => self.class.inspect)
274
+ c_time = create_date
275
+ c_time = Time.parse(c_time) unless c_time.is_a?(Time)
276
+ m_time = modified_date
277
+ m_time = Time.parse(m_time) unless m_time.is_a?(Time)
278
+ solr_doc.merge!(SOLR_DOCUMENT_ID.to_sym => pid, ActiveFedora::SolrService.solr_name(:system_create, :date) => c_time.utc.xmlschema, ActiveFedora::SolrService.solr_name(:system_modified, :date) => m_time.utc.xmlschema, ActiveFedora::SolrService.solr_name(:active_fedora_model, :symbol) => self.class.inspect)
275
279
  solrize_profile(solr_doc)
276
280
  end
277
281
  datastreams.each_value do |ds|
278
282
  solr_doc = ds.solrize_profile(solr_doc)
279
283
  ds.ensure_xml_loaded if ds.respond_to? :ensure_xml_loaded ### Can't put this in the model because it's often implemented in Solrizer::XML::TerminologyBasedSolrizer
280
- solr_doc = ds.to_solr(solr_doc) if ds.kind_of?(ActiveFedora::MetadataDatastream) || ds.kind_of?(ActiveFedora::NokogiriDatastream)
284
+ solr_doc = ds.to_solr(solr_doc) if ds.kind_of?(ActiveFedora::RDFDatastream) || ds.kind_of?(ActiveFedora::NokogiriDatastream) || ds.kind_of?(ActiveFedora::MetadataDatastream)
281
285
  end
282
286
  solr_doc = solrize_relationships(solr_doc) unless opts[:model_only]
283
287
  solr_doc
@@ -326,7 +330,7 @@ module ActiveFedora
326
330
  if self.inner_object.is_a? DigitalObject
327
331
  raise "#{self.inspect} is already a full digital object"
328
332
  end
329
- self.class.load_instance self.pid
333
+ self.class.find self.pid
330
334
  end
331
335
 
332
336
  # ** EXPERIMENTAL **
@@ -341,7 +345,7 @@ module ActiveFedora
341
345
 
342
346
  # ** EXPERIMENTAL **
343
347
  #
344
- # This method can be used instead of ActiveFedora::Model::ClassMethods.load_instance.
348
+ # This method can be used instead of ActiveFedora::Model::ClassMethods.find.
345
349
  # It works similarly except it populates an object from Solr instead of Fedora.
346
350
  # It is most useful for objects used in read-only displays in order to speed up loading time. If only
347
351
  # a pid is passed in it will query solr for a corresponding solr document and then use it
@@ -351,12 +355,12 @@ module ActiveFedora
351
355
  # one passed to populate the object.
352
356
  #
353
357
  # It will anything stored within solr such as metadata and relationships. Non-metadata datastreams will not
354
- # be loaded and if needed you should use load_instance instead.
358
+ # be loaded and if needed you should use find instead.
355
359
  def self.load_instance_from_solr(pid,solr_doc=nil)
356
360
  if solr_doc.nil?
357
361
  result = find_by_solr(pid)
358
362
  raise "Object #{pid} not found in solr" if result.nil?
359
- solr_doc = result.hits.first
363
+ solr_doc = result.first
360
364
  #double check pid and id in record match
361
365
  raise "Object #{pid} not found in Solr" unless !result.nil? && !solr_doc.nil? && pid == solr_doc[SOLR_DOCUMENT_ID]
362
366
  else
@@ -45,7 +45,7 @@ module ActiveFedora
45
45
  # collection_members_append(obj)
46
46
  unless obj.kind_of? ActiveFedora::Base
47
47
  begin
48
- obj = ActiveFedora::Base.load_instance(obj)
48
+ obj = ActiveFedora::Base.find(obj)
49
49
  rescue ActiveFedora::ObjectNotFoundError
50
50
  "You must provide either an ActiveFedora object or a valid pid to add it as a file object. You submitted #{obj.inspect}"
51
51
  end
@@ -12,7 +12,7 @@ module ActiveFedora
12
12
 
13
13
  def self.delete(pid)
14
14
  begin
15
- ActiveFedora::Base.load_instance(pid).delete
15
+ ActiveFedora::Base.find(pid).delete
16
16
  1
17
17
  rescue ActiveFedora::ObjectNotFoundError
18
18
  logger.debug "The object #{pid} has already been deleted (or was never created)."
@@ -44,12 +44,6 @@ module ActiveFedora
44
44
  result
45
45
  end
46
46
 
47
- def add_metadata
48
- end
49
-
50
- def datastream
51
- end
52
-
53
47
 
54
48
  #
55
49
  # =Class Methods
@@ -80,20 +74,10 @@ module ActiveFedora
80
74
  # @example this will return an instance of Book, even if the object hydra:dataset1 asserts that it is a Dataset
81
75
  # Book.load_instance("hydra:dataset1")
82
76
  def load_instance(pid)
83
- self.allocate.init_with(DigitalObject.find(self, pid))
77
+ ActiveSupport::Deprecation.warn("load_instance is deprecated. Use find instead")
78
+ find(pid)
84
79
  end
85
80
 
86
- # Retrieve the Fedora object with te given pid, explore the returned object, determine its model
87
- # using #{known_models_for} and cast to that class.
88
- # @param [String] pid of the object to load
89
- #
90
- # @example because the object hydra:dataset1 asserts it is a Dataset (hasModel info:fedora/afmodel:Dataset), return a Dataset object (not a Book).
91
- # Book.find_document("hydra:dataset1")
92
- def find_document(pid)
93
- af_base = load_instance(pid)
94
- the_model = ActiveFedora::ContentModel.known_models_for( af_base ).first
95
- af_base.adapt_to(the_model)
96
- end
97
81
 
98
82
 
99
83
  # Returns a suitable uri object for :has_model
@@ -120,19 +104,20 @@ module ActiveFedora
120
104
  if args == :all
121
105
  escaped_class_uri = SolrService.escape_uri_for_query(self.to_class_uri)
122
106
  q = "#{ActiveFedora::SolrService.solr_name(:has_model, :symbol)}:#{escaped_class_uri}"
123
- hits = SolrService.instance.conn.query(q, :rows=>opts[:rows]).hits
107
+ hits = SolrService.query(q, :rows=>opts[:rows])
124
108
  return hits.map do |hit|
125
109
  pid = hit[SOLR_DOCUMENT_ID]
126
- load_instance(pid)
110
+ find_one(pid)
127
111
  end
128
112
  elsif args.class == String
129
- return load_instance(args)
113
+ return find_one(args)
130
114
  end
131
115
  end
132
116
 
117
+
133
118
  def find_model(pid)
134
- ActiveSupport::Deprection.warn("find_model is deprecated. Use load_instance instead")
135
- load_instance(pid)
119
+ ActiveSupport::Deprecation.warn("find_model is deprecated. Use find instead")
120
+ find(pid)
136
121
  end
137
122
 
138
123
 
@@ -142,7 +127,7 @@ module ActiveFedora
142
127
  escaped_class_uri = SolrService.escape_uri_for_query(self.to_class_uri)
143
128
  q = "#{ActiveFedora::SolrService.solr_name(:has_model, :symbol)}:#{escaped_class_uri}"
144
129
  q << " AND #{args[:conditions]}" if args[:conditions]
145
- SolrService.instance.conn.query(q, :rows=>0).total_hits
130
+ SolrService.query(q, :raw=>true, :rows=>0)['response']['numFound']
146
131
  end
147
132
 
148
133
  #Sends a query directly to SolrService
@@ -164,10 +149,10 @@ module ActiveFedora
164
149
  def find_by_solr(query, args={})
165
150
  if query == :all
166
151
  escaped_class_name = self.name.gsub(/(:)/, '\\:')
167
- SolrService.instance.conn.query("#{ActiveFedora::SolrService.solr_name(:active_fedora_model, :symbol)}:#{escaped_class_name}", args)
152
+ SolrService.query("#{ActiveFedora::SolrService.solr_name(:active_fedora_model, :symbol)}:#{escaped_class_name}", args)
168
153
  elsif query.class == String
169
154
  escaped_id = query.gsub(/(:)/, '\\:')
170
- SolrService.instance.conn.query("#{SOLR_DOCUMENT_ID}:#{escaped_id}", args)
155
+ SolrService.query("#{SOLR_DOCUMENT_ID}:#{escaped_id}", args)
171
156
  end
172
157
  end
173
158
 
@@ -218,20 +203,20 @@ module ActiveFedora
218
203
 
219
204
  #set default sort to created date ascending
220
205
  unless query_opts.include?(:sort)
221
- query_opts.merge!({:sort=>[ActiveFedora::SolrService.solr_name(:system_create,:date)=>:ascending]})
206
+ query_opts.merge!({:sort=>[ActiveFedora::SolrService.solr_name(:system_create,:date)+' asc']})
222
207
  else
223
208
  #need to convert to solr names for all fields
224
209
  sort_array =[]
225
210
 
226
211
  opts[:sort].collect do |sort|
227
- sort_direction = :ascending
212
+ sort_direction = 'ascending'
228
213
  if sort.respond_to?(:keys)
229
214
  key = sort.keys[0]
230
215
  sort_direction = sort[key]
231
- sort_direction =~ /^desc/ ? sort_direction = :descending : :ascending
232
216
  else
233
217
  key = sort.to_s
234
218
  end
219
+ sort_direction = sort_direction =~ /^desc/ ? 'desc' : 'asc'
235
220
  field_name = key
236
221
 
237
222
  if key.to_s =~ /^system_create/
@@ -246,14 +231,14 @@ module ActiveFedora
246
231
  if class_fields.include?(field_name.to_sym)
247
232
  solr_name = ActiveFedora::SolrService.solr_name(key,class_fields[field_name.to_sym][:type])
248
233
  end
249
- sort_array.push({solr_name=>sort_direction})
234
+ sort_array.push("#{solr_name} #{sort_direction}")
250
235
  end
251
236
 
252
- query_opts[:sort] = sort_array
237
+ query_opts[:sort] = sort_array.join(",")
253
238
  end
254
239
 
255
240
  logger.debug "Querying solr for #{self.name} objects with query: '#{query}'"
256
- results = ActiveFedora::SolrService.instance.conn.query(query,query_opts)
241
+ SolrService.query(query, query_opts)
257
242
  end
258
243
 
259
244
  def class_fields
@@ -275,6 +260,22 @@ module ActiveFedora
275
260
  instance_variable_get("@#{name}")
276
261
  end
277
262
 
263
+ private
264
+ # Retrieve the Fedora object with te given pid, explore the returned object, determine its model
265
+ # using #{known_models_for} and cast to that class.
266
+ # @param [String] pid of the object to load
267
+ #
268
+ # @example because the object hydra:dataset1 asserts it is a Dataset (hasModel info:fedora/afmodel:Dataset), return a Dataset object (not a Book).
269
+ # Book.find_document("hydra:dataset1")
270
+ def find_one(pid)
271
+ af_base = self.allocate.init_with(DigitalObject.find(self, pid))
272
+ the_model = ActiveFedora::ContentModel.known_models_for( af_base ).first
273
+ if af_base.class != the_model
274
+ return af_base.adapt_to(the_model)
275
+ end
276
+ af_base
277
+ end
278
+
278
279
  end
279
280
  def create_property_getter(property) # :nodoc:
280
281
 
@@ -295,12 +296,12 @@ module ActiveFedora
295
296
 
296
297
  private
297
298
 
298
- def self.class_exists?(class_name)
299
- klass = class_name.constantize
300
- return klass.is_a?(Class)
301
- rescue NameError
302
- return false
303
- end
299
+ def self.class_exists?(class_name)
300
+ klass = class_name.constantize
301
+ return klass.is_a?(Class)
302
+ rescue NameError
303
+ return false
304
+ end
304
305
 
305
306
  end
306
307
  end
@@ -340,7 +340,7 @@ module ActiveFedora
340
340
  # => {"person_0_role_text"=>{"0"=>"role1", "1"=>"role2", "2"=>"role3"}, "person_1_role_text"=>{"0"=>"otherrole1", "1"=>"otherrole2"}}
341
341
  def update_values(params={})
342
342
  if @internal_solr_doc
343
- raise "No update performed, this object was initialized via Solr instead of Fedora and is therefore read-only. Please utilize ActiveFedora::Base.load_instance to first load object via Fedora instead."
343
+ raise "No update performed, this object was initialized via Solr instead of Fedora and is therefore read-only. Please utilize ActiveFedora::Base.find to first load object via Fedora instead."
344
344
  else
345
345
  result = om_update_values(params)
346
346
  self.dirty= true
@@ -59,18 +59,12 @@ module ActiveFedora
59
59
  raise ObjectNotFoundError, "Unable to find #{pid} in the repository"
60
60
  end
61
61
  if ENABLE_SOLR_UPDATES
62
- ActiveFedora::SolrService.instance.conn.delete(pid)
63
- # if defined?( Solrizer::Solrizer )
64
- # solrizer = Solrizer::Solrizer.new
65
- # solrizer.solrize_delete(pid)
66
- # end
62
+ solr = ActiveFedora::SolrService.instance.conn
63
+ solr.delete_by_id(pid)
64
+ solr.commit
67
65
  end
68
66
  end
69
67
 
70
-
71
-
72
- private
73
-
74
68
  # Updates Solr index with self.
75
69
  def update_index
76
70
  if defined?( Solrizer::Fedora::Solrizer )
@@ -78,11 +72,15 @@ module ActiveFedora
78
72
  solrizer = Solrizer::Fedora::Solrizer.new
79
73
  solrizer.solrize( self )
80
74
  else
81
- #logger.info("Trying to update solr for pid: #{pid}")
82
- SolrService.instance.conn.update(self.to_solr)
75
+ SolrService.instance.conn.add(self.to_solr)
76
+ SolrService.instance.conn.commit
83
77
  end
84
78
  end
85
79
 
80
+
81
+ private
82
+
83
+
86
84
  # Deals with preparing new object to be saved to Fedora, then pushes it and its datastreams into Fedora.
87
85
  def create
88
86
  assign_pid
@@ -28,8 +28,8 @@ module ActiveFedora
28
28
  vocabularies[xmlns][rel_predicate]
29
29
  end
30
30
 
31
- def self.vocabularies
32
- @vocabularies ||= {}
31
+ def self.vocabularies(vocabs = {})
32
+ @vocabularies ||= vocabs
33
33
  predicate_mappings.keys.each do |ns|
34
34
  @vocabularies[ns] = RDF::Vocabulary.new(ns) unless @vocabularies.has_key? ns
35
35
  end
@@ -5,9 +5,22 @@ module ActiveFedora
5
5
  module ModelMethods
6
6
  extend ActiveSupport::Concern
7
7
  module ClassMethods
8
+ attr_accessor :vocabularies
8
9
  def config
9
10
  ActiveFedora::Predicates.predicate_config
10
11
  end
12
+ def register_vocabularies(*vocabs)
13
+ @vocabularies = {}
14
+ vocabs.each do |v|
15
+ if v.respond_to? :property and v.respond_to? :to_uri
16
+ @vocabularies[v.to_uri] = v
17
+ else
18
+ raise "not an RDF vocabulary: #{v}"
19
+ end
20
+ end
21
+ ActiveFedora::Predicates.vocabularies(vocabularies)
22
+ @vocabularies
23
+ end
11
24
  def map_predicates(&block)
12
25
  yield self
13
26
  end
@@ -16,19 +29,23 @@ module ActiveFedora
16
29
  raise "mapping must specify RDF vocabulary as :in argument" unless args.has_key? :in
17
30
  vocab = args[:in]
18
31
  predicate = args.fetch(:to, name)
32
+ data_type = args.fetch(:type, :string)
19
33
  raise "Vocabulary '#{vocab.inspect}' does not define property '#{predicate.inspect}'" unless vocab.respond_to? predicate
20
34
  vocab = vocab.to_s
35
+ # this is needed for AF::Predicates integration
36
+ # stuff data_type in there too for to_solr support
21
37
  if config
22
38
  if config[:predicate_mapping].has_key? vocab
23
39
  config[:predicate_mapping][vocab][name] = predicate
40
+ config[:predicate_mapping][vocab]["#{name}type".to_sym] = data_type
24
41
  else
25
- config[:predicate_mapping][vocab] = { name => predicate }
42
+ config[:predicate_mapping][vocab] = { name => predicate, "#{name}type".to_sym => data_type }
26
43
  end
27
44
  else
28
45
  config = {
29
46
  :default_namespace => vocab,
30
47
  :predicate_mapping => {
31
- vocab => { name => predicate }
48
+ vocab => { name => predicate, "#{name}type".to_sym => data_type }
32
49
  }
33
50
  }
34
51
  end
@@ -85,11 +102,40 @@ module ActiveFedora
85
102
  end
86
103
  end
87
104
 
105
+ # returns a Hash, e.g.: {field => {:values => values, :type => type}, ...}
106
+ def fields
107
+ field_map = {}
108
+ graph.relationships.each do |predicate, values|
109
+ vocab_sym, name = predicate.qname
110
+ vocabs_list = self.class.vocabularies.select { |ns, v| v.__prefix__ == vocab_sym }
111
+ vocab = vocabs_list.first.first.to_s
112
+ mapped_names = self.class.config[:predicate_mapping][vocab].select {|k, v| v.to_s == name.to_s}
113
+ name = mapped_names.first.first.to_s
114
+ type = self.class.config[:predicate_mapping][vocab]["#{name}type".to_sym]
115
+ field_map[name.to_sym] = {:values => values.map {|v| v.to_s}, :type => type}
116
+ end
117
+ field_map
118
+ end
119
+
120
+ def to_solr(solr_doc = Hash.new) # :nodoc:
121
+ fields.each do |field_key, field_info|
122
+ if field_info.has_key?(:values) && !field_info[:values].nil?
123
+ field_symbol = ActiveFedora::SolrService.solr_name(field_key, field_info[:type])
124
+ values = field_info[:values]
125
+ values = [values] unless values.respond_to? :each
126
+ values.each do |val|
127
+ ::Solrizer::Extractor.insert_solr_field_value(solr_doc, field_symbol, val)
128
+ end
129
+ end
130
+ end
131
+ solr_doc
132
+ end
133
+
88
134
  # @param [Symbol, RDF::URI] predicate the predicate to insert into the graph
89
135
  def find_predicate(predicate)
90
136
  predicate = predicate.to_sym unless predicate.kind_of? RDF::URI
91
137
  result = ActiveFedora::Predicates.find_predicate(predicate)
92
- return RDF::URI(result.reverse.to_s)
138
+ RDF::URI(result.reverse.to_s)
93
139
  end
94
140
 
95
141
  def graph
@@ -109,10 +155,6 @@ module ActiveFedora
109
155
  TermProxy.new(graph, predicate, values)
110
156
  end
111
157
 
112
- def to_solr
113
- # TODO
114
- end
115
-
116
158
  # if there are any existing statements with this predicate, replace them
117
159
  # @param [Symbol, RDF::URI] predicate the predicate to insert into the graph
118
160
  def set_value(predicate, args)