Skip to content

Commit

Permalink
Fix for #1505
Browse files Browse the repository at this point in the history
  • Loading branch information
Julie Allinson committed Apr 16, 2019
1 parent aca1213 commit 2c66d18
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 1 deletion.
2 changes: 1 addition & 1 deletion app/models/concerns/hyrax/basic_metadata.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ module BasicMetadata
property :contributor, predicate: ::RDF::Vocab::DC11.contributor
property :description, predicate: ::RDF::Vocab::DC11.description
property :abstract, predicate: ::RDF::Vocab::DC.abstract
property :keyword, predicate: ::RDF::Vocab::DC11.relation
property :keyword, predicate: ::RDF::Vocab::SCHEMA.keywords
# Used for a license
property :license, predicate: ::RDF::Vocab::DC.rights

Expand Down
33 changes: 33 additions & 0 deletions app/services/hyrax/works/migration_service.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
module Hyrax
module Works
class MigrationService
# @api public
#
# Migrate data stored in FCrepo from one predicate to another
# The main use case is where the predicate used for a specific property is changed.
# Data already stored in Fedora under the original predicate needs to be transfered
# and the original data cleaned up.
def self.migrate_predicate(predicate_from, predicate_to, works_to_update = ActiveFedora::Base.all)
migrated = 0
Rails.logger.info "*** Migrating #{predicate_from} to #{predicate_to} in #{works_to_update.count} works"
works_to_update.each do |work|
next unless work.ldp_source.content.include?(predicate_from.to_s)
migrate_data(predicate_from, predicate_to, work)
migrated += 1
end
Rails.logger.info "--- Migration Complete (#{migrated} migrated)"
end

# @api private
#
# Migrate data
def self.migrate_data(predicate_from, predicate_to, work)
orm = Ldp::Orm.new(work.ldp_source)
orm.value(predicate_from).each { |val| orm.graph.insert([orm.resource.subject_uri, predicate_to, val.to_s]) }
orm.graph.delete([orm.resource.subject_uri, predicate_from, nil])
orm.save
Rails.logger.info " Data migrated from #{predicate_from} to #{predicate_to} - id: #{work.id}"
end
end
end
end
5 changes: 5 additions & 0 deletions lib/tasks/migrate.rake
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,10 @@ namespace :hyrax do
# added in Hyrax 2.1.0
Hyrax::Collections::MigrationService.migrate_all_collections
end

# Migrate any orphan fedora data from the first to the second predicate
task migrate_keyword_predicate: :environment do
Hyrax::Works::MigrationService.migrate_predicate(::RDF::Vocab::DC11.relation, ::RDF::Vocab::SCHEMA.keywords)
end
end
end
21 changes: 21 additions & 0 deletions spec/services/hyrax/works/migration_service_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# rubocop:disable RSpec/InstanceVariable
RSpec.describe Hyrax::Works::MigrationService, clean_repo: true do
let(:predicate_from) { ::RDF::Vocab::DC11.description }
let(:predicate_to) { ::RDF::Vocab::SCHEMA.description }

describe "#migrate_predicate" do
it "uses DC description by default" do
@work = GenericWork.create(title: ["War and Peace"], description: ["war", "peace"])
expect(@work.ldp_source.content).to include("http://purl.org/dc/elements/1.1/description")
end

it "updates to use SCHEMA description" do
@work = GenericWork.create(title: ["War and Peace"], description: ["war", "peace"])
described_class.migrate_predicate(predicate_from, predicate_to)
@work.reload
expect(@work.ldp_source.content).to include("http://schema.org/description")
expect(@work.ldp_source.content).not_to include("http://purl.org/dc/elements/1.1/description")
end
end
end
# rubocop:enable RSpec/InstanceVariable

0 comments on commit 2c66d18

Please sign in to comment.