valkyrie 0.0.0 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -3
- data/.rubocop.yml +28 -0
- data/Gemfile +6 -1
- data/README.md +145 -10
- data/Rakefile +59 -1
- data/bin/console +1 -1
- data/config/valkyrie.yml +8 -0
- data/db/config.yml +17 -0
- data/db/migrate/20160111215816_enable_uuid_extension.rb +6 -0
- data/db/migrate/20161007101725_create_orm_resources.rb +10 -0
- data/db/migrate/20170124135846_add_model_type_to_orm_resources.rb +6 -0
- data/db/migrate/20170531004548_change_model_type_to_internal_model.rb +6 -0
- data/db/schema.rb +65 -0
- data/db/seeds.rb +8 -0
- data/lib/config/database_connection.rb +15 -0
- data/lib/generators/valkyrie/resource_generator.rb +27 -0
- data/lib/generators/valkyrie/templates/resource.rb.erb +9 -0
- data/lib/generators/valkyrie/templates/resource_spec.rb.erb +13 -0
- data/lib/valkyrie.rb +76 -1
- data/lib/valkyrie/adapter_container.rb +12 -0
- data/lib/valkyrie/change_set.rb +84 -0
- data/lib/valkyrie/decorators/decorator_list.rb +15 -0
- data/lib/valkyrie/decorators/decorator_with_arguments.rb +14 -0
- data/lib/valkyrie/derivative_service.rb +42 -0
- data/lib/valkyrie/engine.rb +10 -0
- data/lib/valkyrie/file_characterization_service.rb +42 -0
- data/lib/valkyrie/id.rb +32 -0
- data/lib/valkyrie/indexers/access_controls_indexer.rb +19 -0
- data/lib/valkyrie/local_file_service.rb +11 -0
- data/lib/valkyrie/metadata_adapter.rb +22 -0
- data/lib/valkyrie/persist_derivatives.rb +29 -0
- data/lib/valkyrie/persistence.rb +14 -0
- data/lib/valkyrie/persistence/buffered_persister.rb +28 -0
- data/lib/valkyrie/persistence/composite_persister.rb +29 -0
- data/lib/valkyrie/persistence/delete_tracking_buffer.rb +21 -0
- data/lib/valkyrie/persistence/fedora.rb +11 -0
- data/lib/valkyrie/persistence/fedora/list_node.rb +88 -0
- data/lib/valkyrie/persistence/fedora/metadata_adapter.rb +45 -0
- data/lib/valkyrie/persistence/fedora/ordered_list.rb +146 -0
- data/lib/valkyrie/persistence/fedora/ordered_reader.rb +28 -0
- data/lib/valkyrie/persistence/fedora/persister.rb +47 -0
- data/lib/valkyrie/persistence/fedora/persister/model_converter.rb +199 -0
- data/lib/valkyrie/persistence/fedora/persister/orm_converter.rb +338 -0
- data/lib/valkyrie/persistence/fedora/persister/resource_factory.rb +21 -0
- data/lib/valkyrie/persistence/fedora/query_service.rb +80 -0
- data/lib/valkyrie/persistence/memory.rb +8 -0
- data/lib/valkyrie/persistence/memory/metadata_adapter.rb +22 -0
- data/lib/valkyrie/persistence/memory/persister.rb +58 -0
- data/lib/valkyrie/persistence/memory/query_service.rb +86 -0
- data/lib/valkyrie/persistence/postgres.rb +6 -0
- data/lib/valkyrie/persistence/postgres/metadata_adapter.rb +20 -0
- data/lib/valkyrie/persistence/postgres/orm.rb +9 -0
- data/lib/valkyrie/persistence/postgres/orm/resource.rb +7 -0
- data/lib/valkyrie/persistence/postgres/orm_converter.rb +118 -0
- data/lib/valkyrie/persistence/postgres/persister.rb +33 -0
- data/lib/valkyrie/persistence/postgres/queries.rb +8 -0
- data/lib/valkyrie/persistence/postgres/queries/find_inverse_references_query.rb +31 -0
- data/lib/valkyrie/persistence/postgres/queries/find_members_query.rb +33 -0
- data/lib/valkyrie/persistence/postgres/queries/find_references_query.rb +33 -0
- data/lib/valkyrie/persistence/postgres/query_service.rb +53 -0
- data/lib/valkyrie/persistence/postgres/resource_converter.rb +18 -0
- data/lib/valkyrie/persistence/postgres/resource_factory.rb +30 -0
- data/lib/valkyrie/persistence/solr.rb +6 -0
- data/lib/valkyrie/persistence/solr/metadata_adapter.rb +42 -0
- data/lib/valkyrie/persistence/solr/model_converter.rb +270 -0
- data/lib/valkyrie/persistence/solr/orm_converter.rb +252 -0
- data/lib/valkyrie/persistence/solr/persister.rb +32 -0
- data/lib/valkyrie/persistence/solr/queries.rb +11 -0
- data/lib/valkyrie/persistence/solr/queries/default_paginator.rb +16 -0
- data/lib/valkyrie/persistence/solr/queries/find_all_query.rb +33 -0
- data/lib/valkyrie/persistence/solr/queries/find_by_id_query.rb +24 -0
- data/lib/valkyrie/persistence/solr/queries/find_inverse_references_query.rb +30 -0
- data/lib/valkyrie/persistence/solr/queries/find_members_query.rb +43 -0
- data/lib/valkyrie/persistence/solr/queries/find_references_query.rb +34 -0
- data/lib/valkyrie/persistence/solr/query_service.rb +48 -0
- data/lib/valkyrie/persistence/solr/repository.rb +36 -0
- data/lib/valkyrie/persistence/solr/resource_factory.rb +24 -0
- data/lib/valkyrie/rdf_patches.rb +17 -0
- data/lib/valkyrie/resource.rb +106 -0
- data/lib/valkyrie/resource/access_controls.rb +13 -0
- data/lib/valkyrie/specs/shared_specs.rb +10 -0
- data/lib/valkyrie/specs/shared_specs/change_set_persister.rb +60 -0
- data/lib/valkyrie/specs/shared_specs/derivative_service.rb +30 -0
- data/lib/valkyrie/specs/shared_specs/file.rb +12 -0
- data/lib/valkyrie/specs/shared_specs/file_characterization_service.rb +33 -0
- data/lib/valkyrie/specs/shared_specs/metadata_adapter.rb +10 -0
- data/lib/valkyrie/specs/shared_specs/persister.rb +154 -0
- data/lib/valkyrie/specs/shared_specs/queries.rb +128 -0
- data/lib/valkyrie/specs/shared_specs/resource.rb +71 -0
- data/lib/valkyrie/specs/shared_specs/storage_adapter.rb +44 -0
- data/lib/valkyrie/storage.rb +8 -0
- data/lib/valkyrie/storage/disk.rb +55 -0
- data/lib/valkyrie/storage/fedora.rb +71 -0
- data/lib/valkyrie/storage/memory.rb +31 -0
- data/lib/valkyrie/storage_adapter.rb +100 -0
- data/lib/valkyrie/types.rb +34 -0
- data/lib/valkyrie/value_mapper.rb +67 -0
- data/lib/valkyrie/version.rb +2 -1
- data/lib/valkyrie/vocab/pcdm_use.rb +73 -0
- data/valkyrie.gemspec +33 -7
- metadata +462 -7
- data/.travis.yml +0 -5
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Valkyrie::Persistence::Fedora
|
3
|
+
class Persister
|
4
|
+
class ResourceFactory
|
5
|
+
require 'valkyrie/persistence/fedora/persister/model_converter'
|
6
|
+
require 'valkyrie/persistence/fedora/persister/orm_converter'
|
7
|
+
attr_reader :adapter
|
8
|
+
def initialize(adapter:)
|
9
|
+
@adapter = adapter
|
10
|
+
end
|
11
|
+
|
12
|
+
def from_resource(resource:)
|
13
|
+
ModelConverter.new(resource: resource, adapter: adapter).convert
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_resource(object:)
|
17
|
+
OrmConverter.new(object: object, adapter: adapter).convert
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Valkyrie::Persistence::Fedora
|
3
|
+
class QueryService
|
4
|
+
attr_reader :adapter
|
5
|
+
delegate :connection, :resource_factory, to: :adapter
|
6
|
+
def initialize(adapter:)
|
7
|
+
@adapter = adapter
|
8
|
+
end
|
9
|
+
|
10
|
+
def find_by(id:)
|
11
|
+
uri = adapter.id_to_uri(id)
|
12
|
+
begin
|
13
|
+
resource = Ldp::Resource.for(connection, uri, connection.get(uri))
|
14
|
+
resource_factory.to_resource(object: resource)
|
15
|
+
rescue ::Ldp::Gone, ::Ldp::NotFound
|
16
|
+
raise ::Valkyrie::Persistence::ObjectNotFoundError
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def find_parents(resource:)
|
21
|
+
content = content_with_inbound(id: resource.id)
|
22
|
+
parent_ids = content.graph.query([nil, RDF::Vocab::ORE.proxyFor, nil]).map(&:subject).map { |x| x.to_s.gsub(/#.*/, '') }.map { |x| adapter.uri_to_id(x) }
|
23
|
+
parent_ids.lazy.map do |id|
|
24
|
+
find_by(id: id)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def include_uris
|
29
|
+
[
|
30
|
+
::RDF::Vocab::Fcrepo4.InboundReferences
|
31
|
+
]
|
32
|
+
end
|
33
|
+
|
34
|
+
def find_members(resource:)
|
35
|
+
Array(resource.member_ids).lazy.map do |id|
|
36
|
+
find_by(id: id)
|
37
|
+
end.select(&:present?)
|
38
|
+
end
|
39
|
+
|
40
|
+
def find_all
|
41
|
+
resource = Ldp::Resource.for(connection, adapter.base_path, connection.get(adapter.base_path))
|
42
|
+
ids = resource.graph.query([nil, RDF::Vocab::LDP.contains, nil]).map(&:object).map { |x| adapter.uri_to_id(x) }
|
43
|
+
ids.lazy.map do |id|
|
44
|
+
find_by(id: id)
|
45
|
+
end
|
46
|
+
rescue ::Ldp::NotFound
|
47
|
+
[]
|
48
|
+
end
|
49
|
+
|
50
|
+
def find_all_of_model(model:)
|
51
|
+
find_all.select do |m|
|
52
|
+
m.is_a?(model)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def find_references_by(resource:, property:)
|
57
|
+
(resource[property] || []).select { |x| x.is_a?(Valkyrie::ID) }.lazy.map do |id|
|
58
|
+
find_by(id: id)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def content_with_inbound(id:)
|
63
|
+
uri = adapter.id_to_uri(id)
|
64
|
+
connection.get(uri) do |req|
|
65
|
+
prefer_headers = Ldp::PreferHeaders.new(req.headers["Prefer"])
|
66
|
+
prefer_headers.include = prefer_headers.include | include_uris
|
67
|
+
req.headers["Prefer"] = prefer_headers.to_s
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def find_inverse_references_by(resource:, property:)
|
72
|
+
content = content_with_inbound(id: resource.id)
|
73
|
+
property_uri = RDF::URI("http://example.com/predicate/#{property}")
|
74
|
+
ids = content.graph.query([nil, property_uri, nil]).map(&:subject).map { |x| x.to_s.gsub(/#.*/, '') }.map { |x| adapter.uri_to_id(x) }
|
75
|
+
ids.lazy.map do |id|
|
76
|
+
find_by(id: id)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Valkyrie::Persistence::Memory
|
3
|
+
class MetadataAdapter
|
4
|
+
attr_writer :cache
|
5
|
+
|
6
|
+
# @return [Valkyrie::Persistence::Memory::Persister] A memory persister for
|
7
|
+
# this adapter.
|
8
|
+
def persister
|
9
|
+
Valkyrie::Persistence::Memory::Persister.new(self)
|
10
|
+
end
|
11
|
+
|
12
|
+
# @return [Valkyrie::Persistence::Memory::QueryService] A query service for
|
13
|
+
# this adapter.
|
14
|
+
def query_service
|
15
|
+
Valkyrie::Persistence::Memory::QueryService.new(adapter: self)
|
16
|
+
end
|
17
|
+
|
18
|
+
def cache
|
19
|
+
@cache ||= {}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Valkyrie::Persistence::Memory
|
3
|
+
class Persister
|
4
|
+
attr_reader :adapter
|
5
|
+
delegate :cache, to: :adapter
|
6
|
+
# @param adapter [Valkyrie::Persistence::Memory::MetadataAdapter] The memory adapter which
|
7
|
+
# holds the cache for this persister.
|
8
|
+
def initialize(adapter)
|
9
|
+
@adapter = adapter
|
10
|
+
end
|
11
|
+
|
12
|
+
# @param resource [Valkyrie::Resource] The resource to save.
|
13
|
+
# @return [Valkyrie::Resource] The resource with an `#id` value generated by the
|
14
|
+
# persistence backend.
|
15
|
+
def save(resource:)
|
16
|
+
resource = generate_id(resource) if resource.id.blank?
|
17
|
+
resource.updated_at = Time.current
|
18
|
+
normalize_dates!(resource)
|
19
|
+
cache[resource.id] = resource
|
20
|
+
end
|
21
|
+
|
22
|
+
# @param resources [Array<Valkyrie::Resource>] List of resources to save.
|
23
|
+
# @return [Array<Valkyrie::Resource>] List of resources with an `#id` value
|
24
|
+
# generated by the persistence backend.
|
25
|
+
def save_all(resources:)
|
26
|
+
resources.map do |resource|
|
27
|
+
save(resource: resource)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# @param resource [Valkyrie::Resource] The resource to delete from the persistence
|
32
|
+
# backend.
|
33
|
+
def delete(resource:)
|
34
|
+
cache.delete(resource.id)
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def generate_id(resource)
|
40
|
+
resource.new(id: SecureRandom.uuid, created_at: Time.current)
|
41
|
+
end
|
42
|
+
|
43
|
+
def normalize_dates!(resource)
|
44
|
+
resource.attributes.each { |k, v| resource.send("#{k}=", normalize_date_values(v)) }
|
45
|
+
end
|
46
|
+
|
47
|
+
def normalize_date_values(v)
|
48
|
+
return v.map { |val| normalize_date_value(val) } if v.is_a?(Array)
|
49
|
+
normalize_date_value(v)
|
50
|
+
end
|
51
|
+
|
52
|
+
def normalize_date_value(value)
|
53
|
+
return value.utc if value.is_a?(DateTime)
|
54
|
+
return value.to_datetime.utc if value.is_a?(Time)
|
55
|
+
value
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Valkyrie::Persistence::Memory
|
3
|
+
class QueryService
|
4
|
+
attr_reader :adapter
|
5
|
+
delegate :cache, to: :adapter
|
6
|
+
# @param adapter [Valkyrie::Persistence::Memory::MetadataAdapter] The adapter which
|
7
|
+
# has the cache to query.
|
8
|
+
def initialize(adapter:)
|
9
|
+
@adapter = adapter
|
10
|
+
end
|
11
|
+
|
12
|
+
# @param id [Valkyrie::ID] The ID to query for.
|
13
|
+
# @raise [Valkyrie::Persistence::ObjectNotFoundError] Raised when the ID
|
14
|
+
# isn't in the persistence backend.
|
15
|
+
# @return [Valkyrie::Resource] The object being searched for.
|
16
|
+
def find_by(id:)
|
17
|
+
cache[id] || raise(::Valkyrie::Persistence::ObjectNotFoundError)
|
18
|
+
end
|
19
|
+
|
20
|
+
# @return [Array<Valkyrie::Resource>] All objects in the persistence backend.
|
21
|
+
def find_all
|
22
|
+
cache.values
|
23
|
+
end
|
24
|
+
|
25
|
+
# @param resource [Class] Class to query for.
|
26
|
+
# @return [Array<Valkyrie::Resource>] All objects in the persistence backend
|
27
|
+
# with the given class.
|
28
|
+
def find_all_of_model(model:)
|
29
|
+
cache.values.select do |obj|
|
30
|
+
obj.is_a?(model)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# @param resource [Valkyrie::Resource] Model whose members are being searched for.
|
35
|
+
# @return [Array<Valkyrie::Resource>] All child objects referenced by `resource`'s
|
36
|
+
# `member_ids` method. Returned in order.
|
37
|
+
def find_members(resource:)
|
38
|
+
member_ids(resource: resource).map do |id|
|
39
|
+
find_by(id: id)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# @param resource [Valkyrie::Resource] Model whose property is being searched.
|
44
|
+
# @param property [Symbol] Property which, on the `resource`, contains {Valkyrie::ID}s which are
|
45
|
+
# to be de-referenced.
|
46
|
+
# @return [Array<Valkyrie::Resource>] All objects which are referenced by the
|
47
|
+
# `property` property on `resource`. Not necessarily in order.
|
48
|
+
def find_references_by(resource:, property:)
|
49
|
+
Array.wrap(resource[property]).map do |id|
|
50
|
+
find_by(id: id)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# @param resource [Valkyrie::Resource] The resource which is being referenced by
|
55
|
+
# other resources.
|
56
|
+
# @param property [Symbol] The property which, on other resources, is
|
57
|
+
# referencing the given `resource`
|
58
|
+
# @return [Array<Valkyrie::Resource>] All resources in the persistence backend
|
59
|
+
# which have the ID of the given `resource` in their `property` property. Not
|
60
|
+
# in order.
|
61
|
+
def find_inverse_references_by(resource:, property:)
|
62
|
+
find_all.select do |obj|
|
63
|
+
begin
|
64
|
+
Array.wrap(obj[property]).include?(resource.id)
|
65
|
+
rescue
|
66
|
+
false
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# @param resource [Valkyrie::Resource] The resource whose parents are being searched
|
72
|
+
# for.
|
73
|
+
# @return [Array<Valkyrie::Resource>] All resources which are parents of the given
|
74
|
+
# `resource`. This means the resource's `id` appears in their `member_ids`
|
75
|
+
# array.
|
76
|
+
def find_parents(resource:)
|
77
|
+
cache.values.select do |record|
|
78
|
+
member_ids(resource: record).include?(resource.id)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def member_ids(resource:)
|
83
|
+
resource.member_ids || []
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'valkyrie/persistence/postgres/persister'
|
3
|
+
require 'valkyrie/persistence/postgres/query_service'
|
4
|
+
module Valkyrie::Persistence::Postgres
|
5
|
+
class MetadataAdapter
|
6
|
+
# @return [Class] {Valkyrie::Persistence::Postgres::Persister}
|
7
|
+
def persister
|
8
|
+
Valkyrie::Persistence::Postgres::Persister.new(adapter: self)
|
9
|
+
end
|
10
|
+
|
11
|
+
# @return [Class] {Valkyrie::Persistence::Postgres::QueryService}
|
12
|
+
def query_service
|
13
|
+
Valkyrie::Persistence::Postgres::QueryService.new(adapter: self)
|
14
|
+
end
|
15
|
+
|
16
|
+
def resource_factory
|
17
|
+
Valkyrie::Persistence::Postgres::ResourceFactory
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Valkyrie::Persistence::Postgres
|
3
|
+
class ORMConverter
|
4
|
+
attr_reader :orm_object
|
5
|
+
def initialize(orm_object)
|
6
|
+
@orm_object = orm_object
|
7
|
+
end
|
8
|
+
|
9
|
+
def convert!
|
10
|
+
@resource ||= attributes[:internal_resource].constantize.new(attributes)
|
11
|
+
end
|
12
|
+
|
13
|
+
# @return [Hash] Valkyrie-style hash of attributes.
|
14
|
+
def attributes
|
15
|
+
@attributes ||= orm_object.attributes.merge(rdf_metadata).symbolize_keys
|
16
|
+
end
|
17
|
+
|
18
|
+
def rdf_metadata
|
19
|
+
@rdf_metadata ||= RDFMetadata.new(orm_object.metadata).result
|
20
|
+
end
|
21
|
+
|
22
|
+
class RDFMetadata
|
23
|
+
attr_reader :metadata
|
24
|
+
def initialize(metadata)
|
25
|
+
@metadata = metadata
|
26
|
+
end
|
27
|
+
|
28
|
+
def result
|
29
|
+
Hash[
|
30
|
+
metadata.map do |key, value|
|
31
|
+
[key, PostgresValue.for(value).result]
|
32
|
+
end
|
33
|
+
]
|
34
|
+
end
|
35
|
+
|
36
|
+
class PostgresValue < ::Valkyrie::ValueMapper
|
37
|
+
end
|
38
|
+
# Converts {RDF::Literal} typed-literals from JSON-LD stored into an
|
39
|
+
# {RDF::Literal}
|
40
|
+
class HashValue < ::Valkyrie::ValueMapper
|
41
|
+
PostgresValue.register(self)
|
42
|
+
def self.handles?(value)
|
43
|
+
value.is_a?(Hash) && value["@value"]
|
44
|
+
end
|
45
|
+
|
46
|
+
def result
|
47
|
+
RDF::Literal.new(value["@value"], language: value["@language"])
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# Converts stored IDs into {Valkyrie::ID}s
|
52
|
+
class IDValue < ::Valkyrie::ValueMapper
|
53
|
+
PostgresValue.register(self)
|
54
|
+
def self.handles?(value)
|
55
|
+
value.is_a?(Hash) && value["id"] && !value["internal_resource"]
|
56
|
+
end
|
57
|
+
|
58
|
+
def result
|
59
|
+
Valkyrie::ID.new(value["id"])
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# Converts stored URIs into {RDF::URI}s
|
64
|
+
class URIValue < ::Valkyrie::ValueMapper
|
65
|
+
PostgresValue.register(self)
|
66
|
+
def self.handles?(value)
|
67
|
+
value.is_a?(Hash) && value["@id"]
|
68
|
+
end
|
69
|
+
|
70
|
+
def result
|
71
|
+
::RDF::URI.new(value["@id"])
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# Converts nested records into {Valkyrie::Resource}s
|
76
|
+
class NestedRecord < ::Valkyrie::ValueMapper
|
77
|
+
PostgresValue.register(self)
|
78
|
+
def self.handles?(value)
|
79
|
+
value.is_a?(Hash) && value.keys.length > 1
|
80
|
+
end
|
81
|
+
|
82
|
+
def result
|
83
|
+
RDFMetadata.new(value).result.symbolize_keys
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
class DateValue < ::Valkyrie::ValueMapper
|
88
|
+
PostgresValue.register(self)
|
89
|
+
def self.handles?(value)
|
90
|
+
return false unless value.is_a?(String)
|
91
|
+
return false unless value[4] == "-"
|
92
|
+
year = value.to_s[0..3]
|
93
|
+
return false unless year.length == 4 && year.to_i.to_s == year
|
94
|
+
DateTime.iso8601(value)
|
95
|
+
rescue
|
96
|
+
false
|
97
|
+
end
|
98
|
+
|
99
|
+
def result
|
100
|
+
DateTime.iso8601(value).utc
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
class EnumeratorValue < ::Valkyrie::ValueMapper
|
105
|
+
PostgresValue.register(self)
|
106
|
+
def self.handles?(value)
|
107
|
+
value.respond_to?(:each)
|
108
|
+
end
|
109
|
+
|
110
|
+
def result
|
111
|
+
value.map do |value|
|
112
|
+
calling_mapper.for(value).result
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|