skala 0.3.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (169) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -4
  3. data/Gemfile +10 -1
  4. data/LICENSE.txt +17 -18
  5. data/README.md +1 -34
  6. data/README.primo_adapter.md +42 -0
  7. data/bin/console +11 -0
  8. data/config/initializers/skala.rb +5 -0
  9. data/config/skala.yml +65 -0
  10. data/db/migrate/20141006133522_create_skala_users.rb +13 -0
  11. data/db/migrate/20141006133649_create_skala_user_watch_lists.rb +14 -0
  12. data/db/migrate/20141006135644_create_skala_user_watch_list_entries.rb +13 -0
  13. data/db/migrate/20141006140435_create_skala_user_notes.rb +16 -0
  14. data/lib/skala.rb +36 -3
  15. data/lib/skala/adapter.rb +122 -4
  16. data/lib/skala/adapter/authenticate_user.rb +4 -0
  17. data/lib/skala/adapter/create_user_hold_request.rb +7 -0
  18. data/lib/skala/adapter/create_user_hold_request/result.rb +10 -0
  19. data/lib/skala/adapter/delete_user_hold_request.rb +7 -0
  20. data/lib/skala/adapter/get_record_holdable_items.rb +5 -0
  21. data/lib/skala/adapter/get_record_holdable_items/result.rb +14 -0
  22. data/lib/skala/adapter/get_record_items.rb +5 -0
  23. data/lib/skala/adapter/get_record_items/result.rb +14 -0
  24. data/lib/skala/adapter/get_records.rb +5 -0
  25. data/lib/skala/adapter/get_records/result.rb +28 -0
  26. data/lib/skala/adapter/get_user.rb +4 -0
  27. data/lib/skala/adapter/get_user_former_loans.rb +5 -0
  28. data/lib/skala/adapter/get_user_former_loans/result.rb +14 -0
  29. data/lib/skala/adapter/get_user_hold_requests.rb +5 -0
  30. data/lib/skala/adapter/get_user_hold_requests/result.rb +14 -0
  31. data/lib/skala/adapter/get_user_inter_library_loans.rb +5 -0
  32. data/lib/skala/adapter/get_user_inter_library_loans/result.rb +14 -0
  33. data/lib/skala/adapter/get_user_loans.rb +5 -0
  34. data/lib/skala/adapter/get_user_loans/result.rb +14 -0
  35. data/lib/skala/adapter/get_user_transactions.rb +5 -0
  36. data/lib/skala/adapter/get_user_transactions/result.rb +14 -0
  37. data/lib/skala/adapter/operation.rb +2 -0
  38. data/lib/skala/adapter/operation/request.rb +6 -0
  39. data/lib/skala/adapter/operation/result.rb +7 -0
  40. data/lib/skala/adapter/renew_user_loan.rb +7 -0
  41. data/lib/skala/adapter/renew_user_loan/result.rb +7 -0
  42. data/lib/skala/adapter/renew_user_loans.rb +5 -0
  43. data/lib/skala/adapter/renew_user_loans/result.rb +9 -0
  44. data/lib/skala/adapter/search.rb +6 -0
  45. data/lib/skala/adapter/search/request.rb +91 -0
  46. data/lib/skala/adapter/search/request/date_histogram_facet.rb +5 -0
  47. data/lib/skala/adapter/search/request/facet.rb +29 -0
  48. data/lib/skala/adapter/search/request/histogram_facet.rb +8 -0
  49. data/lib/skala/adapter/search/request/ids_query.rb +6 -0
  50. data/lib/skala/adapter/search/request/match_query.rb +7 -0
  51. data/lib/skala/adapter/search/request/ordered_terms_query.rb +7 -0
  52. data/lib/skala/adapter/search/request/query.rb +18 -0
  53. data/lib/skala/adapter/search/request/query_string_query.rb +9 -0
  54. data/lib/skala/adapter/search/request/range_facet.rb +10 -0
  55. data/lib/skala/adapter/search/request/range_facet/range.rb +9 -0
  56. data/lib/skala/adapter/search/request/range_query.rb +8 -0
  57. data/lib/skala/adapter/search/request/simple_query_string_query.rb +8 -0
  58. data/lib/skala/adapter/search/request/sort_request.rb +15 -0
  59. data/lib/skala/adapter/search/request/terms_facet.rb +8 -0
  60. data/lib/skala/adapter/search/request/unscored_terms_query.rb +7 -0
  61. data/lib/skala/adapter/search/result.rb +22 -0
  62. data/lib/skala/adapter/search/result/facet.rb +15 -0
  63. data/lib/skala/adapter/search/result/histogram_facet.rb +12 -0
  64. data/lib/skala/adapter/search/result/histogram_facet/entry.rb +8 -0
  65. data/lib/skala/adapter/search/result/hit.rb +13 -0
  66. data/lib/skala/adapter/search/result/terms_facet.rb +14 -0
  67. data/lib/skala/adapter/search/result/terms_facet/term.rb +8 -0
  68. data/lib/skala/adapter/update_user.rb +4 -0
  69. data/lib/skala/aleph_adapter.rb +47 -0
  70. data/lib/skala/aleph_adapter/authenticate_user.rb +27 -0
  71. data/lib/skala/aleph_adapter/create_user_hold_request.rb +63 -0
  72. data/lib/skala/aleph_adapter/delete_user_hold_request.rb +29 -0
  73. data/lib/skala/aleph_adapter/get_record.rb +22 -0
  74. data/lib/skala/aleph_adapter/get_record_holdable_items.rb +29 -0
  75. data/lib/skala/aleph_adapter/get_record_items.rb +111 -0
  76. data/lib/skala/aleph_adapter/get_user.rb +49 -0
  77. data/lib/skala/aleph_adapter/get_user_former_loans.rb +21 -0
  78. data/lib/skala/aleph_adapter/get_user_hold_requests.rb +102 -0
  79. data/lib/skala/aleph_adapter/get_user_inter_library_loans.rb +66 -0
  80. data/lib/skala/aleph_adapter/get_user_loans.rb +93 -0
  81. data/lib/skala/aleph_adapter/get_user_transactions.rb +96 -0
  82. data/lib/skala/aleph_adapter/renew_user_loan.rb +27 -0
  83. data/lib/skala/aleph_adapter/renew_user_loans.rb +39 -0
  84. data/lib/skala/aleph_adapter/resolve_user.rb +19 -0
  85. data/lib/skala/aleph_adapter/update_user.rb +105 -0
  86. data/lib/skala/common_attributes.rb +19 -0
  87. data/lib/skala/elasticsearch_adapter.rb +33 -0
  88. data/lib/skala/elasticsearch_adapter/search.rb +20 -0
  89. data/lib/skala/elasticsearch_adapter/search/request_transformation.rb +20 -0
  90. data/lib/skala/elasticsearch_adapter/search/request_transformation/add_aggregations.rb +50 -0
  91. data/lib/skala/elasticsearch_adapter/search/request_transformation/add_from.rb +10 -0
  92. data/lib/skala/elasticsearch_adapter/search/request_transformation/add_query.rb +107 -0
  93. data/lib/skala/elasticsearch_adapter/search/request_transformation/add_size.rb +12 -0
  94. data/lib/skala/elasticsearch_adapter/search/request_transformation/add_sort.rb +18 -0
  95. data/lib/skala/elasticsearch_adapter/search/request_transformation/add_version.rb +10 -0
  96. data/lib/skala/elasticsearch_adapter/search/result_transformation.rb +21 -0
  97. data/lib/skala/elasticsearch_adapter/search/result_transformation/set_facets.rb +44 -0
  98. data/lib/skala/elasticsearch_adapter/search/result_transformation/set_hits.rb +18 -0
  99. data/lib/skala/elasticsearch_adapter/search/result_transformation/set_total_hits.rb +10 -0
  100. data/lib/skala/engine.rb +14 -0
  101. data/lib/skala/get_user_result.rb +14 -0
  102. data/lib/skala/hold_request.rb +24 -0
  103. data/lib/skala/item.rb +15 -0
  104. data/lib/skala/loan.rb +18 -0
  105. data/lib/skala/primo_adapter.rb +34 -0
  106. data/lib/skala/primo_adapter/get_records.rb +24 -0
  107. data/lib/skala/primo_adapter/search.rb +13 -0
  108. data/lib/skala/primo_adapter/search/request_transformation.rb +40 -0
  109. data/lib/skala/primo_adapter/search/request_transformation/add_queries.rb +97 -0
  110. data/lib/skala/primo_adapter/search/request_transformation/add_sort_by_list.rb +37 -0
  111. data/lib/skala/primo_adapter/search/request_transformation/embed_inner_search_request.rb +13 -0
  112. data/lib/skala/primo_adapter/search/request_transformation/serialize_target_as_xml.rb +11 -0
  113. data/lib/skala/primo_adapter/search/request_transformation/set_bulk_size.rb +12 -0
  114. data/lib/skala/primo_adapter/search/request_transformation/set_institution.rb +12 -0
  115. data/lib/skala/primo_adapter/search/request_transformation/set_languages.rb +15 -0
  116. data/lib/skala/primo_adapter/search/request_transformation/set_locations.rb +19 -0
  117. data/lib/skala/primo_adapter/search/request_transformation/set_on_campus.rb +13 -0
  118. data/lib/skala/primo_adapter/search/request_transformation/set_start_index.rb +12 -0
  119. data/lib/skala/primo_adapter/search/request_transformation/setup_inner_search_request.rb +33 -0
  120. data/lib/skala/primo_adapter/search/request_transformation/setup_target.rb +28 -0
  121. data/lib/skala/primo_adapter/search/request_transformation/toggle_bool_operator.rb +13 -0
  122. data/lib/skala/primo_adapter/search/result_transformation.rb +30 -0
  123. data/lib/skala/primo_adapter/search/result_transformation/add_hits.rb +13 -0
  124. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation.rb +46 -0
  125. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_creator.rb +10 -0
  126. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_description.rb +10 -0
  127. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_edition.rb +10 -0
  128. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_fulltext_available.rb +12 -0
  129. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_id.rb +11 -0
  130. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_identifier.rb +46 -0
  131. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_is_part_of.rb +14 -0
  132. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_language.rb +10 -0
  133. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_metadata.rb +13 -0
  134. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_openurl.rb +23 -0
  135. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_publisher.rb +10 -0
  136. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_source.rb +10 -0
  137. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_subject.rb +10 -0
  138. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_title.rb +10 -0
  139. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_year_of_publication.rb +10 -0
  140. data/lib/skala/primo_adapter/search/result_transformation/fix_primo_facets_bugs.rb +108 -0
  141. data/lib/skala/primo_adapter/search/result_transformation/parse_search_brief_response.rb +20 -0
  142. data/lib/skala/primo_adapter/search/result_transformation/set_facets.rb +71 -0
  143. data/lib/skala/primo_adapter/search/result_transformation/set_total_hits.rb +13 -0
  144. data/lib/skala/primo_adapter/search/result_transformation/sort_terms_facets_terms.rb +14 -0
  145. data/lib/skala/primo_adapter/soap_api.rb +15 -0
  146. data/lib/skala/primo_adapter/soap_api/search_brief.rb +25 -0
  147. data/lib/skala/record.rb +85 -0
  148. data/lib/skala/record/identifier.rb +9 -0
  149. data/lib/skala/record/is_part_of.rb +11 -0
  150. data/lib/skala/record/link.rb +9 -0
  151. data/lib/skala/record/relation.rb +9 -0
  152. data/lib/skala/transaction.rb +13 -0
  153. data/lib/skala/version.rb +1 -1
  154. data/skala.gemspec +21 -12
  155. data/spec/skala/search_request/ordered_terms_query_spec.rb +6 -0
  156. data/spec/spec_helper.rb +7 -28
  157. metadata +237 -85
  158. data/lib/skala/i18n.rb +0 -46
  159. data/lib/skala/transformation.rb +0 -54
  160. data/lib/skala/transformation/step.rb +0 -24
  161. data/spec/assets/locales/de.yml +0 -14
  162. data/spec/assets/locales/en.yml +0 -9
  163. data/spec/assets/transformation/some_class.rb +0 -2
  164. data/spec/skala/adapter/operation_spec.rb +0 -19
  165. data/spec/skala/adapter_spec.rb +0 -2
  166. data/spec/skala/i18n_spec.rb +0 -95
  167. data/spec/skala/transformation/step_spec.rb +0 -36
  168. data/spec/skala/transformation_spec.rb +0 -89
  169. data/spec/skala_spec.rb +0 -2
@@ -0,0 +1,10 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../doc_transformation"
3
+
4
+ class Skala::PrimoAdapter::Search::ResultTransformation::DocTransformation::
5
+ SetEdition < Transformator::Transformation::Step
6
+
7
+ def call
8
+ target.record.edition = transformation.read_source_values(".//display/edition").first
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../doc_transformation"
3
+
4
+ # TODO: UBPB transformation: Move to custom adapter
5
+ class Skala::PrimoAdapter::Search::ResultTransformation::DocTransformation::
6
+ SetFulltextAvailable < Transformator::Transformation::Step
7
+
8
+ def call
9
+ target.record.fulltext_available = transformation.read_source_values(".//delivery/fulltext").first != "no_fulltext"
10
+ end
11
+
12
+ end
@@ -0,0 +1,11 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../doc_transformation"
3
+
4
+ class Skala::PrimoAdapter::Search::ResultTransformation::DocTransformation::
5
+ SetId < Transformator::Transformation::Step
6
+
7
+ def call
8
+ target.record.id = source.at_xpath(".//control/recordid").text().gsub(/\ATN_/, "").split(":").last
9
+ end
10
+
11
+ end
@@ -0,0 +1,46 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../doc_transformation"
3
+
4
+ class Skala::PrimoAdapter::Search::ResultTransformation::DocTransformation::
5
+ SetIdentifier < Transformator::Transformation::Step
6
+
7
+ def call
8
+ sanitizer = Rails::Html::FullSanitizer.new
9
+
10
+ identifier_strings = transformation.read_source_values(".//display/identifier", split: ";")
11
+ identifier_strings.map!{|s| sanitizer.sanitize(s)}
12
+
13
+ isbns = extract_isbns(identifier_strings)
14
+ issns = extract_issns(identifier_strings)
15
+ dois = extract_dois(identifier_strings)
16
+
17
+ target.record.isbn = isbns
18
+ target.record.issn = issns
19
+ target.record.identifier = dois.map{|i| {type: "doi", value: i}}
20
+ end
21
+
22
+ private
23
+
24
+ def extract_isbns(identifier_strings)
25
+ extract(identifier_strings, /(isbn:|e-isbn:)\s+([a-z0-9\-\.\/]+)/i, match_index: 1)
26
+ end
27
+
28
+ def extract_issns(identifier_strings)
29
+ extract(identifier_strings, /(issn:|e-issn:)\s+([a-z0-9\-\.\/]+)/i, match_index: 1)
30
+ end
31
+
32
+ def extract_dois(identifier_strings)
33
+ extract(identifier_strings, /doi:\s+([a-z0-9\-\.\/]+)/i)
34
+ end
35
+
36
+ def extract(identifier_strings, regexp, match_index: 0)
37
+ values = []
38
+
39
+ identifier_strings.each do |s|
40
+ values += s.scan(regexp).map{|r| r[match_index]}
41
+ end
42
+
43
+ values.compact
44
+ end
45
+
46
+ end
@@ -0,0 +1,14 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../doc_transformation"
3
+
4
+ class Skala::PrimoAdapter::Search::ResultTransformation::DocTransformation::
5
+ SetIsPartOf < Transformator::Transformation::Step
6
+
7
+ def call
8
+ is_part_of = transformation.read_source_values(".//display/ispartof").map do |superorder|
9
+ { label: superorder }
10
+ end
11
+
12
+ target.record.is_part_of = is_part_of
13
+ end
14
+ end
@@ -0,0 +1,10 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../doc_transformation"
3
+
4
+ class Skala::PrimoAdapter::Search::ResultTransformation::DocTransformation::
5
+ SetLanguage < Transformator::Transformation::Step
6
+
7
+ def call
8
+ target.record.language = transformation.read_source_values(".//display/language", split: ";")
9
+ end
10
+ end
@@ -0,0 +1,13 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../doc_transformation"
3
+
4
+ class Skala::PrimoAdapter::Search::ResultTransformation::DocTransformation::
5
+ SetMetadata < Transformator::Transformation::Step
6
+
7
+ def call
8
+ target.id = source.attr("ID")
9
+ target.index = source.attr("SEARCH_ENGINE")
10
+ target.score = source.attr("RANK")
11
+ target.type = "record"
12
+ end
13
+ end
@@ -0,0 +1,23 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../doc_transformation"
3
+
4
+ class Skala::PrimoAdapter::Search::ResultTransformation::DocTransformation::
5
+ SetOpenurl < Transformator::Transformation::Step
6
+
7
+ def call
8
+ openurl = transformation.read_source_values(".//LINKS/openurl").first
9
+ if openurl.present?
10
+ openurl = remove_language_param(openurl)
11
+ target.record.openurl = openurl
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ # Remove the language param to force the default language
18
+ # TODO: UBPB setting: Move to custom adapter
19
+ def remove_language_param(openurl)
20
+ openurl.split('&').map{|e| e.gsub(/req\.language=.+/, 'req.language=')}.join('&')
21
+ end
22
+
23
+ end
@@ -0,0 +1,10 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../doc_transformation"
3
+
4
+ class Skala::PrimoAdapter::Search::ResultTransformation::DocTransformation::
5
+ SetPublisher < Transformator::Transformation::Step
6
+
7
+ def call
8
+ target.record.publisher = transformation.read_source_values(".//display/publisher").first
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../doc_transformation"
3
+
4
+ class Skala::PrimoAdapter::Search::ResultTransformation::DocTransformation::
5
+ SetSource < Transformator::Transformation::Step
6
+
7
+ def call
8
+ target.record.source = transformation.read_source_values(".//display/source").first
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../doc_transformation"
3
+
4
+ class Skala::PrimoAdapter::Search::ResultTransformation::DocTransformation::
5
+ SetSubject < Transformator::Transformation::Step
6
+
7
+ def call
8
+ target.record.subject = transformation.read_source_values(".//display/subject", split: ";")
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../doc_transformation"
3
+
4
+ class Skala::PrimoAdapter::Search::ResultTransformation::DocTransformation::
5
+ SetTitle < Transformator::Transformation::Step
6
+
7
+ def call
8
+ target.record.title = transformation.read_source_values(".//display/title").first
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../doc_transformation"
3
+
4
+ class Skala::PrimoAdapter::Search::ResultTransformation::DocTransformation::
5
+ SetYearOfPublication < Transformator::Transformation::Step
6
+
7
+ def call
8
+ target.record.year_of_publication = transformation.read_source_values(".//display/creationdate").first
9
+ end
10
+ end
@@ -0,0 +1,108 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../result_transformation"
3
+
4
+ class Skala::PrimoAdapter::Search::ResultTransformation::
5
+ FixPrimoFacetsBugs < Transformator::Transformation::Step
6
+
7
+ def call
8
+ # please do not change order of the calls below, because they depend (in parts) on each other
9
+ fix_selected_facets_occur_slightly_different
10
+ fix_selected_facet_value_is_missing
11
+ fix_creationdate_facet_values_out_of_selected_range
12
+ # case 1 - there is no facet at all
13
+ #transformation.search_request.facets.each do |_requested_facet|
14
+ # binding.pry
15
+ #end
16
+ =begin
17
+ request[:body]["facets"].try do |_requested_facets|
18
+ _requested_facets.each do |_facet_name, _requested_facet|
19
+ unless target["facets"][_facet_name]
20
+ if _requested_facet.keys.include?("terms")
21
+ target["facets"][_facet_name] = {
22
+ "_type" => "terms",
23
+ "terms" => []
24
+ }
25
+ end
26
+ end
27
+ end
28
+ end
29
+ =end
30
+
31
+ # case 2 - there is a facet, but the requested facet is not included
32
+ =begin
33
+ deep_locate(
34
+ request,
35
+ -> (_key, _value, _) do
36
+ _key == "match" && _value.keys.any? do |__key|
37
+ __key.start_with?("facet")
38
+ end
39
+ end
40
+ )
41
+ .presence
42
+ .try do |_facet_queries|
43
+ _facet_queries.each do |_facet_query|
44
+ _facet_query["match"].try do |_match_query|
45
+ target["facets"][_match_query.keys.first]["terms"].try do |_target_facet_terms|
46
+ if _target_facet_terms.none? { |_term| _term["term"] == _match_query.values.first }
47
+ _target_facet_terms << {
48
+ "term" => _match_query.values.first,
49
+ "count" => 1
50
+ }
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ =end
57
+ end
58
+
59
+ private
60
+
61
+ def fix_creationdate_facet_values_out_of_selected_range
62
+ creationdate_facet_query = transformation.search_request.facet_queries.find do |_facet_query|
63
+ _facet_query.field == "facet_creationdate"
64
+ end
65
+
66
+ creationdate_facet = target.facets.find do |_target_facet|
67
+ _target_facet.field == "facet_creationdate"
68
+ end
69
+
70
+ if creationdate_facet_query
71
+ creationdate_facet.entries.select! do |_entry|
72
+ _entry.key.to_i >= creationdate_facet_query.gte.to_i &&
73
+ _entry.key.to_i <= creationdate_facet_query.lte.to_i
74
+ end
75
+ end
76
+ end
77
+
78
+ def fix_selected_facet_value_is_missing
79
+ transformation.search_request.facet_queries.each do |_facet_query|
80
+ target_facet = target.facets.find { |_facet| _facet.field == _facet_query.field }
81
+
82
+ if _facet_query.type.to_s == "match" && target_facet && target_facet.type.to_s == "terms"
83
+ if target_facet.terms.none? { |_term| _term.term == _facet_query.query }
84
+ term_class = target_facet.terms.first.class
85
+
86
+ target_facet.terms.push term_class.new(
87
+ count: target.total_hits,
88
+ term: _facet_query.query
89
+ )
90
+ end
91
+ end
92
+ end
93
+ end
94
+
95
+ def fix_selected_facets_occur_slightly_different
96
+ transformation.search_request.facet_queries.each do |_facet_query|
97
+ target_facet = target.facets.find { |_facet| _facet.field == _facet_query.field }
98
+
99
+ if _facet_query.type.to_s == "match" && target_facet && target_facet.type.to_s == "terms"
100
+ target_facet.terms.each do |_target_facet_term|
101
+ if _target_facet_term.term.downcase.strip == _facet_query.query.downcase
102
+ _target_facet_term.term = _facet_query.query
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,20 @@
1
+ require "nokogiri"
2
+ require "transformator/transformation/step"
3
+ require_relative "../result_transformation"
4
+
5
+ class Skala::PrimoAdapter::Search::ResultTransformation::
6
+ ParseSearchBriefResponse < Transformator::Transformation::Step
7
+
8
+ def call
9
+ transformation.search_brief_response =
10
+ Nokogiri::XML(source)
11
+ .remove_namespaces!
12
+ .at_xpath("/Envelope/Body/searchBriefResponse/searchBriefReturn")
13
+ .try(:text)
14
+ .try do |_embedded_search_brief_response|
15
+ Nokogiri::XML(_embedded_search_brief_response) { |config| config.noblanks }
16
+ .remove_namespaces!
17
+ .at_xpath("//SEGMENTS/JAGROOT/RESULT")
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,71 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../result_transformation"
3
+
4
+ class Skala::PrimoAdapter::Search::ResultTransformation::
5
+ SetFacets < Transformator::Transformation::Step
6
+
7
+ def call
8
+ requested_facets = transformation.search_request.facets
9
+
10
+ target.facets =
11
+ transformation.search_brief_response.xpath("//FACET")
12
+ .map do |_source_facet|
13
+ # in primo facet fields are named "facet_foo", while the name is "foo"
14
+ field = "facet_#{_source_facet.attr("NAME")}"
15
+
16
+ corresponding_search_request_facet = requested_facets.find do |_requested_facet|
17
+ _requested_facet.field == field
18
+ end
19
+
20
+ case corresponding_search_request_facet.try(:type)
21
+ when "histogram"
22
+ target.class::HistogramFacet.new(
23
+ field: field,
24
+ name: corresponding_search_request_facet.name,
25
+ entries: begin
26
+ _source_facet.xpath("./FACET_VALUES")
27
+ .select do |_source_facet_value|
28
+ _source_facet_value.attr("KEY")[/\d{4}/]
29
+ end
30
+ .each_with_object({}) do |_source_facet_value, _hash|
31
+ key = _source_facet_value.attr("KEY").to_i
32
+ count = _source_facet_value.attr("VALUE").to_i
33
+
34
+ _hash[key] = count
35
+ end
36
+ .tap do |_key_count_mapping|
37
+ keys = _key_count_mapping.keys.map(&:to_i)
38
+
39
+ (keys.min..keys.max).each do |_key_from_range|
40
+ _key_count_mapping[_key_from_range] ||= 0
41
+ end
42
+ end
43
+ .each_with_object([]) do |(_key, _count), _array|
44
+ _array.push(count: _count, key: _key)
45
+ end
46
+ .sort do |_entry, _other_entry|
47
+ _entry[:key] <=> _other_entry[:key]
48
+ end
49
+ end
50
+ )
51
+ when "terms"
52
+ target.class::TermsFacet.new(
53
+ field: field,
54
+ name: corresponding_search_request_facet.name,
55
+ terms: _source_facet.xpath("./FACET_VALUES").map do |_source_facet_value|
56
+ {
57
+ count: _source_facet_value.attr("VALUE").to_i,
58
+ term: begin
59
+ # https://github.com/ubpb/katalog_ubpb/issues/58
60
+ # https://github.com/sparklemotion/nokogiri/issues/214
61
+ _source_facet_value.to_s.match(/KEY="([^"]+)"/).captures.try(:first) ||
62
+ _source_facet_value.attr("KEY")
63
+ end
64
+ }
65
+ end
66
+ )
67
+ end
68
+ end
69
+ .compact
70
+ end
71
+ end
@@ -0,0 +1,13 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../result_transformation"
3
+
4
+ class Skala::PrimoAdapter::Search::ResultTransformation::
5
+ SetTotalHits < Transformator::Transformation::Step
6
+
7
+ def call
8
+ target.total_hits =
9
+ transformation.search_brief_response.at_xpath("//DOCSET").try do |_docset|
10
+ _docset.attr("TOTALHITS").to_i
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../result_transformation"
3
+
4
+ class Skala::PrimoAdapter::Search::ResultTransformation::
5
+ SortTermsFacetsTerms < Transformator::Transformation::Step
6
+
7
+ def call
8
+ target.facets.each do |_target_facet|
9
+ if _target_facet.type.to_s == "terms"
10
+ _target_facet.terms.sort_by!(&:count).reverse!
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ require_relative "../primo_adapter"
2
+
3
+ class Skala::PrimoAdapter::SoapApi
4
+ require_relative "./soap_api/search_brief"
5
+
6
+ attr_accessor :adapter
7
+
8
+ def initialize(adapter)
9
+ self.adapter = adapter
10
+ end
11
+
12
+ def searchBrief(*args)
13
+ self.class::SearchBrief.new(adapter).call(*args)
14
+ end
15
+ end