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,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
|
data/lib/skala/engine.rb
ADDED
@@ -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
|
data/lib/skala/item.rb
ADDED
@@ -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
|
data/lib/skala/loan.rb
ADDED
@@ -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
|