cul_scv_hydra 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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