cul_scv_hydra 0.3.0 → 0.4.0

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/config/fedora.yml CHANGED
@@ -1,6 +1,12 @@
1
1
  development:
2
- url: http://fedoraAdmin:fedoraAdmin@127.0.0.1:8983/fedora
2
+ :url: http://127.0.0.1:8983/fedora
3
+ :user: fedoraAdmin
4
+ :password: fedoraAdmin
3
5
  test:
4
- url: http://fedoraAdmin:fedoraAdmin@127.0.0.1:8983/fedora
6
+ :url: http://127.0.0.1:8983/fedora
7
+ :user: fedoraAdmin
8
+ :password: fedoraAdmin
5
9
  default:
6
- url: http://fedoraAdmin:fedoraAdmin@127.0.0.1:8983/fedora
10
+ :url: http://127.0.0.1:8983/fedora
11
+ :user: fedoraAdmin
12
+ :password: fedoraAdmin
data/config/solr.yml CHANGED
@@ -1,15 +1,6 @@
1
1
  development:
2
- default:
3
- url: http://127.0.0.1:8983/solr/development
4
- full_text:
5
- url: http://127.0.0.1:8983/solr/development
2
+ url: http://127.0.0.1:8983/solr/development
6
3
  test:
7
- default:
8
- url: http://127.0.0.1:8983/solr/test
9
- full_text:
10
- url: http://127.0.0.1:8983/solr/test
4
+ url: http://127.0.0.1:8983/solr/test
11
5
  default:
12
- default:
13
- url: http://127.0.0.1:8983/solr/test
14
- full_text:
15
- url: http://127.0.0.1:8983/solr/test
6
+ url: http://127.0.0.1:8983/solr/test
@@ -6,40 +6,39 @@ module Aggregator
6
6
  has_relationship "parts", :cul_member_of, :inbound => true
7
7
  after_create :aggregator!
8
8
  end
9
- module InstanceMethods
10
- def aggregator!
11
- add_relationship(:rdf_type, Cul::Scv::Hydra::ActiveFedora::AGGREGATOR_TYPE.to_s)
12
- @metadata_is_dirty = true
13
- update
14
- end
15
9
 
16
- def add_member(member, container=self)
17
- if container.respond_to?:internal_uri
18
- container = container.internal_uri
19
- end
20
- if container =~ /\A[\w\-]+:[\w\-]+\Z/
21
- container = "info:fedora/#{container}"
22
- end
23
- member.add_relationship(:cul_member_of, container)
24
- member.datastreams["RELS-EXT"].dirty = true
25
- member.save
10
+ def aggregator!
11
+ add_relationship(:rdf_type, Cul::Scv::Hydra::ActiveFedora::AGGREGATOR_TYPE.to_s)
12
+ @metadata_is_dirty = true
13
+ update
14
+ end
15
+
16
+ def add_member(member, container=self)
17
+ if container.respond_to?:internal_uri
18
+ container = container.internal_uri
26
19
  end
20
+ if container =~ /\A[\w\-]+:[\w\-]+\Z/
21
+ container = "info:fedora/#{container}"
22
+ end
23
+ member.add_relationship(:cul_member_of, container)
24
+ member.datastreams["RELS-EXT"].dirty = true
25
+ member.save
26
+ end
27
27
 
28
- def remove_member(member, container=self)
29
- if container.respond_to?:internal_uri
30
- container = container.internal_uri
31
- end
32
- if container =~ /\A[\w\-]+:[\w\-]+\Z/
33
- container = "info:fedora/#{container}"
34
- end
35
- rel = ActiveFedora::Relationship.new()
36
- rel.subject_pid= :self
37
- rel.object = container
38
- rel.predicate = :cul_member_of
39
- member.remove_relationship(rel)
40
- member.datastreams["RELS-EXT"].dirty = true
41
- member.save
28
+ def remove_member(member, container=self)
29
+ if container.respond_to?:internal_uri
30
+ container = container.internal_uri
31
+ end
32
+ if container =~ /\A[\w\-]+:[\w\-]+\Z/
33
+ container = "info:fedora/#{container}"
42
34
  end
35
+ rel = ActiveFedora::Relationship.new()
36
+ rel.subject_pid= :self
37
+ rel.object = container
38
+ rel.predicate = :cul_member_of
39
+ member.remove_relationship(rel)
40
+ member.datastreams["RELS-EXT"].dirty = true
41
+ member.save
43
42
  end
44
43
  end
45
44
  end
@@ -1,42 +1,41 @@
1
1
  require "active-fedora"
2
2
  require 'uri'
3
3
  module Cul::Scv::Hydra::ActiveFedora::Model
4
- module Common
5
- extend ActiveSupport::Concern
4
+ module Common
5
+ extend ActiveSupport::Concern
6
6
 
7
- included do
8
- define_model_callbacks :create
7
+ included do
8
+ define_model_callbacks :create
9
9
 
10
- has_relationship "containers", :cul_member_of
11
- has_relationship "rdf_type", :rdf_type
12
- has_metadata :name => "DC", :type=>Cul::Scv::Hydra::Om::DCMetadata, :versionable => true
13
- has_metadata :name => "descMetadata", :type=>Cul::Scv::Hydra::Om::ModsDocument, :versionable => true
14
- has_metadata :name => "rightsMetadata", :type=>::Hydra::RightsMetadata, :versionable => true
15
- end
10
+ has_relationship "containers", :cul_member_of
11
+ has_relationship "rdf_type", :rdf_type
12
+ has_metadata :name => "DC", :type=>Cul::Scv::Hydra::Om::DCMetadata, :versionable => true
13
+ has_metadata :name => "descMetadata", :type=>Cul::Scv::Hydra::Om::ModsDocument, :versionable => true
14
+ has_metadata :name => "rightsMetadata", :type=>::Hydra::RightsMetadata, :versionable => true
15
+ end
16
16
 
17
- module ClassMethods
18
- def pid_namespace
19
- "ldpd"
20
- end
21
- end
17
+ module ClassMethods
18
+ def pid_namespace
19
+ "ldpd"
20
+ end
21
+ end
22
22
 
23
- module InstanceMethods
24
- def initialize(attrs = nil)
25
- attrs = {} if attrs.nil?
26
- attrs[:namespace] = self.class.pid_namespace unless attrs[:namespace]
27
- super
28
- end
23
+ def initialize(attrs = nil)
24
+ attrs = {} if attrs.nil?
25
+ attrs[:namespace] = self.class.pid_namespace unless attrs[:namespace]
26
+ super
27
+ end
29
28
 
30
- def create
31
- run_callbacks :create do
32
- super
33
- end
34
- end
29
+ def create
30
+ run_callbacks :create do
31
+ super
32
+ end
33
+ end
35
34
 
36
- def resources(opts={})
37
- if self.respond_to? :parts # aggregator
38
- opts = {:rows=>25,:response_format=>:solr}.merge(opts)
39
- self.parts(opts)
35
+ def resources(opts={})
36
+ if self.respond_to? :parts # aggregator
37
+ opts = {:rows=>25,:response_format=>:solr}.merge(opts)
38
+ self.parts(opts)
40
39
  #opts = {:rows=>25,:response_format=>:solr}.merge(opts)
41
40
  #query = self.class.inbound_relationship_query(self.pid, "parts")
42
41
  #solr_result = ::ActiveFedora::SolrService.instance.conn.query(query, :rows=>opts[:rows])
@@ -55,167 +54,166 @@ module Cul::Scv::Hydra::ActiveFedora::Model
55
54
  # return ::ActiveFedora::SolrService.reify_solr_results(solr_result)
56
55
  # end
57
56
  #end
58
- else
59
- logger.warn "parts not defined; was this an Aggregator?"
60
- []
61
- end
62
- end
57
+ else
58
+ logger.warn "parts not defined; was this an Aggregator?"
59
+ []
60
+ end
61
+ end
63
62
 
64
- def members(opts={})
65
- resources(opts)
66
- end
67
-
68
- def members_ids(opts={})
69
- opts = opts.merge({:response_format=>:id_array})
70
- resources(opts)
71
- end
72
-
63
+ def members(opts={})
64
+ resources(opts)
65
+ end
66
+
67
+ def members_ids(opts={})
68
+ opts = opts.merge({:response_format=>:id_array})
69
+ resources(opts)
70
+ end
71
+
73
72
 
74
- def cmodel_pid(klass)
75
- klass.pid_namespace + ":" + klass.name.split("::")[-1]
76
- end
73
+ def cmodel_pid(klass)
74
+ klass.pid_namespace + ":" + klass.name.split("::")[-1]
75
+ end
77
76
 
78
- def datastreams_in_fedora
79
- mds = {}
80
- self.datastreams_xml['datastream'].each do |ds|
81
- dsid = ds["dsid"]
82
- ds.merge!({:pid => self.pid, :dsID => dsid, :dsLabel => ds["label"]})
83
- if dsid == "RELS-EXT"
84
- mds.merge!({dsid => ActiveFedora::RelsExtDatastream.new(ds)})
85
- else
86
- if self.class.ds_specs.has_key? dsid
87
- mds.merge!({dsid => self.class.ds_specs[dsid][0].new(ds)})
88
- else
89
- mds.merge!({dsid => ActiveFedora::Datastream.new(ds)})
90
- end
91
- end
92
- mds[dsid].new_object = false
77
+ def datastreams_in_fedora
78
+ mds = {}
79
+ self.datastreams_xml['datastream'].each do |ds|
80
+ dsid = ds["dsid"]
81
+ ds.merge!({:pid => self.pid, :dsID => dsid, :dsLabel => ds["label"]})
82
+ if dsid == "RELS-EXT"
83
+ mds.merge!({dsid => ActiveFedora::RelsExtDatastream.new(ds)})
84
+ else
85
+ if self.class.ds_specs.has_key? dsid
86
+ mds.merge!({dsid => self.class.ds_specs[dsid][0].new(ds)})
87
+ else
88
+ mds.merge!({dsid => ActiveFedora::Datastream.new(ds)})
93
89
  end
94
- mds
95
90
  end
91
+ mds[dsid].new_object = false
96
92
  end
93
+ mds
94
+ end
95
+
96
+ def route_as
97
+ "default"
98
+ end
97
99
 
98
- def route_as
99
- "default"
100
+ def index_type_label
101
+ riquery = Cul::Scv::Hydra::ActiveFedora::MEMBER_QUERY.gsub(/%PID%/, self.pid)
102
+ begin
103
+ docs = ::ActiveFedora::RubydoraConnection.instance.connection.find_by_sparql riquery
104
+ rescue
105
+ docs = self.parts
100
106
  end
101
-
102
- def index_type_label
103
- riquery = Cul::Scv::Hydra::ActiveFedora::MEMBER_QUERY.gsub(/%PID%/, self.pid)
104
- begin
105
- docs = ::ActiveFedora::RubydoraConnection.instance.connection.find_by_sparql riquery
106
- rescue
107
- docs = self.parts
108
- end
109
- if docs.length == 0
110
- label = "EMPTY"
111
- elsif docs.length == 1
112
- label = "SINGLE PART"
113
- else
114
- label = "MULTIPART"
115
- end
116
- label
107
+ if docs.length == 0
108
+ label = "EMPTY"
109
+ elsif docs.length == 1
110
+ label = "SINGLE PART"
111
+ else
112
+ label = "MULTIPART"
117
113
  end
118
-
119
- def has_desc?
114
+ label
115
+ end
116
+
117
+ def has_desc?
118
+ has_desc = false
119
+ begin
120
+ has_desc = self.datastreams.include? "descMetadata"
121
+ has_desc = has_desc and self.inner_object.datastreams["descMetadata"].content.length > 0
122
+ has_desc = self.datastreams["descMetadata"].term_values(:identifier).length > 0
123
+ rescue
120
124
  has_desc = false
121
- begin
122
- has_desc = self.datastreams.include? "descMetadata"
123
- has_desc = has_desc and self.inner_object.datastreams["descMetadata"].content.length > 0
124
- has_desc = self.datastreams["descMetadata"].term_values(:identifier).length > 0
125
- rescue
126
- has_desc = false
127
- end
128
- has_desc
129
125
  end
130
-
131
- def to_solr(solr_doc = Hash.new, opts={})
132
- super
133
- if has_desc?
134
- solr_doc["descriptor_s"] = ["mods"]
126
+ has_desc
127
+ end
128
+
129
+ def to_solr(solr_doc = Hash.new, opts={})
130
+ super
131
+ if has_desc?
132
+ solr_doc["descriptor_s"] = ["mods"]
133
+ else
134
+ solr_doc["descriptor_s"] = ["dublin core"]
135
+ end
136
+ # if no mods, pull some values from DC
137
+ if not (solr_doc["title_display"] and solr_doc["title_display"].length > 0)
138
+ if self.dc.term_values(:title).first
139
+ solr_doc["title_display"] = [self.dc.term_values(:title).first]
135
140
  else
136
- solr_doc["descriptor_s"] = ["dublin core"]
141
+ solr_doc["title_display"] = [self.dc.term_values(:identifier).first]
137
142
  end
138
- # if no mods, pull some values from DC
139
- if not (solr_doc["title_display"] and solr_doc["title_display"].length > 0)
140
- if self.dc.term_values(:title).first
141
- solr_doc["title_display"] = [self.dc.term_values(:title).first]
142
- else
143
- solr_doc["title_display"] = [self.dc.term_values(:identifier).first]
144
- end
145
- if self.dc.term_values(:relation).first
146
- self.dc.term_values(:relation).each {|val|
147
- if val =~ /clio:/
148
- solr_doc["clio_s"] ||= []
149
- solr_doc["clio_s"] << val.split(':')[-1]
150
- end
151
- }
152
- end
143
+ if self.dc.term_values(:relation).first
144
+ self.dc.term_values(:relation).each {|val|
145
+ if val =~ /clio:/
146
+ solr_doc["clio_s"] ||= []
147
+ solr_doc["clio_s"] << val.split(':')[-1]
148
+ end
149
+ }
153
150
  end
154
- solr_doc["format"] = [self.route_as]
155
- solr_doc["index_type_label_s"] = [self.index_type_label]
156
- solr_doc
157
151
  end
152
+ solr_doc["format"] = [self.route_as]
153
+ solr_doc["index_type_label_s"] = [self.index_type_label]
154
+ solr_doc
155
+ end
158
156
 
159
- def update_datastream_attributes(params={}, opts={})
160
- logger.debug "Common.update_datastream_attributes"
161
- result = params.dup
162
- params.each_pair do |dsid, ds_params|
163
- if datastreams.include?(dsid)
164
- verify_params = ds_params.dup
165
- current_indexed_attributes = {}
166
- changed = false
167
- verify_params.each { |pointer, values|
168
- changed ||= value_changed?(datastreams[dsid],pointer,values)
169
- }
170
- if changed
171
- logger.debug "Common.update_datastream_attributes calling update_indexed_attributes"
172
- result[dsid] = datastreams[dsid].update_indexed_attributes(ds_params)
173
- else
174
- result[dsid] = no_update(ds_params)
175
- end
176
- logger.debug "change detected? #{changed} digital_object? #{datastreams[dsid].changed?}"
157
+ def update_datastream_attributes(params={}, opts={})
158
+ logger.debug "Common.update_datastream_attributes"
159
+ result = params.dup
160
+ params.each_pair do |dsid, ds_params|
161
+ if datastreams.include?(dsid)
162
+ verify_params = ds_params.dup
163
+ current_indexed_attributes = {}
164
+ changed = false
165
+ verify_params.each { |pointer, values|
166
+ changed ||= value_changed?(datastreams[dsid],pointer,values)
167
+ }
168
+ if changed
169
+ logger.debug "Common.update_datastream_attributes calling update_indexed_attributes"
170
+ result[dsid] = datastreams[dsid].update_indexed_attributes(ds_params)
177
171
  else
178
- result.delete(dsid)
172
+ result[dsid] = no_update(ds_params)
179
173
  end
174
+ logger.debug "change detected? #{changed} digital_object? #{datastreams[dsid].changed?}"
175
+ else
176
+ result.delete(dsid)
180
177
  end
181
- return result
182
178
  end
183
-
184
- private
185
- def value_changed?(ds,pointer,values)
179
+ return result
180
+ end
181
+
182
+ private
183
+ def value_changed?(ds,pointer,values)
184
+ if values.is_a? Hash
185
+ values = values.dup
186
+ else
187
+ values = {"0"=>values}
188
+ end
189
+ logger.debug "submitted values for #{pointer.inspect} : #{values.inspect}"
190
+ return true if values["-1"]
191
+ changed = false
192
+ old_values = ds.get_values(pointer)
193
+ indexed_values = {}
194
+ old_values.each_index {|ix| indexed_values[ix.to_s] = old_values[ix] }
195
+ indexed_values.each {|k,v|
196
+ new_val = values.delete(k)
197
+ puts "old: #{v} new: #{new_val} changed? #{!(v.eql? new_val)}"
198
+ logger.debug "old: #{v} new: #{new_val} changed? #{!(v.eql? new_val)}"
199
+ changed ||= !(v.eql? new_val)
200
+ }
201
+ puts "remaining values! #{values.inspect}" if values.length > 0
202
+ changed || (values.length > 0)
203
+ end
204
+
205
+ def no_update(ds_params)
206
+ response = {}
207
+ ds_params.each{|pointer, values|
208
+ returned = []
186
209
  if values.is_a? Hash
187
- values = values.dup
210
+ keys = values.keys.sort {|x,y| x.to_i <=> y.to_i}
211
+ keys.each {|key| returned << values[key]}
188
212
  else
189
- values = {"0"=>values}
213
+ returned << values
190
214
  end
191
- logger.debug "submitted values for #{pointer.inspect} : #{values.inspect}"
192
- return true if values["-1"]
193
- changed = false
194
- old_values = ds.get_values(pointer)
195
- indexed_values = {}
196
- old_values.each_index {|ix| indexed_values[ix.to_s] = old_values[ix] }
197
- indexed_values.each {|k,v|
198
- new_val = values.delete(k)
199
- puts "old: #{v} new: #{new_val} changed? #{!(v.eql? new_val)}"
200
- logger.debug "old: #{v} new: #{new_val} changed? #{!(v.eql? new_val)}"
201
- changed ||= !(v.eql? new_val)
202
- }
203
- puts "remaining values! #{values.inspect}" if values.length > 0
204
- changed || (values.length > 0)
205
- end
206
-
207
- def no_update(ds_params)
208
- response = {}
209
- ds_params.each{|pointer, values|
210
- returned = []
211
- if values.is_a? Hash
212
- keys = values.keys.sort {|x,y| x.to_i <=> y.to_i}
213
- keys.each {|key| returned << values[key]}
214
- else
215
- returned << values
216
- end
217
- response[OM::XML::Terminology.term_hierarchical_name(pointer)] = returned
218
- }
219
- end
215
+ response[OM::XML::Terminology.term_hierarchical_name(pointer)] = returned
216
+ }
220
217
  end
221
- end
218
+ end
219
+ end
@@ -25,55 +25,54 @@ module Resource
25
25
  has_datastream :name => "CONTENT", :type=>::ActiveFedora::Datastream, :versionable => true
26
26
  end
27
27
  end
28
- module InstanceMethods
29
- def resource!
30
- add_relationship(:rdf_type, Cul::Scv::Hydra::ActiveFedora::RESOURCE_TYPE.to_s)
31
- @metadata_is_dirty = true
32
- update
33
- end
34
28
 
35
- def add_content_blob(blob, opts)
36
- file_name = opts[:file_name]
37
- mime = opts[:mime_type].nil? ? mime_type(file_name) : opts[:mime_type]
38
- add_file_datastream(blob, :label=>file_name, :mimeType=>mime, :dsid => 'CONTENT')
39
- set_title_and_label( file_name, :only_if_blank=>true )
40
- if IMAGE_MIME_TYPES.include? mime
41
- blob.rewind
42
- # retrieve Nokogiri of image property RDF
43
- image_prop_nodes = Cul::Image::Properties.identify(blob).nodeset
44
- relsext = datastreams['RELS-EXT']
45
- image_prop_nodes.each { |node|
46
- if node["resource"]
47
- is_literal = false
48
- object = RDF::URI.new(node["resource"])
49
- else
50
- is_literal = true
51
- object = RDF::Literal(node.text)
52
- end
53
- subject = RDF::URI(internal_uri)
54
- predicate = RDF::URI("#{node.namespace.href}#{node.name}")
55
- query = RDF::Query.new({ :subject => {predicate => :object}})
56
- relationships(predicate).dup.each { |stmt|
57
- relationships.delete(stmt)
58
- }
59
- add_relationship(predicate,object, is_literal)
60
- relationships_are_dirty=true
61
- }
62
- # add mimetype to DC:format values
63
- self.datastreams['DC'].update_values({[:format] => mime})
64
- end
29
+ def resource!
30
+ add_relationship(:rdf_type, Cul::Scv::Hydra::ActiveFedora::RESOURCE_TYPE.to_s)
31
+ @metadata_is_dirty = true
32
+ update
33
+ end
34
+
35
+ def add_content_blob(blob, opts)
36
+ file_name = opts[:file_name]
37
+ mime = opts[:mime_type].nil? ? mime_type(file_name) : opts[:mime_type]
38
+ add_file_datastream(blob, :label=>file_name, :mimeType=>mime, :dsid => 'CONTENT')
39
+ set_title_and_label( file_name, :only_if_blank=>true )
40
+ if IMAGE_MIME_TYPES.include? mime
65
41
  blob.rewind
42
+ # retrieve Nokogiri of image property RDF
43
+ image_prop_nodes = Cul::Image::Properties.identify(blob).nodeset
44
+ relsext = datastreams['RELS-EXT']
45
+ image_prop_nodes.each { |node|
46
+ if node["resource"]
47
+ is_literal = false
48
+ object = RDF::URI.new(node["resource"])
49
+ else
50
+ is_literal = true
51
+ object = RDF::Literal(node.text)
52
+ end
53
+ subject = RDF::URI(internal_uri)
54
+ predicate = RDF::URI("#{node.namespace.href}#{node.name}")
55
+ query = RDF::Query.new({ :subject => {predicate => :object}})
56
+ relationships(predicate).dup.each { |stmt|
57
+ relationships.delete(stmt)
58
+ }
59
+ add_relationship(predicate,object, is_literal)
60
+ relationships_are_dirty=true
61
+ }
62
+ # add mimetype to DC:format values
63
+ self.datastreams['DC'].update_values({[:format] => mime})
66
64
  end
65
+ blob.rewind
66
+ end
67
67
 
68
- private
68
+ private
69
69
 
70
- # Return the mimeType for a given file name
71
- # @param [String] file_name The filename to use to get the mimeType
72
- # @return [String] mimeType for filename passed in. Default: application/octet-stream if mimeType cannot be determined
73
- def mime_type file_name
74
- mime_types = MIME::Types.of(file_name)
75
- mime_type = mime_types.empty? ? "application/octet-stream" : mime_types.first.content_type
76
- end
70
+ # Return the mimeType for a given file name
71
+ # @param [String] file_name The filename to use to get the mimeType
72
+ # @return [String] mimeType for filename passed in. Default: application/octet-stream if mimeType cannot be determined
73
+ def mime_type file_name
74
+ mime_types = MIME::Types.of(file_name)
75
+ mime_type = mime_types.empty? ? "application/octet-stream" : mime_types.first.content_type
77
76
  end
78
77
  end
79
78
  end
@@ -22,6 +22,7 @@ module Terms
22
22
  render :action=>params[:action], :layout=>layout
23
23
  end
24
24
 
25
+ # this method should be overridden to use the appropriate terminology
25
26
  def solr_name(term_id)
26
27
  if term_id.nil?
27
28
  raise "Cannot provide suggestions without a term name"
@@ -48,7 +49,6 @@ module Terms
48
49
  solr_params['terms.sort'] = params.fetch(:sort,'count')
49
50
  solr_params['terms.limit'] = -1
50
51
  end
51
- logger.debug solr_params.inspect
52
52
  solr_response = Blacklight.solr.get 'terms', {:params => solr_params}
53
53
  result = []
54
54
  hash = {}
@@ -58,7 +58,6 @@ module Terms
58
58
  result << [_t[jx], _t[jx + 1]]
59
59
  }
60
60
  }
61
- logger.debug result.inspect
62
61
  return result
63
62
  end
64
63
 
@@ -71,19 +70,73 @@ module Terms
71
70
  # end
72
71
  # end
73
72
 
74
- def field_key_from(field_name, terminology)
75
- # this is a hack, but necessary until/unless OM generates names differently
76
- candidates = field_name.split('__')
73
+ def field_key_from(hier_field_name, t)
74
+ candidates = hier_field_name.split('_')
77
75
  field_key = []
78
- candidates.each_with_index { |candidate, ix|
79
- if (candidates[ix + 1] and candidates[ix + 1].match(/\d+/))
80
- field_key << {OM.destringify(candidate) => Integer(candidates.delete_at(ix + 1))}
76
+ candidates.inject(field_key) { |ptrs, term|
77
+ if term =~ /\d+/
78
+ ptr = {ptrs.pop=>term.to_i}
81
79
  else
82
- field_key << OM.destringify(candidate)
80
+ ptr = (ptrs.empty? or ptrs.last.is_a? Hash) ? term.to_sym : (ptrs.pop.to_s + "_" + term).to_sym
83
81
  end
82
+ ptrs.push ptr
84
83
  }
85
- logger.debug field_key.inspect
86
- field_key
84
+ return field_key if t.has_term? *field_key
85
+ # pointers are probably from ambiguous underscores
86
+ amb = field_key.dup
87
+ field_key = []
88
+ amb.each do |candidate|
89
+ key = (candidate.is_a? Hash) ? candidate.keys.first : candidate # no indexes should be included
90
+ parts = key.to_s.split('_')
91
+ ptrs = parts_to_terms(parts, t, field_key)
92
+ if ptrs.nil? or !t.has_term? *ptrs
93
+ raise "Couldn't generate pointer from term name going forward for \"" + hier_field_name + "\" (no matched term sequence)"
94
+ else
95
+ if candidate.is_a? Hash
96
+ ptr_key = ptrs.pop
97
+ ptrs.push({ptr_key => candidate[candidate.keys.first] })
98
+ end
99
+ field_key = ptrs
100
+ end
101
+ end
102
+ return field_key if t.has_term? *field_key
103
+ raise "Couldn't generate pointer from term name going forward for \"" + hier_field_name + "\", tried " + field_key.inspect
104
+ end
105
+
106
+ def parts_to_terms(parts, t, prefix=[])
107
+ return nil if parts.length == 0 # this should be short-circuited in the loop below rather than recurring
108
+ if parts.length == 1
109
+ new_term_ptr = prefix.dup.push parts[0].to_sym
110
+ if t.has_term? *new_term_ptr
111
+ return new_term_ptr
112
+ else
113
+ return nil
114
+ end
115
+ end
116
+
117
+ results = []
118
+ parts.each_index do |ix|
119
+ term_ptr = prefix.dup.push parts[0...(parts.length - ix)].join('_').to_sym
120
+
121
+ if t.has_term? *term_ptr
122
+ case ix
123
+ when 0
124
+ results.push term_ptr
125
+ when 1
126
+ new_term_ptr = term_ptr.concat [parts.last.to_sym]
127
+ results.push new_term_ptr if t.has_term? *new_term_ptr
128
+ else
129
+ new_term_ptr = parts_to_terms(parts[parts.length - ix, ix], t, term_ptr)
130
+ results.push new_term_ptr if !new_term_ptr.nil?
131
+ end
132
+ end
133
+ end
134
+
135
+ if results.length == 1
136
+ return results[0]
137
+ else
138
+ return nil
139
+ end
87
140
  end
88
141
 
89
142
  # ** largely copied from ActiveFedora::NokogiriDatastream.get_values **
@@ -17,7 +17,7 @@ module Om
17
17
  :schema=>"http://www.loc.gov/standards/mods/v3/mods-3-4.xsd")
18
18
 
19
19
  t.main_title_info(:path=>'titleInfo', :index_as=>[:not_searchable], :attributes=>{:type=>:none}){
20
- t.main_title(:path=>"title", :index_as=>[:displayable,:searchable])
20
+ t.main_title(:path=>"title", :index_as=>[:displayable,:searchable, :sortable])
21
21
  }
22
22
 
23
23
  t.search_title_info(:path=>'titleInfo', :index_as=>[:not_searchable]){
@@ -1,10 +1,10 @@
1
1
  module Cul
2
2
  module Scv
3
3
  module Hydra
4
- VERSION = '0.3.0'
4
+ VERSION = '0.4.0'
5
5
  def self.version
6
6
  VERSION
7
7
  end
8
8
  end
9
9
  end
10
- end
10
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cul_scv_hydra
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 15
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 3
8
+ - 4
9
9
  - 0
10
- version: 0.3.0
10
+ version: 0.4.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Benjamin Armintor
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-04-23 00:00:00 Z
18
+ date: 2012-05-08 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: cul_image_props
@@ -39,11 +39,12 @@ dependencies:
39
39
  requirements:
40
40
  - - ~>
41
41
  - !ruby/object:Gem::Version
42
- hash: 5
42
+ hash: 21
43
43
  segments:
44
44
  - 3
45
+ - 4
45
46
  - 1
46
- version: "3.1"
47
+ version: 3.4.1
47
48
  type: :runtime
48
49
  version_requirements: *id002
49
50
  - !ruby/object:Gem::Dependency
@@ -54,11 +55,11 @@ dependencies:
54
55
  requirements:
55
56
  - - ~>
56
57
  - !ruby/object:Gem::Version
57
- hash: 7
58
+ hash: 3
58
59
  segments:
59
60
  - 3
60
- - 0
61
- version: "3.0"
61
+ - 2
62
+ version: "3.2"
62
63
  type: :runtime
63
64
  version_requirements: *id003
64
65
  - !ruby/object:Gem::Dependency
@@ -69,42 +70,42 @@ dependencies:
69
70
  requirements:
70
71
  - - ~>
71
72
  - !ruby/object:Gem::Version
72
- hash: 1
73
+ hash: 27
73
74
  segments:
74
- - 3
75
- - 3
76
- version: "3.3"
75
+ - 4
76
+ - 0
77
+ version: "4.0"
77
78
  type: :runtime
78
79
  version_requirements: *id004
79
80
  - !ruby/object:Gem::Dependency
80
- name: hydra-head
81
+ name: rubydora
81
82
  prerelease: false
82
83
  requirement: &id005 !ruby/object:Gem::Requirement
83
84
  none: false
84
85
  requirements:
85
86
  - - ~>
86
87
  - !ruby/object:Gem::Version
87
- hash: 1
88
+ hash: 27
88
89
  segments:
89
- - 3
90
- - 3
91
- version: "3.3"
90
+ - 0
91
+ - 5
92
+ - 8
93
+ version: 0.5.8
92
94
  type: :runtime
93
95
  version_requirements: *id005
94
96
  - !ruby/object:Gem::Dependency
95
- name: rubydora
97
+ name: hydra-head
96
98
  prerelease: false
97
99
  requirement: &id006 !ruby/object:Gem::Requirement
98
100
  none: false
99
101
  requirements:
100
- - - ">="
102
+ - - ~>
101
103
  - !ruby/object:Gem::Version
102
104
  hash: 27
103
105
  segments:
106
+ - 4
104
107
  - 0
105
- - 2
106
- - 6
107
- version: 0.2.6
108
+ version: "4.0"
108
109
  type: :runtime
109
110
  version_requirements: *id006
110
111
  - !ruby/object:Gem::Dependency
@@ -129,14 +130,14 @@ dependencies:
129
130
  requirement: &id008 !ruby/object:Gem::Requirement
130
131
  none: false
131
132
  requirements:
132
- - - ">="
133
+ - - ~>
133
134
  - !ruby/object:Gem::Version
134
- hash: 23
135
+ hash: 15
135
136
  segments:
136
137
  - 1
137
- - 2
138
- - 4
139
- version: 1.2.4
138
+ - 6
139
+ - 0
140
+ version: 1.6.0
140
141
  type: :runtime
141
142
  version_requirements: *id008
142
143
  - !ruby/object:Gem::Dependency
@@ -145,14 +146,14 @@ dependencies:
145
146
  requirement: &id009 !ruby/object:Gem::Requirement
146
147
  none: false
147
148
  requirements:
148
- - - ">="
149
+ - - ~>
149
150
  - !ruby/object:Gem::Version
150
- hash: 23
151
+ hash: 31
151
152
  segments:
152
153
  - 1
153
- - 1
154
154
  - 2
155
- version: 1.1.2
155
+ - 0
156
+ version: 1.2.0
156
157
  type: :runtime
157
158
  version_requirements: *id009
158
159
  - !ruby/object:Gem::Dependency
@@ -163,12 +164,12 @@ dependencies:
163
164
  requirements:
164
165
  - - ~>
165
166
  - !ruby/object:Gem::Version
166
- hash: 47
167
+ hash: 39
167
168
  segments:
168
169
  - 2
169
- - 8
170
+ - 10
170
171
  - 0
171
- version: 2.8.0
172
+ version: 2.10.0
172
173
  type: :development
173
174
  version_requirements: *id010
174
175
  - !ruby/object:Gem::Dependency
@@ -179,12 +180,12 @@ dependencies:
179
180
  requirements:
180
181
  - - ~>
181
182
  - !ruby/object:Gem::Version
182
- hash: 45
183
+ hash: 39
183
184
  segments:
184
185
  - 2
185
- - 8
186
- - 1
187
- version: 2.8.1
186
+ - 10
187
+ - 0
188
+ version: 2.10.0
188
189
  type: :development
189
190
  version_requirements: *id011
190
191
  - !ruby/object:Gem::Dependency