Class: ImportDataset::DarwinCore::Occurrences
  
  
  
  
    
      Constant Summary
      collapse
    
    
      
        - MINIMUM_FIELD_SET =
          
  
    
TODO: Can occurrenceID requirement be dropped? Should other fields be added here? 
 
 
  
 
- ['occurrenceID', 'scientificName', 'basisOfRecord'].freeze 
CHECKLIST_ROW_TYPE, OCCURRENCES_ROW_TYPE
  Instance Attribute Summary
  
  
  #description, #metadata, #source_content_type, #source_file_name, #source_file_size, #source_updated_at, #status
  
    
      Instance Method Summary
      collapse
    
    
  
  
  
  
  
  
  
  
  
  
  #add_filters, #check_field_set, #core_records_fields, #core_records_mapped_fields, create_with_subtype_detection, default_if_absent, #default_nomenclatural_code, #destroy_namespace, #dwc_data_attributes, #get_col_sep, #get_core_record_identifier_namespace, #get_dwc_default_values, #get_dwc_headers, #get_dwc_records, #get_field_mapping, #get_fields_mapping, #get_normalized_dwc_term, #get_quote_char, #get_records, #import, #initialize, #progress, #set_import_settings, #stage, #start_import, #stop_import, #well_formed
  
  
  
  
  
  
  
  
  
  #delete_origin_relationships, #stage
  
  
  
  
  
  
  
  
  
  #new_objects, #old_objects, #reject_origin_relationships, #set_origin
  
  
  
  
  
  
  
  
  
  
  #errors_excepting, #full_error_messages_excepting, #identical, #is_community?, #is_destroyable?, #is_editable?, #is_in_use?, #is_in_users_projects?, #metamorphosize, #similar
  
  
  
  
  
  
  
  
  
  
  #has_polymorphic_relationship?
  
  
  
  
  
  
  
  
  
  
  transaction_with_retry
  
  
  
    Instance Method Details
    
      
  
  
    #add_catalog_number_collection_code_namespace(collection_code, namespace_id = nil)  ⇒ Object 
  
  
  
  
    | 
190
191
192
193
194
195
196 | # File 'app/models/import_dataset/darwin_core/occurrences.rb', line 190
def add_catalog_number_collection_code_namespace(collection_code, namespace_id = nil)
  unless collection_code.nil? || get_catalog_number_collection_code_namespace_mapping(collection_code)
    self.metadata['catalog_numbers_collection_code_namespaces'] << [collection_code, namespace_id]
    self.metadata['catalog_numbers_collection_code_namespaces'].sort! { |a, b| a[0].to_s <=> b[0].to_s }
  end
  save!
end | 
 
    
      
  
  
    #add_catalog_number_namespace(institution_code, collection_code, namespace_id = nil)  ⇒ Object 
  
  
  
  
    | 
182
183
184
185
186
187
188 | # File 'app/models/import_dataset/darwin_core/occurrences.rb', line 182
def add_catalog_number_namespace(institution_code, collection_code, namespace_id = nil)
  unless get_catalog_number_namespace_mapping(institution_code, collection_code)
    self.metadata['catalog_numbers_namespaces'] << [[institution_code, collection_code], namespace_id]
    self.metadata['catalog_numbers_namespaces'].sort! { |a, b| a[0].map(&:to_s) <=> b[0].map(&:to_s) }
  end
  save!
end | 
 
    
      
  
  
    #containerize_dup_cat_no?  ⇒ Boolean 
  
  
  
  
    | 
198
199
200 | # File 'app/models/import_dataset/darwin_core/occurrences.rb', line 198
def containerize_dup_cat_no?
  !!self.metadata.dig('import_settings', 'containerize_dup_cat_no')
end | 
 
    
      
  
  
    #core_records_class  ⇒ Object 
  
  
  
 
    
      
  
  
    #core_records_identifier_name  ⇒ Object 
  
  
  
  
    | 
16
17
18 | # File 'app/models/import_dataset/darwin_core/occurrences.rb', line 16
def core_records_identifier_name
  'occurrenceID'
end | 
 
    
      
  
  
    #enable_organization_determiners?  ⇒ Boolean 
  
  
  
  
    | 
218
219
220 | # File 'app/models/import_dataset/darwin_core/occurrences.rb', line 218
def enable_organization_determiners?
  !!self.metadata.dig('import_settings', 'enable_organization_determiners')
end | 
 
    
      
  
  
    #enable_organization_determiners_alt_name?  ⇒ Boolean 
  
  
  
  
    | 
222
223
224 | # File 'app/models/import_dataset/darwin_core/occurrences.rb', line 222
def enable_organization_determiners_alt_name?
  !!self.metadata.dig('import_settings', 'enable_organization_determiners_alt_name')
end | 
 
    
      
  
  
    #get_catalog_number_collection_code_namespace_mapping(collection_code)  ⇒ Object  
  
  
  
  
    | 
232
233
234 | # File 'app/models/import_dataset/darwin_core/occurrences.rb', line 232
def get_catalog_number_collection_code_namespace_mapping(collection_code)
  self.metadata['catalog_numbers_collection_code_namespaces']&.detect { |m| m[0] == collection_code }
end | 
 
    
      
  
  
    #get_catalog_number_namespace(institution_code, collection_code)  ⇒ Object 
  
  
  
  
    | 
111
112
113
114 | # File 'app/models/import_dataset/darwin_core/occurrences.rb', line 111
def get_catalog_number_namespace(institution_code, collection_code)
  get_catalog_number_namespace_mapping(institution_code, collection_code)&.at(1) ||
  get_catalog_number_collection_code_namespace_mapping(collection_code)&.at(1)
end | 
 
    
      
  
  
    #get_catalog_number_namespace_mapping(institution_code, collection_code)  ⇒ Object  
  
  
  
  
    | 
228
229
230 | # File 'app/models/import_dataset/darwin_core/occurrences.rb', line 228
def get_catalog_number_namespace_mapping(institution_code, collection_code)
  self.metadata['catalog_numbers_namespaces']&.detect { |m| m[0] == [institution_code, collection_code] }
end | 
 
    
      
  
  
    #get_event_id_namespace  ⇒ Object 
  
  
  
  
    | 
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 | # File 'app/models/import_dataset/darwin_core/occurrences.rb', line 20
def get_event_id_namespace
  id = metadata.dig('namespaces', 'eventID')
  if id.nil? || (@event_id_identifier_namespace ||= Namespace.find_by(id:)).nil?
    random = SecureRandom.hex(4)
    project_name = Project.find(Current.project_id).name
    namespace_name = "eventID namespace for \"#{description}\" dataset in \"#{project_name}\" project [#{random}]"
    @event_id_identifier_namespace = Namespace.create!(
      name: namespace_name,
      short_name: "eventID-#{random}",
      verbatim_short_name: 'eventID',
      delimiter: ':'
    )
    metadata['namespaces']['eventID'] = @event_id_identifier_namespace.id
    save!
  end
  @event_id_identifier_namespace
end | 
 
    
      
  
  
    
Stages core (Occurrence) records and all extension records.
   
 
  
  
    | 
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109 | # File 'app/models/import_dataset/darwin_core/occurrences.rb', line 43
def perform_staging
  records,  = get_records(source.path)
  update!(metadata:
    metadata.merge({
      core_headers: [:core],
      extensions_headers: [:extensions],
      catalog_numbers_namespaces: []
    })
  )
  core_records = records[:core].map do |record|
    {
      src_data: record,
      basisOfRecord: record['basisOfRecord']
    }
  end
  catalog_numbers_namespaces = Set[]
  catalog_numbers_collection_code_namespaces = Set[]
  core_records.each do |record|
    dwc_occurrence = DatasetRecord::DarwinCore::Occurrence.new(import_dataset: self)
    dwc_occurrence.initialize_data_fields(record[:src_data].map { |k, v| v })
    catalog_numbers_namespaces << [
      [
        dwc_occurrence.get_field_value(:institutionCode),
        dwc_occurrence.get_field_value(:collectionCode)
      ],
      nil     ]
    catalog_numbers_collection_code_namespaces << [dwc_occurrence.get_field_value(:collectionCode), nil]
    if dwc_occurrence.get_field_value(:catalogNumber).blank? || dwc_occurrence.get_field_value('TW:Namespace:catalogNumber').present?
      dwc_occurrence.status = 'Ready'
    else
      dwc_occurrence.status = 'NotReady'
      record['error_data'] = { messages: { catalogNumber: ['Record cannot be imported until namespace is set, see "Settings".'] } }
    end
    record.delete(:src_data)
    dwc_occurrence.metadata = record
    dwc_occurrence.save!
  end
  records[:extensions].each do |extension_type, records|
    records.each do |record|
      dwc_extension = DatasetRecord::DarwinCore::Extension.new(import_dataset: self)
      dwc_extension.initialize_data_fields(record.map { |k, v| v })
      dwc_extension.status = 'Unsupported'
      dwc_extension.metadata = { 'type' => extension_type }
      dwc_extension.save!
    end
  end
  self.metadata.merge!(
    catalog_numbers_namespaces: catalog_numbers_namespaces.sort { |a, b| a[0].map(&:to_s) <=> b[0].map(&:to_s) }
  )
  self.metadata.merge!(
    catalog_numbers_collection_code_namespaces: catalog_numbers_collection_code_namespaces.sort { |a, b| a[0].to_s <=> b[0].to_s }
  )
  save!
end | 
 
    
      
  
  
    #require_catalog_number_match_verbatim?  ⇒ Boolean 
  
  
  
  
    | 
214
215
216 | # File 'app/models/import_dataset/darwin_core/occurrences.rb', line 214
def require_catalog_number_match_verbatim?
  !!self.metadata.dig('import_settings', 'require_catalog_number_match_verbatim')
end | 
 
    
      
  
  
    #require_tripcode_match_verbatim?  ⇒ Boolean 
  
  
  
  
    | 
210
211
212 | # File 'app/models/import_dataset/darwin_core/occurrences.rb', line 210
def require_tripcode_match_verbatim?
  !!self.metadata.dig('import_settings', 'require_tripcode_match_verbatim')
end | 
 
    
      
  
  
    #require_type_material_success?  ⇒ Boolean 
  
  
  
  
    | 
206
207
208 | # File 'app/models/import_dataset/darwin_core/occurrences.rb', line 206
def require_type_material_success?
  !!self.metadata.dig('import_settings', 'require_type_material_success')
end | 
 
    
      
  
  
    #restrict_to_existing_nomenclature?  ⇒ Boolean 
  
  
  
  
    | 
202
203
204 | # File 'app/models/import_dataset/darwin_core/occurrences.rb', line 202
def restrict_to_existing_nomenclature?
  !!self.metadata.dig('import_settings', 'restrict_to_existing_nomenclature')
end | 
 
    
      
  
  
    #update_catalog_number_collection_code_namespace(collection_code, namespace_id)  ⇒ Object 
  
  
  
  
    | 
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180 | # File 'app/models/import_dataset/darwin_core/occurrences.rb', line 152
def update_catalog_number_collection_code_namespace(collection_code, namespace_id)
  return if collection_code.nil? 
  transaction do
    mapping = get_catalog_number_collection_code_namespace_mapping(collection_code)
    mapping[1] = namespace_id
    ready = namespace_id.to_i > 0
    save!
    query = ready ? core_records.where(status: 'NotReady') : core_records.where.not(status: ['NotReady', 'Imported', 'Unsupported'])
    if ready
      query.where(
        id: core_records_fields.at(get_field_mapping(:collectionCode)).having_value(collection_code).select(:dataset_record_id)
      ).update_all(
        "status = 'Ready', metadata = metadata - 'error_data'"
      )
    else
      institution_codes = self.metadata['catalog_numbers_namespaces']&.select { |m| m[0][1] == collection_code && m[1] }&.map { |m| m[0][0] } || []
      query.where(
        id: core_records_fields.at(get_field_mapping(:collectionCode)).having_value(collection_code).select(:dataset_record_id)
      ).where.not(
        id: core_records_fields.at(get_field_mapping(:institutionCode)).having_values(institution_codes).select(:dataset_record_id)
      ).update_all(
        "status = 'NotReady', metadata = jsonb_set(metadata, '{error_data}', '{ \"messages\": { \"catalogNumber\": [\"Record cannot be imported until namespace is set, see \\\"Settings\\\".\"] } }')"
      )
    end
  end
end | 
 
    
      
  
  
    #update_catalog_number_namespace(institution_code, collection_code, namespace_id)  ⇒ Object 
  
  
  
  
    | 
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150 | # File 'app/models/import_dataset/darwin_core/occurrences.rb', line 116
def update_catalog_number_namespace(institution_code, collection_code, namespace_id)
  transaction do
    mapping = get_catalog_number_namespace_mapping(institution_code, collection_code)
    mapping[1] = namespace_id
    ready = namespace_id.to_i > 0
    save!
    query = ready ? core_records.where(status: 'NotReady') : core_records.where.not(status: ['NotReady', 'Imported', 'Unsupported'])
        unless institution_code.nil?
      query = query.where(
        id: core_records_fields.at(get_field_mapping(:institutionCode)).having_value(institution_code).select(:dataset_record_id)
      )
    else
      query = query.where.not(
        id: core_records_fields.at(get_field_mapping(:institutionCode)).select(:dataset_record_id)
      )
    end
    unless collection_code.nil?
      query = query.where(
        id: core_records_fields.at(get_field_mapping(:collectionCode)).having_value(collection_code).select(:dataset_record_id)
      )
    else
      query = query.where.not(
        id: core_records_fields.at(get_field_mapping(:collectionCode)).select(:dataset_record_id)
      )
    end
    query.update_all(ready ?
      "status = 'Ready', metadata = metadata - 'error_data'" :
      "status = 'NotReady', metadata = jsonb_set(metadata, '{error_data}', '{ \"messages\": { \"catalogNumber\": [\"Record cannot be imported until namespace is set, see \\\"Settings\\\".\"] } }')"
    )
  end
end |