ddr-models 2.6.2 → 2.7.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (146) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +1 -1
  4. data/Gemfile +2 -3
  5. data/app/models/collection.rb +11 -3
  6. data/app/models/component.rb +54 -4
  7. data/app/models/item.rb +1 -2
  8. data/config/initializers/active_fedora_base.rb +8 -5
  9. data/config/initializers/rubydora_monkey_patch.rb +11 -0
  10. data/config/initializers/subscriptions.rb +16 -9
  11. data/config/locales/ddr-models.en.yml +3 -0
  12. data/ddr-models.gemspec +3 -2
  13. data/lib/ddr/actions/virus_check.rb +10 -16
  14. data/lib/ddr/auth.rb +0 -8
  15. data/lib/ddr/datastreams.rb +13 -2
  16. data/lib/ddr/datastreams/administrative_metadata_datastream.rb +9 -0
  17. data/lib/ddr/datastreams/content_datastream.rb +5 -0
  18. data/lib/ddr/datastreams/datastream_behavior.rb +60 -15
  19. data/lib/ddr/datastreams/delete_external_files.rb +29 -0
  20. data/lib/ddr/datastreams/descriptive_metadata_datastream.rb +33 -33
  21. data/lib/ddr/datastreams/external_file_datastream.rb +69 -0
  22. data/lib/ddr/datastreams/fits_datastream.rb +15 -5
  23. data/lib/ddr/datastreams/intermediate_file_datastream.rb +5 -0
  24. data/lib/ddr/datastreams/metadata_datastream.rb +15 -17
  25. data/lib/ddr/datastreams/multires_image_datastream.rb +5 -0
  26. data/lib/ddr/derivatives.rb +1 -0
  27. data/lib/ddr/derivatives/ptif_generator.rb +5 -1
  28. data/lib/ddr/derivatives/update_derivatives.rb +23 -0
  29. data/lib/ddr/events/deletion_event.rb +5 -9
  30. data/lib/ddr/events/event.rb +7 -9
  31. data/lib/ddr/events/ingestion_event.rb +5 -9
  32. data/lib/ddr/events/update_event.rb +12 -5
  33. data/lib/ddr/index.rb +0 -1
  34. data/lib/ddr/index/csv_query_result.rb +10 -2
  35. data/lib/ddr/index/fields.rb +10 -9
  36. data/lib/ddr/index/filter.rb +1 -0
  37. data/lib/ddr/managers/derivatives_manager.rb +84 -98
  38. data/lib/ddr/managers/technical_metadata_manager.rb +20 -5
  39. data/lib/ddr/models.rb +24 -24
  40. data/lib/ddr/models/base.rb +98 -74
  41. data/lib/ddr/models/cache.rb +20 -0
  42. data/lib/ddr/models/engine.rb +4 -6
  43. data/lib/ddr/models/file_management.rb +57 -152
  44. data/lib/ddr/models/fixity_checkable.rb +0 -5
  45. data/lib/ddr/models/has_admin_metadata.rb +4 -2
  46. data/lib/ddr/models/has_children.rb +35 -1
  47. data/lib/ddr/models/has_content.rb +3 -33
  48. data/lib/ddr/models/has_intermediate_file.rb +18 -0
  49. data/lib/ddr/models/has_multires_image.rb +12 -15
  50. data/lib/ddr/models/has_struct_metadata.rb +2 -38
  51. data/lib/ddr/models/indexing.rb +160 -163
  52. data/lib/ddr/models/permanent_id.rb +26 -49
  53. data/lib/ddr/models/solr_document.rb +21 -19
  54. data/lib/ddr/models/structure.rb +168 -41
  55. data/lib/ddr/models/structures/agent.rb +49 -0
  56. data/lib/ddr/models/structures/div.rb +64 -0
  57. data/lib/ddr/models/structures/f_locat.rb +54 -0
  58. data/lib/ddr/models/structures/file.rb +52 -0
  59. data/lib/ddr/models/structures/file_grp.rb +35 -0
  60. data/lib/ddr/models/structures/file_sec.rb +22 -0
  61. data/lib/ddr/models/structures/fptr.rb +31 -0
  62. data/lib/ddr/models/structures/mets_hdr.rb +37 -0
  63. data/lib/ddr/models/structures/mptr.rb +49 -0
  64. data/lib/ddr/models/structures/struct_map.rb +40 -0
  65. data/lib/ddr/models/version.rb +1 -1
  66. data/lib/ddr/notifications.rb +10 -12
  67. data/lib/ddr/utils.rb +29 -16
  68. data/lib/ddr/vocab.rb +15 -17
  69. data/lib/ddr/vocab/asset.rb +29 -19
  70. data/lib/ddr/vocab/contact.rb +5 -7
  71. data/lib/ddr/vocab/display.rb +6 -8
  72. data/lib/ddr/vocab/duke_terms.rb +8 -10
  73. data/lib/ddr/vocab/rdf_vocabulary_parser.rb +37 -39
  74. data/lib/ddr/vocab/roles.rb +17 -19
  75. data/lib/ddr/vocab/vocabulary.rb +26 -26
  76. data/spec/datastreams/external_file_datastream_spec.rb +37 -0
  77. data/spec/derivatives/png_generator_spec.rb +21 -25
  78. data/spec/derivatives/ptif_generator_spec.rb +22 -26
  79. data/spec/dummy/config/environments/test.rb +1 -1
  80. data/spec/dummy/db/schema.rb +23 -23
  81. data/spec/factories/structure_factories.rb +8 -2
  82. data/spec/fixtures/imageA.jpg +0 -0
  83. data/spec/fixtures/imageB.jpg +0 -0
  84. data/spec/index/csv_query_result_spec.rb +3 -3
  85. data/spec/index/fields_spec.rb +7 -6
  86. data/spec/managers/derivatives_manager_spec.rb +105 -112
  87. data/spec/managers/technical_metadata_manager_spec.rb +22 -18
  88. data/spec/models/active_fedora_base_spec.rb +0 -106
  89. data/spec/models/active_fedora_datastream_spec.rb +33 -2
  90. data/spec/models/attachment_spec.rb +0 -2
  91. data/spec/models/cache_spec.rb +32 -0
  92. data/spec/models/collection_spec.rb +43 -19
  93. data/spec/models/component_spec.rb +41 -51
  94. data/spec/models/descriptive_metadata_datastream_spec.rb +99 -87
  95. data/spec/models/events_spec.rb +50 -69
  96. data/spec/models/file_management_spec.rb +79 -187
  97. data/spec/models/has_children_spec.rb +54 -3
  98. data/spec/models/has_struct_metadata_spec.rb +32 -38
  99. data/spec/models/indexing_spec.rb +11 -6
  100. data/spec/models/item_spec.rb +21 -7
  101. data/spec/models/permanent_id_spec.rb +1 -5
  102. data/spec/models/solr_document_spec.rb +13 -41
  103. data/spec/models/structure_spec.rb +85 -16
  104. data/spec/models/structures/agent_spec.rb +30 -0
  105. data/spec/models/structures/div_spec.rb +26 -0
  106. data/spec/models/structures/f_locat_spec.rb +78 -0
  107. data/spec/models/structures/file_grp_spec.rb +23 -0
  108. data/spec/models/structures/file_sec_spec.rb +22 -0
  109. data/spec/models/structures/file_spec.rb +60 -0
  110. data/spec/models/structures/fptr_spec.rb +23 -0
  111. data/spec/models/structures/mets_hdr_spec.rb +26 -0
  112. data/spec/models/structures/mptr_spec.rb +25 -0
  113. data/spec/models/structures/struct_map_spec.rb +24 -0
  114. data/spec/models/target_spec.rb +0 -2
  115. data/spec/spec_helper.rb +4 -9
  116. data/spec/support/shared_examples_for_ddr_models.rb +96 -156
  117. data/spec/support/shared_examples_for_has_content.rb +56 -30
  118. data/spec/support/shared_examples_for_has_intermediate_spec.rb +28 -0
  119. data/spec/support/shared_examples_for_non_collection_models.rb +5 -0
  120. data/spec/support/structural_metadata_helper.rb +230 -59
  121. data/spec/utils_spec.rb +0 -2
  122. metadata +86 -44
  123. data/app/helpers/models_helper.rb +0 -10
  124. data/lib/ddr/auth/legacy/abstract_legacy_permissions.rb +0 -17
  125. data/lib/ddr/auth/legacy/legacy_authorization.rb +0 -44
  126. data/lib/ddr/auth/legacy/legacy_default_permissions.rb +0 -33
  127. data/lib/ddr/auth/legacy/legacy_permissions.rb +0 -33
  128. data/lib/ddr/auth/legacy/legacy_roles.rb +0 -25
  129. data/lib/ddr/index/legacy_license_fields.rb +0 -12
  130. data/lib/ddr/jobs.rb +0 -12
  131. data/lib/ddr/jobs/fits_file_characterization.rb +0 -13
  132. data/lib/ddr/jobs/fixity_check.rb +0 -13
  133. data/lib/ddr/jobs/job.rb +0 -36
  134. data/lib/ddr/jobs/queue.rb +0 -27
  135. data/lib/ddr/jobs/update_index.rb +0 -13
  136. data/lib/ddr/models/access_controllable.rb +0 -24
  137. data/lib/ddr/models/struct_div.rb +0 -63
  138. data/spec/auth/legacy_default_permissions_spec.rb +0 -37
  139. data/spec/auth/legacy_permissions_spec.rb +0 -37
  140. data/spec/helpers/models_helper_spec.rb +0 -11
  141. data/spec/jobs/fits_file_characterization_spec.rb +0 -16
  142. data/spec/jobs/fixity_check_spec.rb +0 -22
  143. data/spec/jobs/job_spec.rb +0 -40
  144. data/spec/jobs/update_index_spec.rb +0 -22
  145. data/spec/models/struct_div_spec.rb +0 -70
  146. data/spec/support/shared_examples_for_access_controllables.rb +0 -6
@@ -2,11 +2,6 @@ module Ddr
2
2
  module Models
3
3
  module FixityCheckable
4
4
 
5
- def datastreams_to_validate
6
- datastreams.select { |dsid, ds| ds.has_content? }
7
- end
8
- alias_method :attached_files_having_content, :datastreams_to_validate
9
-
10
5
  def fixity_checks
11
6
  Ddr::Events::FixityCheckEvent.for_object(self)
12
7
  end
@@ -1,5 +1,3 @@
1
- require "resque"
2
-
3
1
  module Ddr::Models
4
2
  module HasAdminMetadata
5
3
  extend ActiveSupport::Concern
@@ -23,9 +21,13 @@ module Ddr::Models
23
21
  :aspace_id,
24
22
  :is_locked,
25
23
  :doi,
24
+ :ingested_by,
25
+ :ingestion_date,
26
26
  datastream: "adminMetadata",
27
27
  multiple: false
28
28
 
29
+ has_attributes :rights_note, datastream: "adminMetadata", multiple: true
30
+
29
31
  delegate :publish!, :unpublish!, :published?, :unpublished?,
30
32
  to: :workflow
31
33
  end
@@ -2,8 +2,42 @@ module Ddr
2
2
  module Models
3
3
  module HasChildren
4
4
 
5
+ DEFAULT_SORT = "#{Ddr::Index::Fields::LOCAL_ID} ASC, #{Ddr::Index::Fields::OBJECT_CREATE_DATE} ASC"
6
+
5
7
  def first_child
6
- ActiveFedora::Base.where(association_query(:children)).order("#{Ddr::Index::Fields::LOCAL_ID} ASC").first
8
+ ActiveFedora::SolrService.lazy_reify_solr_results(sorted_children).first
9
+ end
10
+
11
+ def default_structure
12
+ if children.present?
13
+ build_default_structure
14
+ end
15
+ end
16
+
17
+ def sorted_children
18
+ ActiveFedora::SolrService.query(association_query(:children), sort: DEFAULT_SORT, rows: 999999)
19
+ end
20
+
21
+ private
22
+
23
+ def build_default_structure
24
+ document = Ddr::Models::Structure.xml_template
25
+ structure = Ddr::Models::Structure.new(document)
26
+ metshdr = structure.add_metshdr
27
+ structure.add_agent(parent: metshdr, role: Ddr::Models::Structures::Agent::ROLE_CREATOR,
28
+ name: Ddr::Models::Structures::Agent::NAME_REPOSITORY_DEFAULT)
29
+ structmap = structure.add_structmap(type: Ddr::Models::Structure::TYPE_DEFAULT)
30
+ add_children(structure, structmap, sorted_children)
31
+ structure
32
+ end
33
+
34
+ def add_children(structure, structmap, children)
35
+ count = 0
36
+ children.each do |child|
37
+ count += 1
38
+ div = structure.add_div(parent: structmap, order: count)
39
+ structure.add_mptr(parent: div, href: child[Ddr::Index::Fields::PERMANENT_ID])
40
+ end
7
41
  end
8
42
 
9
43
  end
@@ -3,22 +3,13 @@ module Ddr
3
3
  module HasContent
4
4
  extend ActiveSupport::Concern
5
5
 
6
- MASTER_FILE_TYPES = [ "image/tiff" ]
7
-
8
- def master_file?
9
- if respond_to?(:file_use) && file_use.present?
10
- file_use == Ddr::Models::HasStructMetadata::FILE_USE_MASTER
11
- else
12
- MASTER_FILE_TYPES.include?(content_type)
13
- end
14
- end
15
-
16
6
  included do
17
7
  has_file_datastream \
18
8
  name: Ddr::Datastreams::CONTENT,
9
+ type: Ddr::Datastreams::ContentDatastream,
19
10
  versionable: true,
20
11
  label: "Content file for this object",
21
- control_group: "M"
12
+ control_group: "E"
22
13
 
23
14
  has_file_datastream \
24
15
  name: Ddr::Datastreams::EXTRACTED_TEXT,
@@ -30,7 +21,7 @@ module Ddr
30
21
  has_metadata \
31
22
  name: Ddr::Datastreams::FITS,
32
23
  type: Ddr::Datastreams::FitsDatastream,
33
- versionable: true,
24
+ versionable: false,
34
25
  label: "FITS Output for content file",
35
26
  control_group: "M"
36
27
 
@@ -38,18 +29,6 @@ module Ddr
38
29
 
39
30
  include FileManagement
40
31
 
41
- around_save :update_derivatives, if: :content_changed?
42
-
43
- before_save if: :re_characterize? do
44
- fits.delete
45
- end
46
-
47
- after_add_file do
48
- if file_to_add.original_name && file_to_add.dsid == "content"
49
- self.original_filename = file_to_add.original_name
50
- end
51
- end
52
-
53
32
  delegate :validate_checksum!, to: :content
54
33
  end
55
34
 
@@ -134,15 +113,6 @@ module Ddr
134
113
 
135
114
  protected
136
115
 
137
- def update_derivatives
138
- yield
139
- derivatives.update_derivatives(:later)
140
- end
141
-
142
- def re_characterize?
143
- content_changed? && !fits.new?
144
- end
145
-
146
116
  def default_content_type
147
117
  "application/octet-stream"
148
118
  end
@@ -0,0 +1,18 @@
1
+ module Ddr
2
+ module Models
3
+ module HasIntermediateFile
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ has_file_datastream name: Ddr::Datastreams::INTERMEDIATE_FILE,
8
+ type: Ddr::Datastreams::IntermediateFileDatastream,
9
+ versionable: true,
10
+ label: "Intermediate file for this object",
11
+ control_group: "E"
12
+
13
+ include FileManagement
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -1,20 +1,17 @@
1
- module Ddr
2
- module Models
3
- module HasMultiresImage
4
- extend ActiveSupport::Concern
1
+ module Ddr::Models
2
+ module HasMultiresImage
3
+ extend ActiveSupport::Concern
5
4
 
6
- included do
7
- has_file_datastream name: Ddr::Datastreams::MULTIRES_IMAGE,
8
- label: "Multi-resolution image derivative for this object",
9
- control_group: 'E'
10
-
11
- include FileManagement unless include?(FileManagement)
12
- end
13
-
14
- def multires_image_file_path
15
- URI.parse(datastreams[Ddr::Datastreams::MULTIRES_IMAGE].dsLocation).path if datastreams[Ddr::Datastreams::MULTIRES_IMAGE].dsLocation
16
- end
5
+ included do
6
+ has_file_datastream name: Ddr::Datastreams::MULTIRES_IMAGE,
7
+ type: Ddr::Datastreams::MultiresImageDatastream,
8
+ label: "Multi-resolution image derivative for this object",
9
+ control_group: "E"
10
+ end
17
11
 
12
+ def multires_image_file_path
13
+ datastreams[Ddr::Datastreams::MULTIRES_IMAGE].file_path
18
14
  end
15
+
19
16
  end
20
17
  end
@@ -17,44 +17,8 @@ module Ddr
17
17
  @structure
18
18
  end
19
19
 
20
- def build_default_structure
21
- structure = Ddr::Models::Structure.new(Ddr::Models::Structure.template)
22
- children = find_children
23
- children.each do |child|
24
- add_to_struct_map(structure, child)
25
- end
26
- structure
27
- end
28
-
29
- def multires_image_file_paths(type='default')
30
- ::SolrDocument.find(pid).multires_image_file_paths(type)
31
- end
32
-
33
- private
34
-
35
- def find_children
36
- query = association_query(:children)
37
- sort = "#{Ddr::Index::Fields::LOCAL_ID} ASC, #{Ddr::Index::Fields::OBJECT_CREATE_DATE} ASC"
38
- ActiveFedora::SolrService.query(query, sort: sort, rows: 999999)
39
- end
40
-
41
- def add_to_struct_map(stru, child)
42
- div = create_div(stru)
43
- create_fptr(stru, div, child['id'])
44
- end
45
-
46
- def create_div(stru)
47
- div_count = stru.structMap_node('default').xpath('xmlns:div').size
48
- div = Nokogiri::XML::Node.new('div', stru.as_xml_document)
49
- div['ORDER'] = div_count + 1
50
- stru.structMap_node('default').add_child(div)
51
- div
52
- end
53
-
54
- def create_fptr(stru, div, pid)
55
- fptr = Nokogiri::XML::Node.new('fptr', stru.as_xml_document)
56
- fptr['CONTENTIDS'] = "info:fedora/#{pid}"
57
- div.add_child(fptr)
20
+ def multires_image_file_paths
21
+ ::SolrDocument.find(pid).multires_image_file_paths
58
22
  end
59
23
 
60
24
  end
@@ -1,186 +1,183 @@
1
1
  require 'time'
2
2
 
3
- module Ddr
4
- module Models
5
- module Indexing
3
+ module Ddr::Models
4
+ module Indexing
6
5
 
7
- include Ddr::Index::Fields
6
+ include Ddr::Index::Fields
8
7
 
9
- def self.const_missing(name)
10
- Ddr::Index::Fields.const_missing(name)
11
- end
8
+ def self.const_missing(name)
9
+ Ddr::Index::Fields.const_missing(name)
10
+ end
12
11
 
13
- def to_solr(solr_doc=Hash.new, opts={})
14
- solr_doc = super(solr_doc, opts)
15
- solr_doc.merge index_fields
16
- end
12
+ def to_solr(solr_doc=Hash.new, opts={})
13
+ solr_doc = super(solr_doc, opts)
14
+ solr_doc.merge index_fields
15
+ end
17
16
 
18
- def index_fields
19
- fields = {
20
- ACCESS_ROLE => roles.to_json,
21
- ADMIN_SET => admin_set,
22
- ADMIN_SET_TITLE => admin_set_title,
23
- ARRANGER_FACET => desc_metadata_values('arranger'),
24
- ASPACE_ID => aspace_id,
25
- ATTACHED_FILES_HAVING_CONTENT => attached_files_having_content.keys,
26
- BOX_NUMBER_FACET => desc_metadata_values('box_number'),
27
- CATEGORY_FACET => desc_metadata_values('category'),
28
- COLLECTION_TITLE => collection_title,
29
- COMPANY_FACET => desc_metadata_values('company'),
30
- COMPOSER_FACET => desc_metadata_values('composer'),
31
- CONTRIBUTOR_FACET => contributor,
32
- CREATOR_FACET => creator,
33
- DATE_FACET => date,
34
- DATE_SORT => date_sort,
35
- DEPOSITOR => depositor,
36
- DISPLAY_FORMAT => display_format,
37
- DOI => adminMetadata.doi,
38
- EAD_ID => ead_id,
39
- ENGRAVER_FACET => desc_metadata_values('engraver'),
40
- FOLDER_FACET => desc_metadata_values('folder'),
41
- FORMAT_FACET => format,
42
- GENRE_FACET => desc_metadata_values('genre'),
43
- IDENTIFIER_ALL => all_identifiers,
44
- ILLUSTRATED_FACET => desc_metadata_values('illustrated'),
45
- ILLUSTRATOR_FACET => desc_metadata_values('illustrator'),
46
- INSTRUMENTATION_FACET => desc_metadata_values('instrumentation'),
47
- INTERNAL_URI => internal_uri,
48
- INTERVIEWER_NAME_FACET => desc_metadata_values('interviewer_name'),
49
- IS_LOCKED => is_locked,
50
- LICENSE => license,
51
- LICENSE_DESCRIPTION => rightsMetadata.license.description.first,
52
- LICENSE_TITLE => rightsMetadata.license.title.first,
53
- LICENSE_URL => rightsMetadata.license.url.first,
54
- LITHOGRAPHER_FACET => desc_metadata_values('lithographer'),
55
- LOCAL_ID => local_id,
56
- LYRICIST_FACET => desc_metadata_values('lyricist'),
57
- MEDIUM_FACET => desc_metadata_values('medium'),
58
- PERFORMER_FACET => desc_metadata_values('performer'),
59
- PERMANENT_ID => permanent_id,
60
- PERMANENT_URL => permanent_url,
61
- PLACEMENT_COMPANY_FACET => desc_metadata_values('placement_company'),
62
- POLICY_ROLE => roles.in_policy_scope.agents,
63
- PRODUCER_FACET => desc_metadata_values('producer'),
64
- PRODUCT_FACET => desc_metadata_values('product'),
65
- PUBLICATION_FACET => desc_metadata_values('publication'),
66
- PUBLISHER_FACET => publisher,
67
- RESEARCH_HELP_CONTACT => research_help_contact,
68
- RESOURCE_ROLE => roles.in_resource_scope.agents,
69
- ROLL_NUMBER_FACET => desc_metadata_values('roll_number'),
70
- SERIES_FACET => desc_metadata_values('series'),
71
- SETTING_FACET => desc_metadata_values('setting'),
72
- SPATIAL_FACET => desc_metadata_values('spatial'),
73
- SUBJECT_FACET => subject,
74
- SUBSERIES_FACET => desc_metadata_values('subseries'),
75
- TEMPORAL_FACET => desc_metadata_values('temporal'),
76
- TITLE => title_display,
77
- TONE_FACET => desc_metadata_values('tone'),
78
- TYPE_FACET => type,
79
- VOLUME_FACET => desc_metadata_values('volume'),
80
- WORKFLOW_STATE => workflow_state,
81
- YEAR_FACET => year_facet,
82
- }
83
- if respond_to? :fixity_checks
84
- last_fixity_check = fixity_checks.last
85
- fields.merge!(last_fixity_check.to_solr) if last_fixity_check
86
- end
87
- if respond_to? :virus_checks
88
- last_virus_check = virus_checks.last
89
- fields.merge!(last_virus_check.to_solr) if last_virus_check
90
- end
91
- if has_content?
92
- fields[CONTENT_CREATE_DATE] = Ddr::Utils.solr_date(content.createDate)
93
- fields[CONTENT_CONTROL_GROUP] = content.controlGroup
94
- fields[CONTENT_SIZE] = content_size
95
- fields[CONTENT_SIZE_HUMAN] = content_human_size
96
- fields[MEDIA_TYPE] = content_type
97
- fields[MEDIA_MAJOR_TYPE] = content_major_type
98
- fields[MEDIA_SUB_TYPE] = content_sub_type
99
- fields.merge! techmd.index_fields
100
- end
101
- if has_multires_image?
102
- fields[MULTIRES_IMAGE_FILE_PATH] = multires_image_file_path
103
- end
104
- if has_struct_metadata?
105
- fields[STRUCT_MAPS] = structure.struct_maps.to_json
106
- end
107
- if has_extracted_text?
108
- fields[EXTRACTED_TEXT] = extractedText.content
109
- end
110
- if is_a? Component
111
- fields[COLLECTION_URI] = collection_uri
112
- end
113
- if is_a? Collection
114
- fields[DEFAULT_LICENSE_DESCRIPTION] = defaultRights.license.description.first
115
- fields[DEFAULT_LICENSE_TITLE] = defaultRights.license.title.first
116
- fields[DEFAULT_LICENSE_URL] = defaultRights.license.url.first
117
- fields[ADMIN_SET_FACET] = admin_set_facet
118
- fields[COLLECTION_FACET] = collection_facet
119
- end
120
- if is_a? Item
121
- fields[ADMIN_SET_FACET] = admin_set_facet
122
- fields[COLLECTION_FACET] = collection_facet
123
- fields[ALL_TEXT] = all_text
124
- end
125
- fields
17
+ def index_fields
18
+ fields = {
19
+ ACCESS_ROLE => roles.to_json,
20
+ ADMIN_SET => admin_set,
21
+ ADMIN_SET_TITLE => admin_set_title,
22
+ ARRANGER_FACET => desc_metadata_values('arranger'),
23
+ ASPACE_ID => aspace_id,
24
+ ATTACHED_FILES_HAVING_CONTENT => attached_files_having_content.keys,
25
+ BOX_NUMBER_FACET => desc_metadata_values('box_number'),
26
+ CATEGORY_FACET => desc_metadata_values('category'),
27
+ COLLECTION_TITLE => collection_title,
28
+ COMPANY_FACET => desc_metadata_values('company'),
29
+ COMPOSER_FACET => desc_metadata_values('composer'),
30
+ CONTRIBUTOR_FACET => contributor,
31
+ CREATOR_FACET => creator,
32
+ DATE_FACET => date,
33
+ DATE_SORT => date_sort,
34
+ DC_IS_PART_OF => desc_metadata_values('isPartOf'),
35
+ DEPOSITOR => depositor,
36
+ DISPLAY_FORMAT => display_format,
37
+ DOI => adminMetadata.doi,
38
+ EAD_ID => ead_id,
39
+ ENGRAVER_FACET => desc_metadata_values('engraver'),
40
+ FOLDER_FACET => desc_metadata_values('folder'),
41
+ FORMAT_FACET => format,
42
+ GENRE_FACET => desc_metadata_values('genre'),
43
+ IDENTIFIER_ALL => all_identifiers,
44
+ ILLUSTRATED_FACET => desc_metadata_values('illustrated'),
45
+ ILLUSTRATOR_FACET => desc_metadata_values('illustrator'),
46
+ INGESTED_BY => ingested_by,
47
+ INGESTION_DATE => ingestion_date,
48
+ INSTRUMENTATION_FACET => desc_metadata_values('instrumentation'),
49
+ INTERNAL_URI => internal_uri,
50
+ INTERVIEWER_NAME_FACET => desc_metadata_values('interviewer_name'),
51
+ IS_FORMAT_OF => desc_metadata_values('isFormatOf'),
52
+ IS_LOCKED => is_locked,
53
+ LICENSE => license,
54
+ LITHOGRAPHER_FACET => desc_metadata_values('lithographer'),
55
+ LOCAL_ID => local_id,
56
+ LYRICIST_FACET => desc_metadata_values('lyricist'),
57
+ MEDIUM_FACET => desc_metadata_values('medium'),
58
+ PERFORMER_FACET => desc_metadata_values('performer'),
59
+ PERMANENT_ID => permanent_id,
60
+ PERMANENT_URL => permanent_url,
61
+ PLACEMENT_COMPANY_FACET => desc_metadata_values('placement_company'),
62
+ POLICY_ROLE => roles.in_policy_scope.agents,
63
+ PRODUCER_FACET => desc_metadata_values('producer'),
64
+ PRODUCT_FACET => desc_metadata_values('product'),
65
+ PUBLICATION_FACET => desc_metadata_values('publication'),
66
+ PUBLISHER_FACET => publisher,
67
+ RESEARCH_HELP_CONTACT => research_help_contact,
68
+ RESOURCE_ROLE => roles.in_resource_scope.agents,
69
+ RIGHTS_NOTE => rights_note,
70
+ ROLL_NUMBER_FACET => desc_metadata_values('roll_number'),
71
+ SERIES_FACET => desc_metadata_values('series'),
72
+ SETTING_FACET => desc_metadata_values('setting'),
73
+ SPATIAL_FACET => desc_metadata_values('spatial'),
74
+ SUBJECT_FACET => subject,
75
+ SUBSERIES_FACET => desc_metadata_values('subseries'),
76
+ TEMPORAL_FACET => desc_metadata_values('temporal'),
77
+ TITLE => title_display,
78
+ TONE_FACET => desc_metadata_values('tone'),
79
+ TYPE_FACET => type,
80
+ VOLUME_FACET => desc_metadata_values('volume'),
81
+ WORKFLOW_STATE => workflow_state,
82
+ YEAR_FACET => year_facet,
83
+ }
84
+ if respond_to? :fixity_checks
85
+ last_fixity_check = fixity_checks.last
86
+ fields.merge!(last_fixity_check.to_solr) if last_fixity_check
126
87
  end
127
-
128
- def title_display
129
- return title.first if title.present?
130
- return identifier.first if identifier.present?
131
- return original_filename if respond_to?(:original_filename) && original_filename.present?
132
- "[#{pid}]"
88
+ if respond_to? :virus_checks
89
+ last_virus_check = virus_checks.last
90
+ fields.merge!(last_virus_check.to_solr) if last_virus_check
133
91
  end
134
-
135
- def all_identifiers
136
- identifier + [local_id, permanent_id, pid].compact
92
+ if has_content?
93
+ fields[CONTENT_CREATE_DATE] = Ddr::Utils.solr_date(content.createDate)
94
+ fields[CONTENT_CONTROL_GROUP] = content.controlGroup
95
+ fields[CONTENT_SIZE] = content_size
96
+ fields[CONTENT_SIZE_HUMAN] = content_human_size
97
+ fields[MEDIA_TYPE] = content_type
98
+ fields[MEDIA_MAJOR_TYPE] = content_major_type
99
+ fields[MEDIA_SUB_TYPE] = content_sub_type
100
+ fields.merge! techmd.index_fields
137
101
  end
138
-
139
- def associated_collection
140
- # XXX Can/should we use SolrDocument here?
141
- # I.e., ::SolrDocument.find(admin_policy_id)
142
- admin_policy
102
+ if has_multires_image?
103
+ fields[MULTIRES_IMAGE_FILE_PATH] = multires_image_file_path
143
104
  end
144
-
145
- def admin_set_facet
146
- if admin_set.present?
147
- admin_set
148
- elsif associated_collection.present?
149
- associated_collection.admin_set
150
- end
105
+ if has_struct_metadata?
106
+ fields[STRUCTURE] = structure.dereferenced_structure.to_json
151
107
  end
152
-
153
- def admin_set_title
154
- code = if admin_set.present?
155
- admin_set
156
- elsif associated_collection.present?
157
- associated_collection.admin_set
158
- end
159
- if as = AdminSet.find_by_code(code)
160
- as.title
161
- end
108
+ if has_extracted_text?
109
+ fields[EXTRACTED_TEXT] = extractedText.content
162
110
  end
163
-
164
- def collection_facet
165
- associated_collection.internal_uri if associated_collection.present?
111
+ if is_a? Component
112
+ fields[COLLECTION_URI] = collection_uri
113
+ end
114
+ if is_a? Collection
115
+ fields[ADMIN_SET_FACET] = admin_set_facet
116
+ fields[COLLECTION_FACET] = collection_facet
166
117
  end
118
+ if is_a? Item
119
+ fields[ADMIN_SET_FACET] = admin_set_facet
120
+ fields[COLLECTION_FACET] = collection_facet
121
+ fields[ALL_TEXT] = all_text
122
+ end
123
+ fields
124
+ end
167
125
 
168
- def collection_title
169
- if instance_of?(Collection)
170
- title_display
171
- elsif associated_collection.present?
172
- associated_collection.title_display
173
- end
126
+ def title_display
127
+ return title.first if title.present?
128
+ return identifier.first if identifier.present?
129
+ return original_filename if respond_to?(:original_filename) && original_filename.present?
130
+ "[#{pid}]"
131
+ end
132
+
133
+ def all_identifiers
134
+ identifier + [local_id, permanent_id, pid].compact
135
+ end
136
+
137
+ def associated_collection
138
+ # XXX Can/should we use SolrDocument here?
139
+ # I.e., ::SolrDocument.find(admin_policy_id)
140
+ admin_policy
141
+ end
142
+
143
+ def admin_set_facet
144
+ if admin_set.present?
145
+ admin_set
146
+ elsif associated_collection.present?
147
+ associated_collection.admin_set
174
148
  end
149
+ end
175
150
 
176
- def date_sort
177
- date.first
151
+ def admin_set_title
152
+ code = if admin_set.present?
153
+ admin_set
154
+ elsif associated_collection.present?
155
+ associated_collection.admin_set
156
+ end
157
+ if as = AdminSet.find_by_code(code)
158
+ as.title
178
159
  end
160
+ end
179
161
 
180
- def year_facet
181
- YearFacet.call(self)
162
+ def collection_facet
163
+ associated_collection.internal_uri if associated_collection.present?
164
+ end
165
+
166
+ def collection_title
167
+ if instance_of?(Collection)
168
+ title_display
169
+ elsif associated_collection.present?
170
+ associated_collection.title_display
182
171
  end
172
+ end
183
173
 
174
+ def date_sort
175
+ date.first
184
176
  end
177
+
178
+ def year_facet
179
+ YearFacet.call(self)
180
+ end
181
+
185
182
  end
186
183
  end