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,97 @@
1
+ require "ox"
2
+ require "transformator/transformation/step"
3
+ require_relative "../request_transformation"
4
+
5
+ class Skala::PrimoAdapter::Search::RequestTransformation::
6
+ AddQueries < Transformator::Transformation::Step
7
+
8
+ def call
9
+ query_terms_node = transformation.inner_search_request.locate("PrimoSearchRequest/QueryTerms").first
10
+
11
+ [source.queries, source.facet_queries].flatten.compact.presence.try(:each) do |_query|
12
+ if primo_query = query_factory(_query)
13
+ [primo_query].flatten(1).each do |_primo_query|
14
+ query_terms_node << _primo_query
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ def query_factory(query)
23
+ case query.type.to_sym
24
+ when :ids then query_from_ids_query(query)
25
+ when :match then query_from_match_query(query)
26
+ when :query_string then query_from_query_string_query(query)
27
+ when :range then query_from_range_query(query)
28
+ when :simple_query_string then query_from_query_string_query(query) # supports also simple_query_string_query
29
+ else raise "Unsupported query type!"
30
+ end
31
+ end
32
+
33
+ def query_from_ids_query(query)
34
+ query.query.map do |_id|
35
+ Ox.parse(
36
+ <<-xml.strip_heredoc
37
+ <QueryTerm>
38
+ <IndexField>#{map_query_field("id")}</IndexField>
39
+ <PrecisionOperator>exact</PrecisionOperator>
40
+ <Value>#{_id}</Value>
41
+ </QueryTerm>
42
+ xml
43
+ )
44
+ end
45
+ end
46
+
47
+ def query_from_match_query(query)
48
+ Ox.parse(
49
+ <<-xml.strip_heredoc
50
+ <QueryTerm>
51
+ <IndexField>#{map_query_field(query.field)}</IndexField>
52
+ <PrecisionOperator>exact</PrecisionOperator>
53
+ <Value>#{query.query}</Value>
54
+ </QueryTerm>
55
+ xml
56
+ )
57
+ end
58
+
59
+ def query_from_range_query(query)
60
+ Ox.parse(
61
+ <<-xml
62
+ <QueryTerm>
63
+ <IndexField>#{query.field}</IndexField>
64
+ <PrecisionOperator>exact</PrecisionOperator>
65
+ <Value>[#{query.gte} TO #{query.lte}]</Value>
66
+ </QueryTerm>
67
+ xml
68
+ )
69
+ end
70
+
71
+ def query_from_query_string_query(query)
72
+ normalized_query =
73
+ if query.default_operator.upcase == "OR"
74
+ query.query.split(" ").join(" OR ")
75
+ else
76
+ query.query
77
+ end
78
+
79
+ Ox.parse(
80
+ <<-xml
81
+ <QueryTerm>
82
+ <IndexField>#{map_query_field(query.try(:default_field) || query.try(:fields).try(:first))}</IndexField>
83
+ <PrecisionOperator>contains</PrecisionOperator>
84
+ <Value>#{normalized_query}</Value>
85
+ </QueryTerm>
86
+ xml
87
+ )
88
+ end
89
+
90
+ def map_query_field(field)
91
+ case field
92
+ when 'id' then 'rid'
93
+ else
94
+ field
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,37 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../request_transformation"
3
+
4
+ class Skala::PrimoAdapter::Search::RequestTransformation::
5
+ AddSortByList < Transformator::Transformation::Step
6
+
7
+ #
8
+ # SortField is optional, so we have to add it on the fly if necessary
9
+ #
10
+ def call
11
+ source.sort.try(:first).try do |_sort_request|
12
+ primo_search_request = transformation.inner_search_request.locate("PrimoSearchRequest").first
13
+ insert_sort_by_node(primo_search_request, _sort_request)
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def insert_sort_by_node(primo_search_request, sort_request)
20
+ # Order matters, SortField *must* be inserted after <Languages>
21
+ index_of_languages = primo_search_request.nodes.index do |_node|
22
+ _node.value == "Languages"
23
+ end
24
+
25
+ # primo can only handle *one* sort field
26
+ sort_by_list = Ox.parse(
27
+ <<-xml
28
+ <SortByList>
29
+ <SortField>#{sort_request.field}</SortField>
30
+ </SortByList>
31
+ xml
32
+ )
33
+
34
+ # insert the SortByList at the appropriate position
35
+ primo_search_request.nodes.insert(index_of_languages + 1, sort_by_list)
36
+ end
37
+ end
@@ -0,0 +1,13 @@
1
+ require "ox"
2
+ require "transformator/transformation/step"
3
+ require_relative "../request_transformation"
4
+
5
+ class Skala::PrimoAdapter::Search::RequestTransformation::
6
+ EmbedInnerSearchRequest < Transformator::Transformation::Step
7
+
8
+ def call
9
+ target.locate("*/searchRequestStr").first.tap do |searchRequestStr|
10
+ searchRequestStr << Ox::CData.new(Ox.dump(transformation.inner_search_request))
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ require "ox"
2
+ require "transformator/transformation/step"
3
+ require_relative "../request_transformation"
4
+
5
+ class Skala::PrimoAdapter::Search::RequestTransformation::
6
+ SerializeTargetAsXml < Transformator::Transformation::Step
7
+
8
+ def call
9
+ self.target = Ox.dump(self.target, with_xml: true)
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../request_transformation"
3
+
4
+ class Skala::PrimoAdapter::Search::RequestTransformation::
5
+ SetBulkSize < Transformator::Transformation::Step
6
+
7
+ def call
8
+ transformation.inner_search_request.locate("PrimoSearchRequest/BulkSize").first.tap do |_node|
9
+ _node << source.size.to_s
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../request_transformation"
3
+
4
+ class Skala::PrimoAdapter::Search::RequestTransformation::
5
+ SetInstitution < Transformator::Transformation::Step
6
+
7
+ def call
8
+ transformation.inner_search_request.locate("institution").first.tap do |node|
9
+ node << transformation.institution
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,15 @@
1
+ require "ox"
2
+ require "transformator/transformation/step"
3
+ require_relative "../request_transformation"
4
+
5
+ class Skala::PrimoAdapter::Search::RequestTransformation::
6
+ SetLanguages < Transformator::Transformation::Step
7
+
8
+ def call
9
+ transformation.languages.each do |_language|
10
+ transformation.inner_search_request.locate("PrimoSearchRequest/Languages").first.tap do |_node|
11
+ _node << Ox.parse("<Language>#{_language}</Language>")
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,19 @@
1
+ require "ox"
2
+ require "transformator/transformation/step"
3
+ require_relative "../request_transformation"
4
+
5
+ class Skala::PrimoAdapter::Search::RequestTransformation::
6
+ SetLocations < Transformator::Transformation::Step
7
+
8
+ def call
9
+ transformation.locations.each do |_location|
10
+ transformation.inner_search_request.locate("PrimoSearchRequest/Locations").first.tap do |_node|
11
+ _node << Ox.parse(
12
+ <<-xml
13
+ <uic:Location type="#{_location[:type]}" value="#{_location[:value]}"/>
14
+ xml
15
+ )
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../request_transformation"
3
+
4
+ class Skala::PrimoAdapter::Search::RequestTransformation::
5
+ SetOnCampus < Transformator::Transformation::Step
6
+
7
+ def call
8
+ transformation.inner_search_request.locate("onCampus").first.tap do |_node|
9
+ _node << (transformation.on_campus.try(:to_s) == "true" ? "true" : "false")
10
+ end
11
+ end
12
+
13
+ end
@@ -0,0 +1,12 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../request_transformation"
3
+
4
+ class Skala::PrimoAdapter::Search::RequestTransformation::
5
+ SetStartIndex < Transformator::Transformation::Step
6
+
7
+ def call
8
+ transformation.inner_search_request.locate("PrimoSearchRequest/StartIndex").first.tap do |_node|
9
+ _node << (source.from + 1).to_s
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,33 @@
1
+ require "ox"
2
+ require "transformator/transformation/step"
3
+ require_relative "../request_transformation"
4
+
5
+ class Skala::PrimoAdapter::Search::RequestTransformation::
6
+ SetupInnerSearchRequest < Transformator::Transformation::Step
7
+
8
+ #
9
+ # setup inner search request that will be wrapped in a cdata element at the end
10
+ #
11
+ def call
12
+ # we setup this skeleton instead of dynamic element creation because order matters with primo
13
+ transformation.inner_search_request = Ox.parse(
14
+ <<-xml
15
+ <searchRequest xmlns="http://www.exlibris.com/primo/xsd/wsRequest" xmlns:uic="http://www.exlibris.com/primo/xsd/primoview/uicomponents">
16
+ <PrimoSearchRequest xmlns="http://www.exlibris.com/primo/xsd/search/request">
17
+ <QueryTerms>
18
+ <BoolOpeator>AND</BoolOpeator>
19
+ </QueryTerms>
20
+ <StartIndex></StartIndex>
21
+ <BulkSize></BulkSize>
22
+ <DidUMeanEnabled>false</DidUMeanEnabled>
23
+ <HighlightingEnabled>false</HighlightingEnabled>
24
+ <Languages></Languages>
25
+ <Locations></Locations>
26
+ </PrimoSearchRequest>
27
+ <onCampus></onCampus>
28
+ <institution></institution>
29
+ </searchRequest>
30
+ xml
31
+ )
32
+ end
33
+ end
@@ -0,0 +1,28 @@
1
+ require "ox"
2
+ require "transformator/transformation/step"
3
+ require_relative "../request_transformation"
4
+
5
+ class Skala::PrimoAdapter::Search::RequestTransformation::
6
+ SetupTarget < Transformator::Transformation::Step
7
+
8
+ def call
9
+ # create empty ox document
10
+ self.target = Ox::Document.new(version: "1.0", encoding: "UTF-8")
11
+
12
+ # populate target with soap request skeleton
13
+ self.target << Ox.parse(
14
+ <<-xml
15
+ <env:Envelope
16
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
17
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
18
+ xmlns:impl="http://primo.kobv.de/PrimoWebServices/services/searcher"
19
+ xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
20
+ xmlns:ins0="http://xml.apache.org/xml-soap">
21
+ <env:Body>
22
+ <impl:searchBrief><searchRequestStr></searchRequestStr></impl:searchBrief>
23
+ </env:Body>
24
+ </env:Envelope>
25
+ xml
26
+ )
27
+ end
28
+ end
@@ -0,0 +1,13 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../request_transformation"
3
+
4
+ class Skala::PrimoAdapter::Search::RequestTransformation::
5
+ ToggleBoolOperator < Transformator::Transformation::Step
6
+
7
+ def call
8
+ if source.queries.present? && source.queries.all? { |_query| _query.type.to_sym == :ids }
9
+ bool_opeator_node = transformation.inner_search_request.locate("PrimoSearchRequest/QueryTerms/BoolOpeator").first
10
+ bool_opeator_node.nodes.clear << "OR"
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,30 @@
1
+ require "transformator/transformation"
2
+ require_relative "../search"
3
+
4
+ class Skala::PrimoAdapter::Search::ResultTransformation < Transformator::Transformation
5
+ require_directory "#{File.dirname(__FILE__)}/result_transformation"
6
+
7
+ attr_accessor :search_brief_response
8
+ attr_accessor :search_request
9
+
10
+ def call(source, options = {})
11
+ options[:target] ||= Skala::Adapter::Search::Result.new(source: source)
12
+ @search_request = options[:search_request]
13
+ super(source, options)
14
+ end
15
+
16
+ sequence [
17
+ ParseSearchBriefResponse,
18
+ SetTotalHits,
19
+ [ # facets
20
+ SetFacets,
21
+ FixPrimoFacetsBugs, # requires SetFacets to be run
22
+ SortTermsFacetsTerms # requires all sanitations to be run
23
+ #SortFacetsBySearchRequest,
24
+ #RemoveFacetsIfEmpty,
25
+ #ChangeFacetCreationdateToHistogramFacet,
26
+ #SanitizeCreationdateFacet
27
+ ],
28
+ AddHits
29
+ ]
30
+ end
@@ -0,0 +1,13 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../result_transformation"
3
+ require_relative "./doc_transformation"
4
+
5
+ class Skala::PrimoAdapter::Search::ResultTransformation::
6
+ AddHits < Transformator::Transformation::Step
7
+
8
+ def call
9
+ target.hits = transformation.search_brief_response.xpath("//DOC").map do |_doc|
10
+ self.class.parent::DocTransformation.new.call(_doc)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,46 @@
1
+ require "transformator/transformation"
2
+ require_relative "../result_transformation"
3
+
4
+ class Skala::PrimoAdapter::Search::ResultTransformation::
5
+ DocTransformation < Transformator::Transformation
6
+
7
+ require_directory "#{File.dirname(__FILE__)}/doc_transformation"
8
+
9
+ def call(source, options = {})
10
+ options[:target] ||= Skala::Adapter::Search::Result::Hit.new(record: {})
11
+ super(source, options)
12
+ end
13
+
14
+ sequence [
15
+ SetMetadata,
16
+ [ # fields
17
+ SetId,
18
+ SetCreator,
19
+ SetTitle,
20
+ SetYearOfPublication,
21
+ SetEdition,
22
+ SetPublisher,
23
+ SetSubject,
24
+ SetLanguage,
25
+ SetDescription,
26
+ SetSource,
27
+ SetIsPartOf,
28
+ SetIdentifier,
29
+ SetOpenurl,
30
+ SetFulltextAvailable
31
+ ],
32
+ #AddImage, # needs isbn to be present
33
+ ]
34
+
35
+ def read_source_values(xpath, split: nil)
36
+ source.xpath(xpath).map do |e|
37
+ if split
38
+ e.content.try do |c|
39
+ c.split(split).map(&:strip)
40
+ end
41
+ else
42
+ e.content
43
+ end
44
+ end.flatten.compact
45
+ end
46
+ end
@@ -0,0 +1,10 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../doc_transformation"
3
+
4
+ class Skala::PrimoAdapter::Search::ResultTransformation::DocTransformation::
5
+ SetCreator < Transformator::Transformation::Step
6
+
7
+ def call
8
+ target.record.creator = transformation.read_source_values(".//display/creator", 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
+ SetDescription < Transformator::Transformation::Step
6
+
7
+ def call
8
+ target.record.description = transformation.read_source_values(".//display/description")
9
+ end
10
+ end