skala 0.3.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +4 -4
- data/Gemfile +10 -1
- data/LICENSE.txt +17 -18
- data/README.md +1 -34
- data/README.primo_adapter.md +42 -0
- data/bin/console +11 -0
- data/config/initializers/skala.rb +5 -0
- data/config/skala.yml +65 -0
- data/db/migrate/20141006133522_create_skala_users.rb +13 -0
- data/db/migrate/20141006133649_create_skala_user_watch_lists.rb +14 -0
- data/db/migrate/20141006135644_create_skala_user_watch_list_entries.rb +13 -0
- data/db/migrate/20141006140435_create_skala_user_notes.rb +16 -0
- data/lib/skala.rb +36 -3
- data/lib/skala/adapter.rb +122 -4
- data/lib/skala/adapter/authenticate_user.rb +4 -0
- data/lib/skala/adapter/create_user_hold_request.rb +7 -0
- data/lib/skala/adapter/create_user_hold_request/result.rb +10 -0
- data/lib/skala/adapter/delete_user_hold_request.rb +7 -0
- data/lib/skala/adapter/get_record_holdable_items.rb +5 -0
- data/lib/skala/adapter/get_record_holdable_items/result.rb +14 -0
- data/lib/skala/adapter/get_record_items.rb +5 -0
- data/lib/skala/adapter/get_record_items/result.rb +14 -0
- data/lib/skala/adapter/get_records.rb +5 -0
- data/lib/skala/adapter/get_records/result.rb +28 -0
- data/lib/skala/adapter/get_user.rb +4 -0
- data/lib/skala/adapter/get_user_former_loans.rb +5 -0
- data/lib/skala/adapter/get_user_former_loans/result.rb +14 -0
- data/lib/skala/adapter/get_user_hold_requests.rb +5 -0
- data/lib/skala/adapter/get_user_hold_requests/result.rb +14 -0
- data/lib/skala/adapter/get_user_inter_library_loans.rb +5 -0
- data/lib/skala/adapter/get_user_inter_library_loans/result.rb +14 -0
- data/lib/skala/adapter/get_user_loans.rb +5 -0
- data/lib/skala/adapter/get_user_loans/result.rb +14 -0
- data/lib/skala/adapter/get_user_transactions.rb +5 -0
- data/lib/skala/adapter/get_user_transactions/result.rb +14 -0
- data/lib/skala/adapter/operation.rb +2 -0
- data/lib/skala/adapter/operation/request.rb +6 -0
- data/lib/skala/adapter/operation/result.rb +7 -0
- data/lib/skala/adapter/renew_user_loan.rb +7 -0
- data/lib/skala/adapter/renew_user_loan/result.rb +7 -0
- data/lib/skala/adapter/renew_user_loans.rb +5 -0
- data/lib/skala/adapter/renew_user_loans/result.rb +9 -0
- data/lib/skala/adapter/search.rb +6 -0
- data/lib/skala/adapter/search/request.rb +91 -0
- data/lib/skala/adapter/search/request/date_histogram_facet.rb +5 -0
- data/lib/skala/adapter/search/request/facet.rb +29 -0
- data/lib/skala/adapter/search/request/histogram_facet.rb +8 -0
- data/lib/skala/adapter/search/request/ids_query.rb +6 -0
- data/lib/skala/adapter/search/request/match_query.rb +7 -0
- data/lib/skala/adapter/search/request/ordered_terms_query.rb +7 -0
- data/lib/skala/adapter/search/request/query.rb +18 -0
- data/lib/skala/adapter/search/request/query_string_query.rb +9 -0
- data/lib/skala/adapter/search/request/range_facet.rb +10 -0
- data/lib/skala/adapter/search/request/range_facet/range.rb +9 -0
- data/lib/skala/adapter/search/request/range_query.rb +8 -0
- data/lib/skala/adapter/search/request/simple_query_string_query.rb +8 -0
- data/lib/skala/adapter/search/request/sort_request.rb +15 -0
- data/lib/skala/adapter/search/request/terms_facet.rb +8 -0
- data/lib/skala/adapter/search/request/unscored_terms_query.rb +7 -0
- data/lib/skala/adapter/search/result.rb +22 -0
- data/lib/skala/adapter/search/result/facet.rb +15 -0
- data/lib/skala/adapter/search/result/histogram_facet.rb +12 -0
- data/lib/skala/adapter/search/result/histogram_facet/entry.rb +8 -0
- data/lib/skala/adapter/search/result/hit.rb +13 -0
- data/lib/skala/adapter/search/result/terms_facet.rb +14 -0
- data/lib/skala/adapter/search/result/terms_facet/term.rb +8 -0
- data/lib/skala/adapter/update_user.rb +4 -0
- data/lib/skala/aleph_adapter.rb +47 -0
- data/lib/skala/aleph_adapter/authenticate_user.rb +27 -0
- data/lib/skala/aleph_adapter/create_user_hold_request.rb +63 -0
- data/lib/skala/aleph_adapter/delete_user_hold_request.rb +29 -0
- data/lib/skala/aleph_adapter/get_record.rb +22 -0
- data/lib/skala/aleph_adapter/get_record_holdable_items.rb +29 -0
- data/lib/skala/aleph_adapter/get_record_items.rb +111 -0
- data/lib/skala/aleph_adapter/get_user.rb +49 -0
- data/lib/skala/aleph_adapter/get_user_former_loans.rb +21 -0
- data/lib/skala/aleph_adapter/get_user_hold_requests.rb +102 -0
- data/lib/skala/aleph_adapter/get_user_inter_library_loans.rb +66 -0
- data/lib/skala/aleph_adapter/get_user_loans.rb +93 -0
- data/lib/skala/aleph_adapter/get_user_transactions.rb +96 -0
- data/lib/skala/aleph_adapter/renew_user_loan.rb +27 -0
- data/lib/skala/aleph_adapter/renew_user_loans.rb +39 -0
- data/lib/skala/aleph_adapter/resolve_user.rb +19 -0
- data/lib/skala/aleph_adapter/update_user.rb +105 -0
- data/lib/skala/common_attributes.rb +19 -0
- data/lib/skala/elasticsearch_adapter.rb +33 -0
- data/lib/skala/elasticsearch_adapter/search.rb +20 -0
- data/lib/skala/elasticsearch_adapter/search/request_transformation.rb +20 -0
- data/lib/skala/elasticsearch_adapter/search/request_transformation/add_aggregations.rb +50 -0
- data/lib/skala/elasticsearch_adapter/search/request_transformation/add_from.rb +10 -0
- data/lib/skala/elasticsearch_adapter/search/request_transformation/add_query.rb +107 -0
- data/lib/skala/elasticsearch_adapter/search/request_transformation/add_size.rb +12 -0
- data/lib/skala/elasticsearch_adapter/search/request_transformation/add_sort.rb +18 -0
- data/lib/skala/elasticsearch_adapter/search/request_transformation/add_version.rb +10 -0
- data/lib/skala/elasticsearch_adapter/search/result_transformation.rb +21 -0
- data/lib/skala/elasticsearch_adapter/search/result_transformation/set_facets.rb +44 -0
- data/lib/skala/elasticsearch_adapter/search/result_transformation/set_hits.rb +18 -0
- data/lib/skala/elasticsearch_adapter/search/result_transformation/set_total_hits.rb +10 -0
- data/lib/skala/engine.rb +14 -0
- data/lib/skala/get_user_result.rb +14 -0
- data/lib/skala/hold_request.rb +24 -0
- data/lib/skala/item.rb +15 -0
- data/lib/skala/loan.rb +18 -0
- data/lib/skala/primo_adapter.rb +34 -0
- data/lib/skala/primo_adapter/get_records.rb +24 -0
- data/lib/skala/primo_adapter/search.rb +13 -0
- data/lib/skala/primo_adapter/search/request_transformation.rb +40 -0
- data/lib/skala/primo_adapter/search/request_transformation/add_queries.rb +97 -0
- data/lib/skala/primo_adapter/search/request_transformation/add_sort_by_list.rb +37 -0
- data/lib/skala/primo_adapter/search/request_transformation/embed_inner_search_request.rb +13 -0
- data/lib/skala/primo_adapter/search/request_transformation/serialize_target_as_xml.rb +11 -0
- data/lib/skala/primo_adapter/search/request_transformation/set_bulk_size.rb +12 -0
- data/lib/skala/primo_adapter/search/request_transformation/set_institution.rb +12 -0
- data/lib/skala/primo_adapter/search/request_transformation/set_languages.rb +15 -0
- data/lib/skala/primo_adapter/search/request_transformation/set_locations.rb +19 -0
- data/lib/skala/primo_adapter/search/request_transformation/set_on_campus.rb +13 -0
- data/lib/skala/primo_adapter/search/request_transformation/set_start_index.rb +12 -0
- data/lib/skala/primo_adapter/search/request_transformation/setup_inner_search_request.rb +33 -0
- data/lib/skala/primo_adapter/search/request_transformation/setup_target.rb +28 -0
- data/lib/skala/primo_adapter/search/request_transformation/toggle_bool_operator.rb +13 -0
- data/lib/skala/primo_adapter/search/result_transformation.rb +30 -0
- data/lib/skala/primo_adapter/search/result_transformation/add_hits.rb +13 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation.rb +46 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_creator.rb +10 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_description.rb +10 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_edition.rb +10 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_fulltext_available.rb +12 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_id.rb +11 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_identifier.rb +46 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_is_part_of.rb +14 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_language.rb +10 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_metadata.rb +13 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_openurl.rb +23 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_publisher.rb +10 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_source.rb +10 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_subject.rb +10 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_title.rb +10 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_year_of_publication.rb +10 -0
- data/lib/skala/primo_adapter/search/result_transformation/fix_primo_facets_bugs.rb +108 -0
- data/lib/skala/primo_adapter/search/result_transformation/parse_search_brief_response.rb +20 -0
- data/lib/skala/primo_adapter/search/result_transformation/set_facets.rb +71 -0
- data/lib/skala/primo_adapter/search/result_transformation/set_total_hits.rb +13 -0
- data/lib/skala/primo_adapter/search/result_transformation/sort_terms_facets_terms.rb +14 -0
- data/lib/skala/primo_adapter/soap_api.rb +15 -0
- data/lib/skala/primo_adapter/soap_api/search_brief.rb +25 -0
- data/lib/skala/record.rb +85 -0
- data/lib/skala/record/identifier.rb +9 -0
- data/lib/skala/record/is_part_of.rb +11 -0
- data/lib/skala/record/link.rb +9 -0
- data/lib/skala/record/relation.rb +9 -0
- data/lib/skala/transaction.rb +13 -0
- data/lib/skala/version.rb +1 -1
- data/skala.gemspec +21 -12
- data/spec/skala/search_request/ordered_terms_query_spec.rb +6 -0
- data/spec/spec_helper.rb +7 -28
- metadata +237 -85
- data/lib/skala/i18n.rb +0 -46
- data/lib/skala/transformation.rb +0 -54
- data/lib/skala/transformation/step.rb +0 -24
- data/spec/assets/locales/de.yml +0 -14
- data/spec/assets/locales/en.yml +0 -9
- data/spec/assets/transformation/some_class.rb +0 -2
- data/spec/skala/adapter/operation_spec.rb +0 -19
- data/spec/skala/adapter_spec.rb +0 -2
- data/spec/skala/i18n_spec.rb +0 -95
- data/spec/skala/transformation/step_spec.rb +0 -36
- data/spec/skala/transformation_spec.rb +0 -89
- 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
|
data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_description.rb
ADDED
@@ -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
|