Class: SearchSolrTools::Translators::NsidcJsonToSolr

Inherits:
Object
  • Object
show all
Defined in:
lib/search_solr_tools/translators/nsidc_json.rb

Overview

Translates NSIDC JSON format to Solr JSON add format

Constant Summary collapse

PARAMETER_PARTS =
%w[category topic term variableLevel1 variableLevel2 variableLevel3 detailedVariable].freeze

Instance Method Summary collapse

Instance Method Details

#convert_spatial_coverages(nsidc_geom) ⇒ Object

rubocop:enable Metrics/MethodLength rubocop:enable Metrics/AbcSize

[View source]

65
66
67
68
69
70
71
# File 'lib/search_solr_tools/translators/nsidc_json.rb', line 65

def convert_spatial_coverages(nsidc_geom)
  geometries = []
  nsidc_geom.each do |entry|
    geometries << RGeo::GeoJSON.decode(entry['geom4326'])
  end
  geometries
end

#generate_data_citation_creators(data_citation) ⇒ Object

[View source]

219
220
221
# File 'lib/search_solr_tools/translators/nsidc_json.rb', line 219

def generate_data_citation_creators(data_citation)
  data_citation.nil? ? [] : data_citation['creators']
end

#generate_part_array(json, limit_values = nil) ⇒ Object

[View source]

223
224
225
226
227
228
229
230
231
232
# File 'lib/search_solr_tools/translators/nsidc_json.rb', line 223

def generate_part_array(json, limit_values = nil)
  parts = []
  json = json.select { |k, _v| limit_values.include?(k) } unless limit_values.nil? || limit_values.empty?

  json.each do |_k, v|
    parts << v unless v.to_s.empty?
  end

  parts
end

#translate(json_doc) ⇒ Object

rubocop:disable Metrics/MethodLength rubocop:disable Metrics/AbcSize

[View source]

18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/search_solr_tools/translators/nsidc_json.rb', line 18

def translate(json_doc)
  copy_keys = %w[title summary keywords brokered]
  temporal_coverage_values = Helpers::TranslateTemporalCoverage.translate_coverages json_doc['temporalCoverages']
  spatial_coverages = convert_spatial_coverages(json_doc['spatialCoverages'])

  solr_add_hash = json_doc.select { |k, _v| copy_keys.include?(k) }
  solr_add_hash.merge!(
    'authoritative_id'          => json_doc['authoritativeId'],
    'dataset_version'           => json_doc['majorVersion']['version'],
    'data_centers'              => Helpers::SolrFormat::DATA_CENTER_NAMES[:NSIDC][:long_name],
    'facet_data_center'         => "#{Helpers::SolrFormat::DATA_CENTER_NAMES[:NSIDC][:long_name]} | #{Helpers::SolrFormat::DATA_CENTER_NAMES[:NSIDC][:short_name]}",
    'cumulus'                   => json_doc['cumulus'],
    'authors'                   => translate_personnel_and_creators_to_authors(json_doc['personnel'], generate_data_citation_creators(json_doc['dataCitation'])),
    'topics'                    => translate_iso_topic_categories(json_doc['isoTopicCategories']),
    'parameters'                => translate_parameters(json_doc['parameters']),
    'full_parameters'           => translate_json_string(json_doc['parameters'], PARAMETER_PARTS),
    'facet_parameter'           => translate_parameters_to_facet_parameters(json_doc['parameters']),
    'platforms'                 => translate_json_string(json_doc['platforms']),
    'sensors'                   => translate_json_string(json_doc['instruments']),
    'facet_sensor'              => translate_sensor_to_facet_sensor(json_doc['instruments']),
    'published_date'            => (Helpers::SolrFormat.date_str json_doc['releaseDate']),
    'spatial_coverages'         => Helpers::TranslateSpatialCoverage.geojson_to_spatial_display_str(spatial_coverages),
    'spatial'                   => Helpers::TranslateSpatialCoverage.geojson_to_spatial_index_str(spatial_coverages),
    'spatial_area'              => Helpers::TranslateSpatialCoverage.geojson_to_spatial_area(spatial_coverages),
    'facet_spatial_scope'       => Helpers::TranslateSpatialCoverage.geojson_to_spatial_scope_facet(spatial_coverages),
    'temporal_coverages'        => temporal_coverage_values['temporal_coverages'],
    'temporal_duration'         => temporal_coverage_values['temporal_duration'],
    'temporal'                  => temporal_coverage_values['temporal'],
    'facet_temporal_duration'   => temporal_coverage_values['facet_temporal_duration'],
    'last_revision_date'        => (Helpers::SolrFormat.date_str json_doc['lastRevisionDate']),
    'dataset_url'               => json_doc['datasetUrl'],
    'distribution_formats'      => json_doc['distributionFormats'],
    'facet_format'              => json_doc['distributionFormats'].empty? ? [Helpers::SolrFormat::NOT_SPECIFIED] : translate_format_to_facet_format(json_doc['distributionFormats']),
    'source'                    => %w[NSIDC ADE],
    'popularity'                => json_doc['popularity'],
    'data_access_urls'          => translate_data_access_urls(json_doc['dataAccessLinks']),
    'facet_sponsored_program'   => translate_short_long_names_to_facet_value(json_doc['internalDataCenters']),
    'facet_temporal_resolution' => translate_temporal_resolution_facet_values(json_doc['parameters']),
    'facet_spatial_resolution'  => translate_spatial_resolution_facet_values(json_doc['parameters']),
    'sponsored_programs'        => translate_internal_datacenters(json_doc['internalDataCenters']),
    'facet_storage_location'    => translate_storage_location(json_doc),
    'facet_spatial_coverage'    => Helpers::TranslateSpatialCoverage.geojson_to_global_facet(spatial_coverages)
  )
end

#translate_data_access_urls(json) ⇒ Object

[View source]

111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/search_solr_tools/translators/nsidc_json.rb', line 111

def translate_data_access_urls(json)
  values = []
  return values if json.nil?

  json.each do |json_entry|
    link_display = json_entry['displayText'].nil? ? '' : json_entry['displayText']
    link_type = json_entry['type'].nil? ? '' : json_entry['type']
    link_uri = json_entry['uri'].nil? ? '' : json_entry['uri']
    link_desc = json_entry['description'].nil? ? '' : json_entry['description']

    values << "#{link_display} | #{link_type} | #{link_uri} | #{link_desc}"
  end
  values
end

#translate_format_to_facet_format(format_json) ⇒ Object

[View source]

188
189
190
191
192
193
194
195
196
197
# File 'lib/search_solr_tools/translators/nsidc_json.rb', line 188

def translate_format_to_facet_format(format_json)
  return [] if format_json.nil?

  facet_format = []

  format_json.each do |format|
    facet_format << Helpers::SolrFormat.facet_binning('format', format)
  end
  facet_format
end

#translate_internal_datacenters(json) ⇒ Object

[View source]

126
127
128
129
130
131
132
133
134
135
# File 'lib/search_solr_tools/translators/nsidc_json.rb', line 126

def translate_internal_datacenters(json)
  values = []
  return values if json.nil?

  json.each do |json_entry|
    short_name = json_entry['shortName'].nil? ? '' : json_entry['shortName']
    values << short_name
  end
  values
end

#translate_iso_topic_categories(iso_topic_categories_json) ⇒ Object

[View source]

107
108
109
# File 'lib/search_solr_tools/translators/nsidc_json.rb', line 107

def translate_iso_topic_categories(iso_topic_categories_json)
  iso_topic_categories_json&.map { |t| t['name'] }
end

#translate_json_string(json, limit_values = nil) ⇒ Object

[View source]

199
200
201
202
203
204
205
206
207
208
# File 'lib/search_solr_tools/translators/nsidc_json.rb', line 199

def translate_json_string(json, limit_values = nil)
  json_strings = []

  json.each do |item|
    json_string = generate_part_array(item, limit_values).join(' > ')
    json_strings << json_string unless json_string.empty?
  end

  json_strings.uniq
end

#translate_parameters(parameters_json) ⇒ Object

[View source]

169
170
171
172
173
174
175
# File 'lib/search_solr_tools/translators/nsidc_json.rb', line 169

def translate_parameters(parameters_json)
  parameters = []
  parameters_json.each do |param_json|
    parameters.concat(generate_part_array(param_json, PARAMETER_PARTS))
  end
  parameters
end

#translate_parameters_to_facet_parameters(parameters_json) ⇒ Object

[View source]

177
178
179
180
181
182
183
184
185
186
# File 'lib/search_solr_tools/translators/nsidc_json.rb', line 177

def translate_parameters_to_facet_parameters(parameters_json)
  parameters_strings = translate_json_string(parameters_json, PARAMETER_PARTS)
  return [] if parameters_strings.nil?

  facet_params = []
  parameters_strings.each do |str|
    facet_params << Helpers::SolrFormat.parameter_binning(str)
  end
  facet_params
end

#translate_personnel_and_creators_to_authors(personnel_json, creator_json) ⇒ Object

[View source]

150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
# File 'lib/search_solr_tools/translators/nsidc_json.rb', line 150

def translate_personnel_and_creators_to_authors(personnel_json, creator_json)
  author_set = (personnel_json.to_a | creator_json.to_a)

  authors = author_set.map do |author|
    first  = author['firstName'].to_s
    middle = author['middleName'].to_s
    last   = author['lastName'].to_s

    full = [first, middle, last].reject(&:empty?)
    full.join(' ').strip
  end

  authors.reject! do |author|
    author.empty? || author == 'NSIDC User Services'
  end

  authors.uniq
end

#translate_sensor_to_facet_sensor(json) ⇒ Object

[View source]

73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/search_solr_tools/translators/nsidc_json.rb', line 73

def translate_sensor_to_facet_sensor(json)
  facet_values = []
  return facet_values if json.nil?

  json.each do |json_entry|
    long_name = json_entry['shortName'].eql?(json_entry['longName']) ? '' : json_entry['longName']
    sensor_bin = Helpers::SolrFormat.facet_binning('sensor', json_entry['shortName'].to_s)
    facet_values << if sensor_bin.eql? json_entry['shortName']
                      "#{long_name} | #{json_entry['shortName']}"
                    else
                      " | #{sensor_bin}"
                    end
  end
  facet_values
end

#translate_short_long_names_to_facet_value(json) ⇒ Object

[View source]

137
138
139
140
141
142
143
144
145
146
147
148
# File 'lib/search_solr_tools/translators/nsidc_json.rb', line 137

def translate_short_long_names_to_facet_value(json)
  facet_values = []
  return facet_values if json.nil?

  json.each do |json_entry|
    long_name = json_entry['longName'].nil? ? '' : json_entry['longName']
    short_name = json_entry['shortName'].nil? ? '' : json_entry['shortName']

    facet_values << "#{long_name} | #{short_name}"
  end
  facet_values
end

#translate_spatial_resolution_facet_values(parameters_json) ⇒ Object

[View source]

98
99
100
101
102
103
104
105
# File 'lib/search_solr_tools/translators/nsidc_json.rb', line 98

def translate_spatial_resolution_facet_values(parameters_json)
  spatial_resolutions = []
  parameters_json.each do |param_json|
    binned_res = Helpers::SolrFormat.resolution_value(param_json['spatialYResolution'], :find_index_for_single_spatial_resolution_value, Helpers::SolrFormat::SPATIAL_RESOLUTION_FACET_VALUES)
    spatial_resolutions << binned_res unless binned_res.to_s.empty?
  end
  spatial_resolutions.flatten.uniq
end

#translate_storage_location(json) ⇒ Object

[View source]

210
211
212
213
214
215
216
217
# File 'lib/search_solr_tools/translators/nsidc_json.rb', line 210

def translate_storage_location(json)
  facet_storage = []

  # Add the Earthdata Cloud feature
  facet_storage << 'In Earthdata Cloud' if json['cumulus']

  facet_storage
end

#translate_temporal_resolution_facet_values(parameters_json) ⇒ Object

[View source]

89
90
91
92
93
94
95
96
# File 'lib/search_solr_tools/translators/nsidc_json.rb', line 89

def translate_temporal_resolution_facet_values(parameters_json)
  temporal_resolutions = []
  parameters_json.each do |param_json|
    binned_temporal_res = Helpers::SolrFormat.resolution_value(param_json['temporalResolution'], :find_index_for_single_temporal_resolution_value, Helpers::SolrFormat::TEMPORAL_RESOLUTION_FACET_VALUES)
    temporal_resolutions << binned_temporal_res unless binned_temporal_res.to_s.empty?
  end
  temporal_resolutions.flatten.uniq
end