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,107 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../request_transformation"
3
+
4
+ class Skala::ElasticsearchAdapter::Search::RequestTransformation::
5
+ AddQuery < Transformator::Transformation::Step
6
+
7
+ def call
8
+ [source.queries, source.facet_queries].flatten.compact.presence.try(:each) do |_query|
9
+ target["query"] ||= {}
10
+ target["query"]["bool"] ||= {}
11
+ target["query"]["bool"]["must"] ||= []
12
+ target["query"]["bool"]["must_not"] ||= []
13
+
14
+ if elasticsearch_query = elasticsearch_query_factory(_query)
15
+ container = _query.exclude ? target["query"]["bool"]["must_not"] : target["query"]["bool"]["must"]
16
+ container << elasticsearch_query
17
+ end
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def elasticsearch_query_factory(query)
24
+ case query.type.to_sym
25
+ when :query_string then query_from_query_string_query(query)
26
+ when :simple_query_string then query_from_simple_query_string_query(query)
27
+ when :match then query_from_match_query(query)
28
+ when :ordered_terms then query_from_ordered_terms_query(query)
29
+ when :range then query_from_range_query(query)
30
+ when :unscored_terms then query_from_unscored_terms_query(query)
31
+ end
32
+ end
33
+
34
+ def query_from_query_string_query(query)
35
+ {
36
+ "query_string" => {
37
+ "default_field" => query.default_field,
38
+ "default_operator" => "AND",
39
+ "fields" => query.fields,
40
+ "query" => query.query
41
+ }.compact
42
+ }
43
+ end
44
+
45
+ def query_from_simple_query_string_query(query)
46
+ {
47
+ "simple_query_string" => {
48
+ "default_operator" => query.default_operator,
49
+ "fields" => query.fields,
50
+ "query" => query.query,
51
+ "analyze_wildcard" => true
52
+ }
53
+ .compact
54
+ }
55
+ end
56
+
57
+ def query_from_match_query(query)
58
+ {
59
+ "match" => {
60
+ query.field => query.query
61
+ }
62
+ }
63
+ end
64
+
65
+ def query_from_ordered_terms_query(query)
66
+ {
67
+ "bool" => {
68
+ "should" => query.terms.reverse.map.with_index do |_term, _reversed_index|
69
+ {
70
+ "constant_score" => {
71
+ "filter" => {
72
+ "term" => {
73
+ query.field => _term
74
+ }
75
+ },
76
+ "boost" => _reversed_index
77
+ }
78
+ }
79
+ end,
80
+ }
81
+ }
82
+ end
83
+
84
+ def query_from_range_query(query)
85
+ {
86
+ "range" => {
87
+ query.field => {
88
+ "lte" => query.lte,
89
+ "gte" => query.gte
90
+ }
91
+ .compact
92
+ }
93
+ }
94
+ end
95
+
96
+ def query_from_unscored_terms_query(query)
97
+ {
98
+ "constant_score" => {
99
+ "filter" => {
100
+ "terms" => {
101
+ query.field => query.terms
102
+ }
103
+ }
104
+ }
105
+ }
106
+ end
107
+ end
@@ -0,0 +1,12 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../request_transformation"
3
+
4
+ class Skala::ElasticsearchAdapter::Search::RequestTransformation::
5
+ AddSize < Transformator::Transformation::Step
6
+
7
+ def call
8
+ source.size.try do |_size|
9
+ target["size"] = _size
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,18 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../request_transformation"
3
+
4
+ class Skala::ElasticsearchAdapter::Search::RequestTransformation::
5
+ AddSort < Transformator::Transformation::Step
6
+
7
+ def call
8
+ source.sort.try do |_sort_requests|
9
+ target["sort"] ||= _sort_requests.map do |_sort_request|
10
+ if _sort_request.order
11
+ { _sort_request.field => { order: _sort_request.order } }
12
+ else
13
+ _sort_request.field
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,10 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../request_transformation"
3
+
4
+ class Skala::ElasticsearchAdapter::Search::RequestTransformation::
5
+ AddVersion < Transformator::Transformation::Step
6
+
7
+ def call
8
+ target["version"] ||= true
9
+ end
10
+ end
@@ -0,0 +1,21 @@
1
+ require "skala/adapter/search/result"
2
+ require "transformator/transformation"
3
+ require_relative "../search"
4
+
5
+ class Skala::ElasticsearchAdapter::Search::ResultTransformation < Transformator::Transformation
6
+ require_directory "#{File.dirname(__FILE__)}/result_transformation"
7
+
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
+ SetFacets,
18
+ SetHits,
19
+ SetTotalHits
20
+ ]
21
+ end
@@ -0,0 +1,44 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../result_transformation"
3
+
4
+ class Skala::ElasticsearchAdapter::Search::ResultTransformation::
5
+ SetFacets < Transformator::Transformation::Step
6
+
7
+ def call
8
+ if result_aggregations = source["aggregations"]
9
+ requested_facets = transformation.search_request.facets
10
+ result_facets = []
11
+
12
+ result_aggregations.each do |_key, _value|
13
+ if requested_facet = requested_facets.find { |_facet| _facet.name == _key }
14
+
15
+ result_facets << if requested_facet.is_a?(Skala::Adapter::Search::Request::HistogramFacet)
16
+ Skala::Adapter::Search::Result::HistogramFacet.new({
17
+ field: requested_facet.field,
18
+ name: _key,
19
+ entries: _value["buckets"].map do |_bucket|
20
+ {
21
+ count: _bucket["doc_count"],
22
+ key: _bucket["key"]
23
+ }
24
+ end
25
+ })
26
+ elsif requested_facet.is_a?(Skala::Adapter::Search::Request::TermsFacet)
27
+ Skala::Adapter::Search::Result::TermsFacet.new({
28
+ field: requested_facet.field,
29
+ name: _key,
30
+ terms: _value["buckets"].map do |_bucket|
31
+ {
32
+ term: _bucket["key"],
33
+ count: _bucket["doc_count"]
34
+ }
35
+ end
36
+ })
37
+ end
38
+ end
39
+ end
40
+
41
+ target.facets = result_facets if result_facets.present?
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,18 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../result_transformation"
3
+
4
+ class Skala::ElasticsearchAdapter::Search::ResultTransformation::
5
+ SetHits < Transformator::Transformation::Step
6
+
7
+ def call
8
+ target.hits = source["hits"]["hits"].map do |_hit|
9
+ {
10
+ id: _hit["_id"],
11
+ index: _hit["_index"],
12
+ score: _hit["_score"],
13
+ type: _hit["_type"],
14
+ version: _hit["_version"]
15
+ }
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,10 @@
1
+ require "transformator/transformation/step"
2
+ require_relative "../result_transformation"
3
+
4
+ class Skala::ElasticsearchAdapter::Search::ResultTransformation::
5
+ SetTotalHits < Transformator::Transformation::Step
6
+
7
+ def call
8
+ target.total_hits = source.try(:[], "hits").try(:[], "total")
9
+ end
10
+ end
@@ -0,0 +1,14 @@
1
+ module Skala
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace Skala
4
+
5
+ # http://pivotallabs.com/leave-your-migrations-in-your-rails-engines/
6
+ #initializer :add_skala_migrations do |app|
7
+ # unless app.root.to_s == root.to_s # changed because the original match check fails for us
8
+ # config.paths["db/migrate"].expanded.each do |expanded_path|
9
+ # app.config.paths["db/migrate"] << expanded_path
10
+ # end
11
+ # end
12
+ #end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ class Skala::GetUserResult
2
+ include Virtus.model
3
+
4
+ attribute :id, String
5
+ attribute :first_name, String
6
+ attribute :last_name, String
7
+ attribute :email_address, String
8
+ attribute :cash_balance, Float
9
+ attribute :expiry_date, Date
10
+ attribute :number_of_hold_requests, Integer
11
+ attribute :number_of_loans, Integer
12
+
13
+ attribute :fields
14
+ end
@@ -0,0 +1,24 @@
1
+ require_relative "../skala"
2
+ require_relative "./record"
3
+
4
+ class Skala::HoldRequest
5
+ include Virtus.model
6
+
7
+ attribute :id, String
8
+ attribute :deleteable, Boolean, default: false
9
+ attribute :place_in_queue, Integer, default: 0
10
+ attribute :record_id, String
11
+ attribute :creation_date, Date
12
+ attribute :begin_request_date, Date
13
+ attribute :end_request_date, Date
14
+ attribute :begin_hold_date, Date
15
+ attribute :end_hold_date, Date
16
+ attribute :record, Skala::Record
17
+ attribute :status, Symbol
18
+
19
+ # Make sure nil values
20
+ def place_in_queue=(value)
21
+ super(value || 0)
22
+ end
23
+
24
+ end
@@ -0,0 +1,15 @@
1
+ class Skala::Item
2
+ include Virtus.model
3
+
4
+ attribute :availability, Symbol
5
+ attribute :due_date, Date
6
+ attribute :expected_date, Date
7
+ attribute :location, String
8
+ attribute :hold_request_can_be_created, Boolean
9
+ attribute :id, String
10
+ attribute :item_status, String
11
+ attribute :note, Array[String]
12
+ attribute :number_of_hold_requests, Integer, default: 0
13
+ attribute :status, Symbol, default: :unknown
14
+ attribute :record, Skala::Record
15
+ end
@@ -0,0 +1,18 @@
1
+ require_relative "../skala"
2
+
3
+ class Skala::Loan
4
+ include Virtus.model
5
+
6
+ attribute :due_date, Date
7
+ attribute :fine, Float
8
+ attribute :id, String, required: true
9
+ attribute :loan_date, Date
10
+ attribute :record, Skala::Record
11
+ attribute :renewable, Axiom::Types::Boolean
12
+ attribute :returned_date, Date
13
+ attribute :signature, String # a loan references a specific item and needs a specific signature
14
+
15
+ def renewable?
16
+ renewable == true
17
+ end
18
+ end
@@ -0,0 +1,34 @@
1
+ require "active_support"
2
+ require "active_support/core_ext"
3
+ require "skala/adapter"
4
+
5
+ class Skala::PrimoAdapter < Skala::Adapter
6
+ require_relative "./primo_adapter/get_records"
7
+ require_relative "./primo_adapter/search"
8
+ require_relative "./primo_adapter/soap_api"
9
+
10
+ attr_accessor :institution
11
+ attr_accessor :languages
12
+ attr_accessor :locations
13
+ attr_accessor :on_campus
14
+ attr_accessor :soap_api_url
15
+ attr_accessor :timeout
16
+
17
+ def initialize(options = {})
18
+ HashWithIndifferentAccess.new(options).try do |_options|
19
+ self.institution = _options[:institution]
20
+ self.languages = _options[:languages]
21
+ self.locations = _options[:locations]
22
+ self.on_campus = _options[:on_campus]
23
+ self.soap_api_url = _options[:soap_api_url]
24
+ self.timeout = _options[:timeout]
25
+ end
26
+ end
27
+
28
+ #
29
+ # internal api between adapter and operations
30
+ #
31
+ def soap_api
32
+ self.class::SoapApi.new(self)
33
+ end
34
+ end
@@ -0,0 +1,24 @@
1
+ require "skala/adapter/search"
2
+ require_relative "../primo_adapter"
3
+
4
+ class Skala::PrimoAdapter::GetRecords < Skala::Adapter::GetRecords
5
+ def call(record_ids, options = {})
6
+ search_request = Skala::Adapter::Search::Request.new(
7
+ queries: [
8
+ {
9
+ type: "ids",
10
+ query: [record_ids].flatten(1)
11
+ }
12
+ ]
13
+ )
14
+
15
+ search_result = adapter.search(search_request, on_campus: true) # because you know the id -> you searched before
16
+ self.class::Result.new({records: search_result.hits}).tap do |_get_records_result|
17
+ _get_records_result.source = search_result.source
18
+ _get_records_result.each do |_element|
19
+ _element.found = true
20
+ _element.version = 1
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,13 @@
1
+ require "skala/adapter/search"
2
+ require_relative "../primo_adapter"
3
+
4
+ class Skala::PrimoAdapter::Search < Skala::Adapter::Search
5
+ require_relative "./search/request_transformation"
6
+ require_relative "./search/result_transformation"
7
+
8
+ def call(search_request, options = {})
9
+ primo_soap_request = RequestTransformation.new.call(search_request, adapter, options)
10
+ primo_result = adapter.soap_api.searchBrief(primo_soap_request)
11
+ ResultTransformation.new.call(primo_result, search_request: search_request)
12
+ end
13
+ end
@@ -0,0 +1,40 @@
1
+ require "transformator/transformation"
2
+ require_relative "../search"
3
+
4
+ class Skala::PrimoAdapter::Search::RequestTransformation < Transformator::Transformation
5
+ extend Forwardable
6
+
7
+ require_directory "#{File.dirname(__FILE__)}/request_transformation"
8
+
9
+ attr_accessor :adapter
10
+ attr_accessor :inner_search_request
11
+ attr_accessor :on_campus
12
+
13
+ delegate [:languages, :locations, :institution] => :adapter
14
+
15
+ def call(source, adapter, options = {})
16
+ self.adapter = adapter
17
+ self.on_campus = options.try(:[], :on_campus)
18
+ super(source, options)
19
+ end
20
+
21
+ sequence [
22
+ SetupTarget,
23
+ SetupInnerSearchRequest,
24
+ [
25
+ [
26
+ AddQueries,
27
+ SetStartIndex,
28
+ SetBulkSize,
29
+ SetLanguages,
30
+ AddSortByList,
31
+ SetLocations,
32
+ SetOnCampus
33
+ ],
34
+ SetInstitution
35
+ ],
36
+ ToggleBoolOperator,
37
+ EmbedInnerSearchRequest,
38
+ SerializeTargetAsXml
39
+ ]
40
+ end