qa 4.0.0 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/app/controllers/qa/linked_data_terms_controller.rb +30 -9
- data/app/controllers/qa/terms_controller.rb +3 -2
- data/app/models/qa/linked_data/config/context_property_map.rb +6 -25
- data/app/services/qa/iri_template_service.rb +32 -24
- data/app/services/qa/linked_data/authority_service.rb +8 -0
- data/app/services/qa/linked_data/authority_url_service.rb +27 -8
- data/app/services/qa/linked_data/deep_sort_service.rb +3 -2
- data/app/services/qa/linked_data/graph_service.rb +13 -0
- data/app/services/qa/linked_data/language_service.rb +12 -0
- data/app/services/qa/linked_data/language_sort_service.rb +7 -2
- data/app/services/qa/linked_data/ldpath_service.rb +40 -0
- data/app/services/qa/linked_data/mapper/graph_ldpath_mapper_service.rb +49 -0
- data/app/services/qa/linked_data/mapper/graph_mapper_service.rb +3 -11
- data/app/services/qa/linked_data/mapper/graph_predicate_mapper_service.rb +40 -0
- data/app/services/qa/linked_data/mapper/search_results_mapper_service.rb +58 -11
- data/app/services/qa/linked_data/mapper/term_results_mapper_service.rb +80 -0
- data/config/authorities/linked_data/loc.json +13 -7
- data/config/authorities/linked_data/oclc_fast.json +13 -8
- data/lib/generators/qa/discogs/USAGE +10 -0
- data/lib/generators/qa/discogs/discogs_generator.rb +12 -0
- data/lib/generators/qa/discogs/templates/config/discogs-formats.yml +346 -0
- data/lib/generators/qa/discogs/templates/config/discogs-genres.yml +627 -0
- data/lib/generators/qa/install/templates/config/initializers/qa.rb +4 -0
- data/lib/qa.rb +6 -0
- data/lib/qa/authorities.rb +2 -0
- data/lib/qa/authorities/discogs.rb +28 -0
- data/lib/qa/authorities/discogs/discogs_instance_builder.rb +145 -0
- data/lib/qa/authorities/discogs/discogs_translation.rb +126 -0
- data/lib/qa/authorities/discogs/discogs_utils.rb +89 -0
- data/lib/qa/authorities/discogs/discogs_works_builder.rb +153 -0
- data/lib/qa/authorities/discogs/generic_authority.rb +151 -0
- data/lib/qa/authorities/discogs_subauthority.rb +9 -0
- data/lib/qa/authorities/linked_data/config.rb +7 -3
- data/lib/qa/authorities/linked_data/config/search_config.rb +99 -11
- data/lib/qa/authorities/linked_data/config/term_config.rb +112 -8
- data/lib/qa/authorities/linked_data/find_term.rb +154 -84
- data/lib/qa/authorities/linked_data/search_query.rb +76 -13
- data/lib/qa/configuration.rb +8 -0
- data/lib/qa/version.rb +1 -1
- data/spec/controllers/linked_data_terms_controller_spec.rb +151 -30
- data/spec/controllers/terms_controller_spec.rb +4 -0
- data/spec/features/linked_data/language_spec.rb +298 -0
- data/spec/fixtures/authorities/linked_data/lod_full_config.json +21 -5
- data/spec/fixtures/authorities/linked_data/lod_lang_defaults.json +4 -4
- data/spec/fixtures/authorities/linked_data/lod_lang_multi_defaults.json +4 -4
- data/spec/fixtures/authorities/linked_data/lod_lang_no_defaults.json +4 -5
- data/spec/fixtures/authorities/linked_data/lod_lang_param.json +4 -4
- data/spec/fixtures/authorities/linked_data/lod_term_uri_param_config.json +1 -1
- data/spec/fixtures/discogs-find-response-json.json +1 -0
- data/spec/fixtures/discogs-find-response-jsonld-master.json +1 -0
- data/spec/fixtures/discogs-find-response-jsonld-release.json +1 -0
- data/spec/fixtures/discogs-id-matches-master.json +1 -0
- data/spec/fixtures/discogs-id-matches-release.json +1 -0
- data/spec/fixtures/discogs-id-not-found-master.json +1 -0
- data/spec/fixtures/discogs-id-not-found-release.json +1 -0
- data/spec/fixtures/discogs-search-response-no-auth.json +1 -0
- data/spec/fixtures/discogs-search-response-no-subauth.json +1 -0
- data/spec/fixtures/discogs-search-response-subauth.json +1 -0
- data/spec/fixtures/lod_lang_search_enesfrde.rdf.xml +60 -0
- data/spec/fixtures/lod_lang_search_sv.rdf.xml +42 -0
- data/spec/fixtures/lod_loc_term_found.rdf.xml +5 -0
- data/spec/lib/authorities/discogs/generic_authority_spec.rb +235 -0
- data/spec/lib/authorities/discogs_spec.rb +17 -0
- data/spec/lib/authorities/linked_data/config_spec.rb +68 -5
- data/spec/lib/authorities/linked_data/find_term_spec.rb +298 -3
- data/spec/lib/authorities/linked_data/generic_authority_spec.rb +46 -485
- data/spec/lib/authorities/linked_data/search_config_spec.rb +154 -3
- data/spec/lib/authorities/linked_data/search_query_spec.rb +240 -3
- data/spec/lib/authorities/linked_data/term_config_spec.rb +193 -5
- data/spec/lib/configuration_spec.rb +18 -0
- data/spec/models/linked_data/config/context_property_map_spec.rb +3 -31
- data/spec/services/iri_template_service_spec.rb +54 -12
- data/spec/{lib/authorities → services}/linked_data/authority_service_spec.rb +47 -0
- data/spec/services/linked_data/language_service_spec.rb +52 -11
- data/spec/services/linked_data/ldpath_service_spec.rb +61 -0
- data/spec/services/linked_data/mapper/graph_ldpath_mapper_service_spec.rb +118 -0
- data/spec/services/linked_data/mapper/graph_predicate_mapper_service_spec.rb +110 -0
- data/spec/services/linked_data/mapper/term_results_mapper_service_spec.rb +94 -0
- data/spec/spec_helper.rb +1 -1
- data/spec/support/matchers/include_hash.rb +5 -0
- data/spec/test_app_templates/lib/generators/test_app_generator.rb +4 -0
- metadata +73 -5
- data/lib/qa/authorities/linked_data/rdf_helper.rb +0 -49
|
@@ -3,24 +3,29 @@
|
|
|
3
3
|
module Qa::Authorities
|
|
4
4
|
module LinkedData
|
|
5
5
|
class FindTerm
|
|
6
|
-
|
|
6
|
+
class_attribute :authority_service, :graph_service, :language_service, :language_sort_service, :results_mapper_service
|
|
7
|
+
self.authority_service = Qa::LinkedData::AuthorityUrlService
|
|
8
|
+
self.graph_service = Qa::LinkedData::GraphService
|
|
9
|
+
self.language_service = Qa::LinkedData::LanguageService
|
|
10
|
+
self.language_sort_service = Qa::LinkedData::LanguageSortService
|
|
11
|
+
self.results_mapper_service = Qa::LinkedData::Mapper::TermResultsMapperService
|
|
7
12
|
|
|
8
13
|
# @param [TermConfig] term_config The term portion of the config
|
|
9
14
|
def initialize(term_config)
|
|
10
15
|
@term_config = term_config
|
|
11
16
|
end
|
|
12
17
|
|
|
13
|
-
attr_reader :term_config, :full_graph, :filtered_graph, :language
|
|
14
|
-
private :full_graph, :filtered_graph, :language
|
|
18
|
+
attr_reader :term_config, :full_graph, :filtered_graph, :language, :id, :access_time_s, :normalize_time_s
|
|
19
|
+
private :full_graph, :filtered_graph, :language, :id, :access_time_s, :normalize_time_s
|
|
15
20
|
|
|
16
|
-
delegate :term_subauthority?, to: :term_config
|
|
21
|
+
delegate :term_subauthority?, :prefixes, :authority_name, to: :term_config
|
|
17
22
|
|
|
18
23
|
# Find a single term in a linked data authority
|
|
19
24
|
# @param [String] the id of the term to fetch
|
|
20
25
|
# @param [Symbol] (optional) language: language used to select literals when multi-language is supported (e.g. :en, :fr, etc.)
|
|
21
26
|
# @param [Hash] (optional) replacements: replacement values with { pattern_name (defined in YAML config) => value }
|
|
22
27
|
# @param [String] subauth: the subauthority from which to fetch the term
|
|
23
|
-
# @return [
|
|
28
|
+
# @return [Hash] json results
|
|
24
29
|
# @example Json Results for Linked Data Term
|
|
25
30
|
# { "uri":"http://id.worldcat.org/fast/530369",
|
|
26
31
|
# "id":"530369","label":"Cornell University",
|
|
@@ -34,102 +39,159 @@ module Qa::Authorities
|
|
|
34
39
|
# "http://schema.org/name":["Cornell University","Ithaca (N.Y.). Cornell University"],
|
|
35
40
|
# "http://www.w3.org/2004/02/skos/core#altLabel":["Ithaca (N.Y.). Cornell University"],
|
|
36
41
|
# "http://schema.org/sameAs":["http://id.loc.gov/authorities/names/n79021621","https://viaf.org/viaf/126293486"] } }
|
|
37
|
-
def find(id, language: nil, replacements: {}, subauth: nil, jsonld: false)
|
|
42
|
+
def find(id, language: nil, replacements: {}, subauth: nil, jsonld: false, performance_data: false) # rubocop:disable Metrics/ParameterLists
|
|
38
43
|
raise Qa::InvalidLinkedDataAuthority, "Unable to initialize linked data term sub-authority #{subauth}" unless subauth.nil? || term_subauthority?(subauth)
|
|
39
|
-
@language =
|
|
40
|
-
|
|
44
|
+
@language = language_service.preferred_language(user_language: language, authority_language: term_config.term_language)
|
|
45
|
+
@id = id
|
|
46
|
+
@performance_data = performance_data
|
|
47
|
+
@jsonld = jsonld
|
|
48
|
+
url = authority_service.build_url(action_config: term_config, action: :term, action_request: normalize_id, substitutions: replacements, subauthority: subauth, language: @language)
|
|
41
49
|
Rails.logger.info "QA Linked Data term url: #{url}"
|
|
42
50
|
load_graph(url: url)
|
|
43
|
-
|
|
44
|
-
return full_graph.dump(:jsonld, standard_prefixes: true) if jsonld
|
|
45
|
-
parse_term_authority_response(id)
|
|
51
|
+
normalize_results
|
|
46
52
|
end
|
|
47
53
|
|
|
48
54
|
private
|
|
49
55
|
|
|
50
56
|
def load_graph(url:)
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
57
|
+
access_start_dt = Time.now.utc
|
|
58
|
+
|
|
59
|
+
@full_graph = graph_service.load_graph(url: url)
|
|
60
|
+
|
|
61
|
+
access_end_dt = Time.now.utc
|
|
62
|
+
@access_time_s = access_end_dt - access_start_dt
|
|
63
|
+
Rails.logger.info("Time to receive data from authority: #{access_time_s}s")
|
|
56
64
|
end
|
|
57
65
|
|
|
58
|
-
def
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
+
def normalize_results
|
|
67
|
+
normalize_start_dt = Time.now.utc
|
|
68
|
+
normalize_end_dt = Time.now.utc
|
|
69
|
+
|
|
70
|
+
json = perform_normalization
|
|
71
|
+
|
|
72
|
+
@normalize_time_s = normalize_end_dt - normalize_start_dt
|
|
73
|
+
Rails.logger.info("Time to convert data to json: #{normalize_time_s}s")
|
|
74
|
+
json = append_performance_data(json) if performance_data? && !jsonld?
|
|
75
|
+
json
|
|
66
76
|
end
|
|
67
77
|
|
|
68
|
-
def
|
|
69
|
-
{
|
|
78
|
+
def perform_normalization
|
|
79
|
+
return "{}" unless full_graph.size.positive?
|
|
80
|
+
return full_graph.dump(:jsonld, standard_prefixes: true) if jsonld?
|
|
81
|
+
|
|
82
|
+
filter_graph
|
|
83
|
+
results = map_results
|
|
84
|
+
convert_results_to_json(results)
|
|
70
85
|
end
|
|
71
86
|
|
|
72
|
-
def
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
consolidated_results = {}
|
|
90
|
-
results.each do |statement|
|
|
91
|
-
stmt_hash = statement.to_h
|
|
92
|
-
uri = stmt_hash[:uri].to_s
|
|
93
|
-
consolidated_hash = init_consolidated_hash(consolidated_results, uri, stmt_hash[:id].to_s)
|
|
94
|
-
|
|
95
|
-
consolidated_hash[:label] = object_value(stmt_hash, consolidated_hash, :label, false)
|
|
96
|
-
altlabel = object_value(stmt_hash, consolidated_hash, :altlabel, false)
|
|
97
|
-
narrower = object_value(stmt_hash, consolidated_hash, :narrower)
|
|
98
|
-
broader = object_value(stmt_hash, consolidated_hash, :broader)
|
|
99
|
-
sameas = object_value(stmt_hash, consolidated_hash, :sameas)
|
|
100
|
-
|
|
101
|
-
consolidated_hash[:altlabel] = altlabel unless altlabel.nil?
|
|
102
|
-
consolidated_hash[:narrower] = narrower unless narrower.nil?
|
|
103
|
-
consolidated_hash[:broader] = broader unless broader.nil?
|
|
104
|
-
consolidated_hash[:sameas] = sameas unless sameas.nil?
|
|
105
|
-
consolidated_results[uri] = consolidated_hash
|
|
106
|
-
end
|
|
107
|
-
consolidated_results.each do |res|
|
|
108
|
-
consolidated_hash = res[1]
|
|
109
|
-
consolidated_hash[:label] = sort_string_by_language consolidated_hash[:label]
|
|
110
|
-
consolidated_hash[:altlabel] = sort_string_by_language consolidated_hash[:altlabel]
|
|
111
|
-
consolidated_hash[:sort] = sort_string_by_language consolidated_hash[:sort]
|
|
112
|
-
end
|
|
113
|
-
consolidated_results
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
def convert_term_to_json(consolidated_results)
|
|
117
|
-
json_results = []
|
|
118
|
-
consolidated_results.each do |uri, h|
|
|
119
|
-
json_hash = { uri: uri, id: h[:id], label: h[:label] }
|
|
120
|
-
json_hash[:altlabel] = h[:altlabel] unless h[:altlabel].nil?
|
|
121
|
-
json_hash[:narrower] = h[:narrower] unless h[:narrower].nil?
|
|
122
|
-
json_hash[:broader] = h[:broader] unless h[:broader].nil?
|
|
123
|
-
json_hash[:sameas] = h[:sameas] unless h[:sameas].nil?
|
|
124
|
-
json_results << json_hash
|
|
87
|
+
def filter_graph
|
|
88
|
+
@filtered_graph = graph_service.deep_copy(graph: @full_graph)
|
|
89
|
+
@filtered_graph = graph_service.filter(graph: @filtered_graph, language: language) unless language.blank?
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def map_results
|
|
93
|
+
predicate_map = preds_for_term
|
|
94
|
+
ldpath_map = ldpaths_for_term
|
|
95
|
+
|
|
96
|
+
raise Qa::InvalidConfiguration, "do not specify results using both predicates and ldpath in term configuration for LOD authority #{authority_name} (ldpath is preferred)" if predicate_map.present? && ldpath_map.present? # rubocop:disable Metrics/LineLength
|
|
97
|
+
raise Qa::InvalidConfiguration, "must specify label_ldpath or label_predicate in term configuration for LOD authority #{authority_name} (label_ldpath is preferred)" unless ldpath_map.key?(:label) || predicate_map.key?(:label) # rubocop:disable Metrics/LineLength
|
|
98
|
+
|
|
99
|
+
if predicate_map.present?
|
|
100
|
+
Qa.deprecation_warning(
|
|
101
|
+
in_msg: 'Qa::Authorities::LinkedData::FindTerm',
|
|
102
|
+
msg: 'defining results using predicates in term config is deprecated; update to define using ldpaths'
|
|
103
|
+
)
|
|
125
104
|
end
|
|
126
|
-
|
|
105
|
+
|
|
106
|
+
results_mapper_service.map_values(graph: @filtered_graph, subject_uri: uri, prefixes: prefixes,
|
|
107
|
+
ldpath_map: ldpaths_for_term, predicate_map: preds_for_term)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def normalize_id
|
|
111
|
+
return id if expects_uri?
|
|
112
|
+
authority_name.to_s.casecmp('loc').zero? ? id.delete(' ') : id
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def expects_uri?
|
|
116
|
+
term_config.term_id_expects_uri?
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def uri
|
|
120
|
+
return @uri if @uri.present?
|
|
121
|
+
return @uri = RDF::URI.new(id) if expects_uri?
|
|
122
|
+
@uri = graph_service.subjects_for_object_value(graph: @filtered_graph, predicate: RDF::URI.new(term_config.term_results_id_predicate), object_value: id.gsub('%20', ' ')).first
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def ldpaths_for_term
|
|
126
|
+
label_ldpath = term_config.term_results_label_ldpath
|
|
127
|
+
return {} if label_ldpath.blank?
|
|
128
|
+
ldpaths = { label: label_ldpath }
|
|
129
|
+
ldpaths.merge(optional_ldpaths)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def optional_ldpaths
|
|
133
|
+
opt_ldpaths = {}
|
|
134
|
+
opt_ldpaths[:altlabel] = term_config.term_results_altlabel_ldpath
|
|
135
|
+
opt_ldpaths[:id] = term_config.term_results_id_ldpath
|
|
136
|
+
opt_ldpaths[:narrower] = term_config.term_results_narrower_ldpath
|
|
137
|
+
opt_ldpaths[:broader] = term_config.term_results_broader_ldpath
|
|
138
|
+
opt_ldpaths[:sameas] = term_config.term_results_sameas_ldpath
|
|
139
|
+
opt_ldpaths.delete_if { |_k, v| v.blank? }
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def jsonld?
|
|
143
|
+
@jsonld == true
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def performance_data?
|
|
147
|
+
@performance_data == true
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def preds_for_term
|
|
151
|
+
label_pred_uri = term_config.term_results_label_predicate
|
|
152
|
+
return {} if label_pred_uri.blank?
|
|
153
|
+
preds = { label: label_pred_uri }
|
|
154
|
+
preds.merge(optional_preds)
|
|
127
155
|
end
|
|
128
156
|
|
|
129
|
-
def
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
157
|
+
def optional_preds
|
|
158
|
+
opt_preds = {}
|
|
159
|
+
opt_preds[:altlabel] = term_config.term_results_altlabel_predicate
|
|
160
|
+
opt_preds[:id] = term_config.term_results_id_predicate
|
|
161
|
+
opt_preds[:narrower] = term_config.term_results_narrower_predicate
|
|
162
|
+
opt_preds[:broader] = term_config.term_results_broader_predicate
|
|
163
|
+
opt_preds[:sameas] = term_config.term_results_sameas_predicate
|
|
164
|
+
opt_preds.delete_if { |_k, v| v.blank? }
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def convert_results_to_json(results)
|
|
168
|
+
json_hash = { uri: uri.to_s }
|
|
169
|
+
json_hash[:id] = results.key?(:id) && results[:id].present? ? results[:id].first.to_s : uri.to_s
|
|
170
|
+
json_hash[:label] = sort_literals(results, :label)
|
|
171
|
+
json_hash.merge!(optional_results_to_json(results))
|
|
172
|
+
predicates_hash = predicates_with_subject_uri(uri)
|
|
173
|
+
json_hash['predicates'] = predicates_hash if predicates_hash.present?
|
|
174
|
+
json_hash
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def optional_results_to_json(results)
|
|
178
|
+
opt_results_json = {}
|
|
179
|
+
opt_results_json[:altlabel] = sort_literals(results, :altlabel)
|
|
180
|
+
opt_results_json[:narrower] = extract_result(results, :narrower)
|
|
181
|
+
opt_results_json[:broader] = extract_result(results, :broader)
|
|
182
|
+
opt_results_json[:sameas] = extract_result(results, :sameas)
|
|
183
|
+
opt_results_json.delete_if { |_k, v| v.blank? }
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
def extract_result(results, key)
|
|
187
|
+
return nil unless results.key?(key) && results[key].present?
|
|
188
|
+
results[key].map(&:to_s)
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
def sort_literals(results, key)
|
|
192
|
+
return nil unless results.key? key
|
|
193
|
+
return [] if results[key].blank?
|
|
194
|
+
language_sort_service.new(results[key], language).uniq_sorted_strings
|
|
133
195
|
end
|
|
134
196
|
|
|
135
197
|
def predicates_with_subject_uri(expected_uri) # rubocop:disable Metrics/MethodLength
|
|
@@ -152,6 +214,14 @@ module Qa::Authorities
|
|
|
152
214
|
end
|
|
153
215
|
predicates_hash
|
|
154
216
|
end
|
|
217
|
+
|
|
218
|
+
def append_performance_data(results)
|
|
219
|
+
performance = { predicate_count: results['predicates'].size,
|
|
220
|
+
fetch_time_s: access_time_s,
|
|
221
|
+
normalization_time_s: normalize_time_s,
|
|
222
|
+
total_time_s: (access_time_s + normalize_time_s) }
|
|
223
|
+
{ performance: performance, results: results }
|
|
224
|
+
end
|
|
155
225
|
end
|
|
156
226
|
end
|
|
157
227
|
end
|
|
@@ -15,10 +15,10 @@ module Qa::Authorities
|
|
|
15
15
|
@search_config = search_config
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
attr_reader :search_config, :graph, :language
|
|
19
|
-
private :graph, :language
|
|
18
|
+
attr_reader :search_config, :graph, :language, :access_time_s, :normalize_time_s
|
|
19
|
+
private :graph, :language, :access_time_s, :normalize_time_s
|
|
20
20
|
|
|
21
|
-
delegate :subauthority?, :supports_sort?, to: :search_config
|
|
21
|
+
delegate :subauthority?, :supports_sort?, :prefixes, :authority_name, to: :search_config
|
|
22
22
|
|
|
23
23
|
# Search a linked data authority
|
|
24
24
|
# @praram [String] the query
|
|
@@ -26,32 +26,66 @@ module Qa::Authorities
|
|
|
26
26
|
# @param replacements [Hash] (optional) replacement values with { pattern_name (defined in YAML config) => value }
|
|
27
27
|
# @param subauth [String] (optional) the subauthority to query
|
|
28
28
|
# @param context [Boolean] (optional) true if context should be returned with the results; otherwise, false (default: false)
|
|
29
|
+
# @param performance_data [Boolean] (optional) true if include_performance_data should be returned with the results; otherwise, false (default: false)
|
|
29
30
|
# @return [String] json results
|
|
30
31
|
# @example Json Results for Linked Data Search
|
|
31
32
|
# [ {"uri":"http://id.worldcat.org/fast/5140","id":"5140","label":"Cornell, Joseph"},
|
|
32
33
|
# {"uri":"http://id.worldcat.org/fast/72456","id":"72456","label":"Cornell, Sarah Maria, 1802-1832"},
|
|
33
34
|
# {"uri":"http://id.worldcat.org/fast/409667","id":"409667","label":"Cornell, Ezra, 1807-1874"} ]
|
|
34
|
-
def search(query, language: nil, replacements: {}, subauth: nil, context: false)
|
|
35
|
+
def search(query, language: nil, replacements: {}, subauth: nil, context: false, performance_data: false) # rubocop:disable Metrics/ParameterLists
|
|
35
36
|
raise Qa::InvalidLinkedDataAuthority, "Unable to initialize linked data search sub-authority #{subauth}" unless subauth.nil? || subauthority?(subauth)
|
|
36
37
|
@context = context
|
|
38
|
+
@performance_data = performance_data
|
|
37
39
|
@language = language_service.preferred_language(user_language: language, authority_language: search_config.language)
|
|
38
|
-
url = authority_service.build_url(action_config: search_config, action: :search, action_request: query, substitutions: replacements, subauthority: subauth)
|
|
40
|
+
url = authority_service.build_url(action_config: search_config, action: :search, action_request: query, substitutions: replacements, subauthority: subauth, language: @language)
|
|
39
41
|
Rails.logger.info "QA Linked Data search url: #{url}"
|
|
40
42
|
load_graph(url: url)
|
|
41
|
-
|
|
43
|
+
normalize_results
|
|
42
44
|
end
|
|
43
45
|
|
|
44
46
|
private
|
|
45
47
|
|
|
46
48
|
def load_graph(url:)
|
|
49
|
+
access_start_dt = Time.now.utc
|
|
50
|
+
|
|
47
51
|
@graph = graph_service.load_graph(url: url)
|
|
52
|
+
|
|
53
|
+
access_end_dt = Time.now.utc
|
|
54
|
+
@access_time_s = access_end_dt - access_start_dt
|
|
55
|
+
Rails.logger.info("Time to receive data from authority: #{access_time_s}s")
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def normalize_results
|
|
59
|
+
normalize_start_dt = Time.now.utc
|
|
60
|
+
|
|
48
61
|
@graph = graph_service.filter(graph: @graph, language: language, remove_blanknode_subjects: true)
|
|
62
|
+
results = map_results
|
|
63
|
+
json = convert_results_to_json(results)
|
|
64
|
+
|
|
65
|
+
normalize_end_dt = Time.now.utc
|
|
66
|
+
@normalize_time_s = normalize_end_dt - normalize_start_dt
|
|
67
|
+
Rails.logger.info("Time to convert data to json: #{normalize_time_s}s")
|
|
68
|
+
json = append_performance_data(json) if performance_data?
|
|
69
|
+
json
|
|
49
70
|
end
|
|
50
71
|
|
|
51
|
-
def
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
72
|
+
def map_results
|
|
73
|
+
predicate_map = preds_for_search
|
|
74
|
+
ldpath_map = ldpaths_for_search
|
|
75
|
+
|
|
76
|
+
raise Qa::InvalidConfiguration, "do not specify results using both predicates and ldpath in search configuration for LOD authority #{authority_name} (ldpath is preferred)" if predicate_map.present? && ldpath_map.present? # rubocop:disable Metrics/LineLength
|
|
77
|
+
raise Qa::InvalidConfiguration, "must specify label_ldpath or label_predicate in search configuration for LOD authority #{authority_name} (label_ldpath is preferred)" unless ldpath_map.key?(:label) || predicate_map.key?(:label) # rubocop:disable Metrics/LineLength
|
|
78
|
+
|
|
79
|
+
if predicate_map.present?
|
|
80
|
+
Qa.deprecation_warning(
|
|
81
|
+
in_msg: 'Qa::Authorities::LinkedData::SearchQuery',
|
|
82
|
+
msg: 'defining results using predicates in search config is deprecated; update to define using ldpaths'
|
|
83
|
+
)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
results_mapper_service.map_values(graph: @graph, prefixes: prefixes, ldpath_map: ldpath_map,
|
|
87
|
+
predicate_map: predicate_map, sort_key: :sort,
|
|
88
|
+
preferred_language: @language, context_map: context_map)
|
|
55
89
|
end
|
|
56
90
|
|
|
57
91
|
def context_map
|
|
@@ -62,11 +96,32 @@ module Qa::Authorities
|
|
|
62
96
|
@context == true
|
|
63
97
|
end
|
|
64
98
|
|
|
99
|
+
def performance_data?
|
|
100
|
+
@performance_data == true
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def ldpaths_for_search
|
|
104
|
+
label_ldpath = search_config.results_label_ldpath
|
|
105
|
+
return {} if label_ldpath.blank?
|
|
106
|
+
ldpaths = { label: label_ldpath, uri: :subject_uri }
|
|
107
|
+
ldpaths[:altlabel] = search_config.results_altlabel_ldpath unless search_config.results_altlabel_ldpath.nil?
|
|
108
|
+
ldpaths[:id] = id_ldpath.present? ? id_ldpath : :subject_uri
|
|
109
|
+
ldpaths[:sort] = sort_ldpath.present? ? sort_ldpath : ldpaths[:label]
|
|
110
|
+
ldpaths
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def id_ldpath
|
|
114
|
+
@id_ldpath ||= search_config.results_id_ldpath
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def sort_ldpath
|
|
118
|
+
@sort_ldpath ||= search_config.results_sort_ldpath
|
|
119
|
+
end
|
|
120
|
+
|
|
65
121
|
def preds_for_search
|
|
66
122
|
label_pred_uri = search_config.results_label_predicate
|
|
67
|
-
|
|
68
|
-
preds = { label: label_pred_uri }
|
|
69
|
-
preds[:uri] = :subject_uri
|
|
123
|
+
return {} if label_pred_uri.blank?
|
|
124
|
+
preds = { label: label_pred_uri, uri: :subject_uri }
|
|
70
125
|
preds[:altlabel] = search_config.results_altlabel_predicate unless search_config.results_altlabel_predicate.nil?
|
|
71
126
|
preds[:id] = id_predicate.present? ? id_predicate : :subject_uri
|
|
72
127
|
preds[:sort] = sort_predicate.present? ? sort_predicate : preds[:label]
|
|
@@ -111,6 +166,14 @@ module Qa::Authorities
|
|
|
111
166
|
lbl = '[' + lbl + ']' if labels.size > 1
|
|
112
167
|
lbl
|
|
113
168
|
end
|
|
169
|
+
|
|
170
|
+
def append_performance_data(results)
|
|
171
|
+
performance = { result_count: results.size,
|
|
172
|
+
fetch_time_s: access_time_s,
|
|
173
|
+
normalization_time_s: normalize_time_s,
|
|
174
|
+
total_time_s: (access_time_s + normalize_time_s) }
|
|
175
|
+
{ performance: performance, results: results }
|
|
176
|
+
end
|
|
114
177
|
end
|
|
115
178
|
end
|
|
116
179
|
end
|
data/lib/qa/configuration.rb
CHANGED
|
@@ -37,5 +37,13 @@ module Qa
|
|
|
37
37
|
def default_language
|
|
38
38
|
@default_language ||= :en
|
|
39
39
|
end
|
|
40
|
+
|
|
41
|
+
# When true, prevents ldpath requests from making additional network calls. All values will come from the context graph
|
|
42
|
+
# passed to the ldpath request.
|
|
43
|
+
attr_writer :limit_ldpath_to_context
|
|
44
|
+
def limit_ldpath_to_context?
|
|
45
|
+
return true if @limit_ldpath_to_context.nil?
|
|
46
|
+
@limit_ldpath_to_context
|
|
47
|
+
end
|
|
40
48
|
end
|
|
41
49
|
end
|
data/lib/qa/version.rb
CHANGED
|
@@ -81,14 +81,54 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
|
81
81
|
end
|
|
82
82
|
|
|
83
83
|
describe '#list' do
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
84
|
+
context 'when details=false' do
|
|
85
|
+
let(:expected_results) { ['Auth1', 'Auth2', 'Auth3'] }
|
|
86
|
+
before do
|
|
87
|
+
allow(Qa::LinkedData::AuthorityService).to receive(:authority_names).and_return(expected_results)
|
|
88
|
+
end
|
|
89
|
+
it 'returns list of authorities' do
|
|
90
|
+
get :list
|
|
91
|
+
expect(response).to be_successful
|
|
92
|
+
expect(response.body).to eq expected_results.to_json
|
|
93
|
+
end
|
|
87
94
|
end
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
95
|
+
|
|
96
|
+
context 'when details=true' do
|
|
97
|
+
let(:expected_results) do
|
|
98
|
+
[
|
|
99
|
+
{
|
|
100
|
+
"label" => "oclc_fast term (QA)",
|
|
101
|
+
"uri" => "urn:qa:term:oclc_fast",
|
|
102
|
+
"authority" => "oclc_fast",
|
|
103
|
+
"action" => "term",
|
|
104
|
+
"language" => ["en"]
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"label" => "oclc_fast search (QA)",
|
|
108
|
+
"uri" => "urn:qa:search:oclc_fast",
|
|
109
|
+
"authority" => "oclc_fast",
|
|
110
|
+
"action" => "search",
|
|
111
|
+
"language" => ["en"]
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"label" => "oclc_fast search topic (QA)",
|
|
115
|
+
"uri" => "urn:qa:search:oclc_fast:topic",
|
|
116
|
+
"authority" => "oclc_fast",
|
|
117
|
+
"subauthority" => "topic",
|
|
118
|
+
"action" => "search",
|
|
119
|
+
"language" => ["en"]
|
|
120
|
+
}
|
|
121
|
+
]
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
before do
|
|
125
|
+
allow(Qa::LinkedData::AuthorityService).to receive(:authority_details).and_return(expected_results)
|
|
126
|
+
end
|
|
127
|
+
it 'returns list of authorities' do
|
|
128
|
+
get :list, params: { details: 'true' }
|
|
129
|
+
expect(response).to be_successful
|
|
130
|
+
expect(response.body).to eq expected_results.to_json
|
|
131
|
+
end
|
|
92
132
|
end
|
|
93
133
|
end
|
|
94
134
|
|
|
@@ -254,6 +294,33 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
|
254
294
|
expect(results.first.key?('context')).to be false
|
|
255
295
|
end
|
|
256
296
|
end
|
|
297
|
+
|
|
298
|
+
context 'when requesting performance data' do
|
|
299
|
+
before do
|
|
300
|
+
Qa.config.disable_cors_headers
|
|
301
|
+
stub_request(:get, 'http://experimental.worldcat.org/fast/search?maximumRecords=3&query=cql.any%20all%20%22cornell%22&sortKeys=usage')
|
|
302
|
+
.to_return(status: 200, body: webmock_fixture('lod_oclc_all_query_3_results.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
|
303
|
+
end
|
|
304
|
+
it "returns basic data + performance data when performance_data='true'" do
|
|
305
|
+
get :search, params: { q: 'cornell', vocab: 'OCLC_FAST', maximumRecords: '3', performance_data: 'true' }
|
|
306
|
+
expect(response).to be_successful
|
|
307
|
+
results = JSON.parse(response.body)
|
|
308
|
+
expect(results).to be_kind_of Hash
|
|
309
|
+
expect(results.keys).to match_array ['performance', 'results']
|
|
310
|
+
expect(results['performance'].keys).to match_array ['result_count', 'fetch_time_s', 'normalization_time_s', 'total_time_s']
|
|
311
|
+
expect(results['performance']['total_time_s']).to eq results['performance']['fetch_time_s'] + results['performance']['normalization_time_s']
|
|
312
|
+
expect(results['performance']['result_count']).to eq 3
|
|
313
|
+
expect(results['results'].count).to eq 3
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
it "returns basic data only when performance_data='false'" do
|
|
317
|
+
get :search, params: { q: 'cornell', vocab: 'OCLC_FAST', maximumRecords: '3', performance_data: 'false' }
|
|
318
|
+
expect(response).to be_successful
|
|
319
|
+
results = JSON.parse(response.body)
|
|
320
|
+
expect(results).to be_kind_of Array
|
|
321
|
+
expect(results.size).to eq 3
|
|
322
|
+
end
|
|
323
|
+
end
|
|
257
324
|
end
|
|
258
325
|
|
|
259
326
|
describe '#show' do
|
|
@@ -378,48 +445,75 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
|
378
445
|
.to_return(status: 200, body: webmock_fixture('lod_loc_term_found.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
|
379
446
|
end
|
|
380
447
|
it 'succeeds and defaults to json content type' do
|
|
381
|
-
get :show, params: { id: '
|
|
448
|
+
get :show, params: { id: 'sh 85118553', vocab: 'LOC', subauthority: 'subjects' }
|
|
382
449
|
expect(response).to be_successful
|
|
383
450
|
expect(response.content_type).to eq 'application/json'
|
|
384
451
|
end
|
|
385
452
|
end
|
|
386
453
|
end
|
|
454
|
+
|
|
455
|
+
context 'when requesting performance data' do
|
|
456
|
+
before do
|
|
457
|
+
stub_request(:get, 'http://id.loc.gov/authorities/subjects/sh85118553')
|
|
458
|
+
.to_return(status: 200, body: webmock_fixture('lod_loc_term_found.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
|
459
|
+
end
|
|
460
|
+
it "returns basic data + performance data when performance_data='true'" do
|
|
461
|
+
get :show, params: { id: 'sh 85118553', vocab: 'LOC', subauthority: 'subjects', performance_data: 'true' }
|
|
462
|
+
expect(response).to be_successful
|
|
463
|
+
results = JSON.parse(response.body)
|
|
464
|
+
expect(results).to be_kind_of Hash
|
|
465
|
+
expect(results.keys).to match_array ['performance', 'results']
|
|
466
|
+
expect(results['performance'].keys).to match_array ['predicate_count', 'fetch_time_s', 'normalization_time_s', 'total_time_s']
|
|
467
|
+
expect(results['performance']['total_time_s']).to eq results['performance']['fetch_time_s'] + results['performance']['normalization_time_s']
|
|
468
|
+
expect(results['performance']['predicate_count']).to eq 15
|
|
469
|
+
expect(results['results']['predicates'].count).to eq 15
|
|
470
|
+
end
|
|
471
|
+
|
|
472
|
+
it "returns basic data only when performance_data='false'" do
|
|
473
|
+
get :show, params: { id: 'sh 85118553', vocab: 'LOC', subauthority: 'subjects', performance_data: 'false' }
|
|
474
|
+
expect(response).to be_successful
|
|
475
|
+
results = JSON.parse(response.body)
|
|
476
|
+
expect(results).to be_kind_of Hash
|
|
477
|
+
expect(results.keys).not_to include('performance')
|
|
478
|
+
expect(results['predicates'].size).to eq 15
|
|
479
|
+
end
|
|
480
|
+
end
|
|
387
481
|
end
|
|
388
482
|
|
|
389
483
|
describe '#fetch' do
|
|
390
484
|
context 'producing internal server error' do
|
|
391
485
|
context 'when server returns 500' do
|
|
392
486
|
before do
|
|
393
|
-
stub_request(:get, 'http://localhost/test_default/term?uri=http://
|
|
487
|
+
stub_request(:get, 'http://localhost/test_default/term?uri=http://id.worldcat.org/fast/530369').to_return(status: 500)
|
|
394
488
|
end
|
|
395
489
|
it 'returns 500' do
|
|
396
|
-
expect(Rails.logger).to receive(:warn).with("Internal Server Error - Fetch term http://
|
|
397
|
-
get :fetch, params: { vocab: 'LOD_TERM_URI_PARAM_CONFIG', uri: 'http://
|
|
490
|
+
expect(Rails.logger).to receive(:warn).with("Internal Server Error - Fetch term http://id.worldcat.org/fast/530369 unsuccessful for authority LOD_TERM_URI_PARAM_CONFIG")
|
|
491
|
+
get :fetch, params: { vocab: 'LOD_TERM_URI_PARAM_CONFIG', uri: 'http://id.worldcat.org/fast/530369' }
|
|
398
492
|
expect(response.code).to eq('500')
|
|
399
493
|
end
|
|
400
494
|
end
|
|
401
495
|
|
|
402
496
|
context 'when rdf format error' do
|
|
403
497
|
before do
|
|
404
|
-
stub_request(:get, 'http://localhost/test_default/term?uri=http://
|
|
498
|
+
stub_request(:get, 'http://localhost/test_default/term?uri=http://id.worldcat.org/fast/530369').to_return(status: 200)
|
|
405
499
|
allow(RDF::Graph).to receive(:load).and_raise(RDF::FormatError)
|
|
406
500
|
end
|
|
407
501
|
it 'returns 500' do
|
|
408
|
-
msg = "RDF Format Error - Results from fetch term http://
|
|
502
|
+
msg = "RDF Format Error - Results from fetch term http://id.worldcat.org/fast/530369 for authority LOD_TERM_URI_PARAM_CONFIG was not identified as a valid RDF format. " \
|
|
409
503
|
"You may need to include the linkeddata gem."
|
|
410
504
|
expect(Rails.logger).to receive(:warn).with(msg)
|
|
411
|
-
get :fetch, params: { uri: 'http://
|
|
505
|
+
get :fetch, params: { uri: 'http://id.worldcat.org/fast/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG' }
|
|
412
506
|
expect(response.code).to eq('500')
|
|
413
507
|
end
|
|
414
508
|
end
|
|
415
509
|
|
|
416
510
|
context "when error isn't specifically handled" do
|
|
417
511
|
before do
|
|
418
|
-
stub_request(:get, 'http://localhost/test_default/term?uri=http://
|
|
512
|
+
stub_request(:get, 'http://localhost/test_default/term?uri=http://id.worldcat.org/fast/530369').to_return(status: 501)
|
|
419
513
|
end
|
|
420
514
|
it 'returns 500' do
|
|
421
|
-
expect(Rails.logger).to receive(:warn).with("Internal Server Error - Fetch term http://
|
|
422
|
-
get :fetch, params: { uri: 'http://
|
|
515
|
+
expect(Rails.logger).to receive(:warn).with("Internal Server Error - Fetch term http://id.worldcat.org/fast/530369 unsuccessful for authority LOD_TERM_URI_PARAM_CONFIG")
|
|
516
|
+
get :fetch, params: { uri: 'http://id.worldcat.org/fast/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG' }
|
|
423
517
|
expect(response.code).to eq('500')
|
|
424
518
|
end
|
|
425
519
|
end
|
|
@@ -427,11 +521,11 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
|
427
521
|
|
|
428
522
|
context 'when service unavailable' do
|
|
429
523
|
before do
|
|
430
|
-
stub_request(:get, 'http://localhost/test_default/term?uri=http://
|
|
524
|
+
stub_request(:get, 'http://localhost/test_default/term?uri=http://id.worldcat.org/fast/530369').to_return(status: 503)
|
|
431
525
|
end
|
|
432
526
|
it 'returns 503' do
|
|
433
|
-
expect(Rails.logger).to receive(:warn).with("Service Unavailable - Fetch term http://
|
|
434
|
-
get :fetch, params: { uri: 'http://
|
|
527
|
+
expect(Rails.logger).to receive(:warn).with("Service Unavailable - Fetch term http://id.worldcat.org/fast/530369 unsuccessful for authority LOD_TERM_URI_PARAM_CONFIG")
|
|
528
|
+
get :fetch, params: { uri: 'http://id.worldcat.org/fast/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG' }
|
|
435
529
|
expect(response.code).to eq('503')
|
|
436
530
|
end
|
|
437
531
|
end
|
|
@@ -450,19 +544,19 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
|
450
544
|
context 'in LOD_TERM_URI_PARAM_CONFIG authority' do
|
|
451
545
|
context 'term found' do
|
|
452
546
|
before do
|
|
453
|
-
stub_request(:get, 'http://localhost/test_default/term?uri=http://
|
|
547
|
+
stub_request(:get, 'http://localhost/test_default/term?uri=http://id.worldcat.org/fast/530369')
|
|
454
548
|
.to_return(status: 200, body: webmock_fixture('lod_oclc_term_found.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
|
455
549
|
end
|
|
456
550
|
|
|
457
551
|
it 'succeeds and defaults to json content type' do
|
|
458
|
-
get :fetch, params: { uri: 'http://
|
|
552
|
+
get :fetch, params: { uri: 'http://id.worldcat.org/fast/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG' }
|
|
459
553
|
expect(response).to be_successful
|
|
460
554
|
expect(response.content_type).to eq 'application/json'
|
|
461
555
|
end
|
|
462
556
|
|
|
463
557
|
context 'and it was requested as json' do
|
|
464
558
|
it 'succeeds and returns term data as json content type' do
|
|
465
|
-
get :fetch, params: { uri: 'http://
|
|
559
|
+
get :fetch, params: { uri: 'http://id.worldcat.org/fast/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG', format: 'json' }
|
|
466
560
|
expect(response).to be_successful
|
|
467
561
|
expect(response.content_type).to eq 'application/json'
|
|
468
562
|
end
|
|
@@ -470,7 +564,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
|
470
564
|
|
|
471
565
|
context 'and it was requested as jsonld' do
|
|
472
566
|
it 'succeeds and returns term data as jsonld content type' do
|
|
473
|
-
get :fetch, params: { uri: 'http://
|
|
567
|
+
get :fetch, params: { uri: 'http://id.worldcat.org/fast/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG', format: 'jsonld' }
|
|
474
568
|
expect(response).to be_successful
|
|
475
569
|
expect(response.content_type).to eq 'application/ld+json'
|
|
476
570
|
expect(JSON.parse(response.body).keys).to match_array ["@context", "@graph"]
|
|
@@ -479,11 +573,11 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
|
479
573
|
|
|
480
574
|
context 'blank nodes not included in predicates list' do
|
|
481
575
|
before do
|
|
482
|
-
stub_request(:get, 'http://localhost/test_default/term?uri=http://
|
|
576
|
+
stub_request(:get, 'http://localhost/test_default/term?uri=http://id.worldcat.org/fast/530369wbn')
|
|
483
577
|
.to_return(status: 200, body: webmock_fixture('lod_term_with_blanknode_objects.nt'), headers: { 'Content-Type' => 'application/n-triples' })
|
|
484
578
|
end
|
|
485
579
|
it 'succeeds' do
|
|
486
|
-
get :fetch, params: { uri: 'http://
|
|
580
|
+
get :fetch, params: { uri: 'http://id.worldcat.org/fast/530369wbn', vocab: 'LOD_TERM_URI_PARAM_CONFIG' }
|
|
487
581
|
expect(response).to be_successful
|
|
488
582
|
end
|
|
489
583
|
end
|
|
@@ -492,11 +586,11 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
|
492
586
|
context 'when cors headers are enabled' do
|
|
493
587
|
before do
|
|
494
588
|
Qa.config.enable_cors_headers
|
|
495
|
-
stub_request(:get, 'http://localhost/test_default/term?uri=http://
|
|
589
|
+
stub_request(:get, 'http://localhost/test_default/term?uri=http://id.worldcat.org/fast/530369')
|
|
496
590
|
.to_return(status: 200, body: webmock_fixture('lod_oclc_term_found.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
|
497
591
|
end
|
|
498
592
|
it 'Access-Control-Allow-Origin is *' do
|
|
499
|
-
get :fetch, params: { uri: 'http://
|
|
593
|
+
get :fetch, params: { uri: 'http://id.worldcat.org/fast/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG' }
|
|
500
594
|
expect(response.headers['Access-Control-Allow-Origin']).to eq '*'
|
|
501
595
|
end
|
|
502
596
|
end
|
|
@@ -504,15 +598,42 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
|
504
598
|
context 'when cors headers are disabled' do
|
|
505
599
|
before do
|
|
506
600
|
Qa.config.disable_cors_headers
|
|
507
|
-
stub_request(:get, 'http://localhost/test_default/term?uri=http://
|
|
601
|
+
stub_request(:get, 'http://localhost/test_default/term?uri=http://id.worldcat.org/fast/530369')
|
|
508
602
|
.to_return(status: 200, body: webmock_fixture('lod_oclc_term_found.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
|
509
603
|
end
|
|
510
604
|
it 'Access-Control-Allow-Origin is not present' do
|
|
511
|
-
get :fetch, params: { uri: 'http://
|
|
605
|
+
get :fetch, params: { uri: 'http://id.worldcat.org/fast/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG' }
|
|
512
606
|
expect(response.headers.key?('Access-Control-Allow-Origin')).to be false
|
|
513
607
|
end
|
|
514
608
|
end
|
|
515
609
|
end
|
|
610
|
+
|
|
611
|
+
context 'when requesting performance data' do
|
|
612
|
+
before do
|
|
613
|
+
stub_request(:get, 'http://localhost/test_default/term?uri=http://id.worldcat.org/fast/530369')
|
|
614
|
+
.to_return(status: 200, body: webmock_fixture('lod_oclc_term_found.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
|
615
|
+
end
|
|
616
|
+
it "returns basic data + performance data when performance_data='true'" do
|
|
617
|
+
get :fetch, params: { uri: 'http://id.worldcat.org/fast/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG', performance_data: 'true' }
|
|
618
|
+
expect(response).to be_successful
|
|
619
|
+
results = JSON.parse(response.body)
|
|
620
|
+
expect(results).to be_kind_of Hash
|
|
621
|
+
expect(results.keys).to match_array ['performance', 'results']
|
|
622
|
+
expect(results['performance'].keys).to match_array ['predicate_count', 'fetch_time_s', 'normalization_time_s', 'total_time_s']
|
|
623
|
+
expect(results['performance']['total_time_s']).to eq results['performance']['fetch_time_s'] + results['performance']['normalization_time_s']
|
|
624
|
+
expect(results['performance']['predicate_count']).to eq 7
|
|
625
|
+
expect(results['results']['predicates'].count).to eq 7
|
|
626
|
+
end
|
|
627
|
+
|
|
628
|
+
it "returns basic data only when performance_data='false'" do
|
|
629
|
+
get :fetch, params: { uri: 'http://id.worldcat.org/fast/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG', performance_data: 'false' }
|
|
630
|
+
expect(response).to be_successful
|
|
631
|
+
results = JSON.parse(response.body)
|
|
632
|
+
expect(results).to be_kind_of Hash
|
|
633
|
+
expect(results.keys).not_to include('performance')
|
|
634
|
+
expect(results['predicates'].size).to eq 7
|
|
635
|
+
end
|
|
636
|
+
end
|
|
516
637
|
end
|
|
517
638
|
|
|
518
639
|
describe '#reload' do
|