artirix_data_models 0.6.2 → 0.6.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4c953eedf5e26123d9a2136591abf12b0a6be6ff
4
- data.tar.gz: a3966ad6e6704d526176554e4b9a5d332dde1264
3
+ metadata.gz: 6bf75f8fabe2f1161d1306a0c1d1da33abc2e178
4
+ data.tar.gz: 033a3edd3d4ec0c2cb5158ec3fda73a05e9a6c7f
5
5
  SHA512:
6
- metadata.gz: 2c79dbd9b140a1e584bad0d110d38a6a6ae384761d41ea296d78a58ebc81c44cea3691cbc5ed5ef00cdd9e5fb92d565549946ffeaf356748b57fac362f155677
7
- data.tar.gz: afc8d927f2082134cb81a9f118f73b799882a019fccc20760886c2d34a2fc0cebfae479794523e735eccddf9b5110edecd1d6b04bd2c61fac00dcc0ebe53913c
6
+ metadata.gz: 8957ef6dae32230c8dd3c7223f8b2473fba7f70f969cd0585d53bf0008d62b9164d158b1e2fd0c30e19c0c4c5a77e1ff3f71b0c2b060de137725e695faf81e35
7
+ data.tar.gz: f26f34e27de7508872b7b5ca6a6f8d0a36f740848b6bd900aa6449d21738e975b67a66e1970eb39a25504152fbc92b6074adfce1fc64ca49f85715cff59ac80a
data/README.md CHANGED
@@ -224,6 +224,11 @@ end
224
224
 
225
225
  ## Changes
226
226
 
227
+ ### 0.6.3.1
228
+
229
+ - Fix in EsCollection's aggregation parsing (nested + single from RAW now work ok)
230
+ - `SortedBucketAggregationBase` introduced. now `ArtirixDataModels::AggregationsFactory.sorted_aggregation_class_based_on_index_on(index_array)` available to create a class for Aggregations which will sort the buckets based on the position of the elements on a given array.
231
+
227
232
  ### 0.6.2
228
233
 
229
234
  *Fixed Breaking Change*: removal of `Aggregation.from_json` static method. Now back but delegating to default factory method is `aggregation_factory.aggregation_from_json` in the Aggregation Factory *instance*.
@@ -239,6 +244,14 @@ end
239
244
 
240
245
  ## Yanked versions
241
246
 
247
+ ### ~0.6.3~
248
+
249
+ Yanked because of typo bug on SortedBucketAggregationBase. Released 0.6.3.1 with the fix.
250
+
251
+
252
+ - Fix in EsCollection's aggregation parsing (nested + single from RAW now work ok)
253
+ - `SortedBucketAggregationBase` introduced. now `ArtirixDataModels::AggregationsFactory.sorted_aggregation_class_based_on_index_on(index_array)` available to create a class for Aggregations which will sort the buckets based on the position of the elements on a given array.
254
+
242
255
 
243
256
  ### ~0.6.1~
244
257
 
@@ -14,10 +14,10 @@ require 'hashie'
14
14
 
15
15
  # loading features
16
16
  require 'artirix_data_models/es_collection'
17
+ require 'artirix_data_models/aggregation'
17
18
  require 'artirix_data_models/aggregations_factory'
18
19
  require 'artirix_data_models/raw_aggregation_data_normaliser'
19
20
  require 'artirix_data_models/aggregation_builder'
20
- require 'artirix_data_models/aggregation'
21
21
  require 'artirix_data_models/model'
22
22
  require 'artirix_data_models/gateways/data_gateway'
23
23
  require 'artirix_data_models/gateway_response_adaptors/model_adaptor'
@@ -2,6 +2,14 @@ module ArtirixDataModels
2
2
  class AggregationsFactory
3
3
  DEFAULT_COLLECTION_CLASS_NAME = ''.freeze
4
4
 
5
+ # AGGREGATION CLASS BUILDING
6
+
7
+ def self.sorted_aggregation_class_based_on_index_on(index_array)
8
+ SortedBucketsAggregationClassFactory.build_class_based_on_index_on(index_array)
9
+ end
10
+
11
+ # FACTORY INSTANCE
12
+
5
13
  def initialize
6
14
  @_loaders = Hash.new { |h, k| h[k] = {} }
7
15
  setup_config
@@ -61,5 +69,56 @@ module ArtirixDataModels
61
69
  RawAggregationDataNormaliser.new(self, raw_aggs).normalise
62
70
  end
63
71
 
72
+ module SortedBucketsAggregationClassFactory
73
+ def self.build_class_based_on_index_on(index_array)
74
+ prepared_index_array = index_array.map { |key| SortedBucketsAggregationClassFactory.prepare_key(key) }
75
+ sort_by_proc = sort_by_index_on(prepared_index_array)
76
+
77
+ Class.new(SortedBucketAggregationBase).tap do |klass|
78
+ klass.sort_by_callable = sort_by_proc
79
+ end
80
+ end
81
+
82
+ def self.prepare_key(key)
83
+ key.to_s.strip.downcase
84
+ end
85
+
86
+ def self.sort_by_index_on(index_array)
87
+ proc do |bucket|
88
+ name = SortedBucketsAggregationClassFactory.prepare_key(bucket.name)
89
+
90
+ found_index = index_array.index(name)
91
+
92
+ if found_index.present?
93
+ [0, found_index]
94
+ else
95
+ [1, 0]
96
+ end
97
+ end
98
+ end
99
+
100
+ class SortedBucketAggregationBase < ArtirixDataModels::Aggregation
101
+ alias_method :unordered_buckets, :buckets
102
+
103
+ def buckets
104
+ @sorted_buckets ||= sort_buckets
105
+ end
106
+
107
+ def sort_buckets
108
+ unordered_buckets.sort_by { |bucket| self.class.sort_by_callable.call(bucket) }
109
+ end
110
+
111
+ def self.sort_by_callable
112
+ @sort_by_callable
113
+ end
114
+
115
+ def self.sort_by_callable=(callable = nil, &block)
116
+ raise ArgumentError unless callable || block
117
+
118
+ @sort_by_callable = callable || block
119
+ end
120
+ end
121
+
122
+ end
64
123
  end
65
124
  end
@@ -3,44 +3,53 @@ module ArtirixDataModels
3
3
 
4
4
  FIND_BUCKETS = ->(_k, v, _o) { v.respond_to?(:key?) && v.key?(:buckets) }
5
5
 
6
- attr_reader :raw_aggs, :aggregations_factory
6
+ attr_reader :raw_aggs, :aggregations_factory, :list
7
7
 
8
8
  def initialize(aggregations_factory, raw_aggs)
9
9
  @aggregations_factory = aggregations_factory
10
10
  @raw_aggs = raw_aggs
11
+ @list = []
11
12
  end
12
13
 
13
14
  def normalise
14
15
  return [] unless raw_aggs.present?
15
16
  return raw_aggs if Array === raw_aggs
16
17
 
17
- normalise_hash
18
+ normalise_hash(raw_aggs)
19
+
20
+ list
18
21
  end
19
22
 
20
23
  alias_method :call, :normalise
21
24
 
22
25
  private
23
26
 
24
- def normalise_hash
25
- with_buckets_list = deep_locate raw_aggs, FIND_BUCKETS
27
+ def normalise_hash(hash)
28
+ with_buckets_list = deep_locate hash, FIND_BUCKETS
26
29
 
27
- with_buckets_list.reduce([]) do |list, with_buckets|
30
+ with_buckets_list.each do |with_buckets|
28
31
  with_buckets.each do |name, value|
29
- add_normalised_element_to_list(list, name, value)
32
+ normalise_element(name, value)
30
33
  end
31
-
32
- list
33
34
  end
34
35
  end
35
36
 
36
- def add_normalised_element_to_list(list, k, v)
37
- return unless Hash === v && v.key?(:buckets)
37
+ def normalise_element(name, value)
38
+ return unless Hash === value
39
+
40
+ if value.key?(:buckets)
41
+ add_normalised_element_to_list(name, value)
42
+ else
43
+ normalise_hash(value)
44
+ end
45
+ end
38
46
 
39
- buckets = v[:buckets].map do |raw_bucket|
47
+ def add_normalised_element_to_list(name, value)
48
+ buckets = value[:buckets].map do |raw_bucket|
40
49
  normalise_bucket(raw_bucket)
41
50
  end
42
51
 
43
- list << { name: k, buckets: buckets }
52
+ list << { name: name, buckets: buckets }
44
53
  end
45
54
 
46
55
  def normalise_bucket(raw_bucket)
@@ -1,3 +1,3 @@
1
1
  module ArtirixDataModels
2
- VERSION = '0.6.2'
2
+ VERSION = '0.6.3.1'
3
3
  end
@@ -169,6 +169,61 @@ RSpec.describe ArtirixDataModels::EsCollection, type: :model do
169
169
  Then { es_collection.aggregations.first.buckets.last.aggregations.first.buckets.last.name == 'Cognitive Impact' }
170
170
  Then { es_collection.aggregations.first.buckets.last.aggregations.first.buckets.last.count == 3 }
171
171
  end
172
+
173
+ context 'with Raw ES with multiple nested aggregations' do
174
+ Given(:fixture_file) { fixture_pathname('articles_search_multiple_nested_raw_es.json') }
175
+
176
+ Given(:model_class) {
177
+ Class.new do
178
+ attr_reader :data
179
+
180
+ def initialize(data)
181
+ @data = { given: data }
182
+ end
183
+ end
184
+ }
185
+ Given(:es_response) { Oj.load(File.read(fixture_file), symbol_keys: true) }
186
+
187
+ When(:es_collection) { ArtirixDataModels::EsCollection.new(model_class, response: es_response) }
188
+
189
+ Then { es_collection.total == 1234 }
190
+ Then { es_collection.results == [] }
191
+
192
+ Then { es_collection.aggregations.size == 2 }
193
+
194
+ Then { es_collection.aggregations.first.name == :publication_types }
195
+ Then { es_collection.aggregations.first.buckets.size == 8 }
196
+
197
+ Then { es_collection.aggregations.first.buckets.first.name == 'Expert Opinion' }
198
+ Then { es_collection.aggregations.first.buckets.first.count == 1798 }
199
+ Then { es_collection.aggregations.first.buckets.last.name == 'Guidelines' }
200
+ Then { es_collection.aggregations.first.buckets.last.count == 33 }
201
+
202
+
203
+ Then { es_collection.aggregations.last.name == :taxonomy_level_1 }
204
+ Then { es_collection.aggregations.last.buckets.size == 4 }
205
+
206
+ Then { es_collection.aggregations.last.buckets.first.name == 'Treatment' }
207
+ Then { es_collection.aggregations.last.buckets.first.count == 2404 }
208
+ Then { es_collection.aggregations.last.buckets.first.aggregations.size == 1 }
209
+ Then { es_collection.aggregations.last.buckets.first.aggregations.first.name == :taxonomy_level_2 }
210
+ Then { es_collection.aggregations.last.buckets.first.aggregations.first.buckets.size == 7 }
211
+ Then { es_collection.aggregations.last.buckets.first.aggregations.first.buckets.first.name == 'Drug Treatments' }
212
+ Then { es_collection.aggregations.last.buckets.first.aggregations.first.buckets.first.count == 977 }
213
+ Then { es_collection.aggregations.last.buckets.first.aggregations.first.buckets.last.name == 'Complementary and Alternative Therapies' }
214
+ Then { es_collection.aggregations.last.buckets.first.aggregations.first.buckets.last.count == 14 }
215
+
216
+
217
+ Then { es_collection.aggregations.last.buckets.last.name == 'Living' }
218
+ Then { es_collection.aggregations.last.buckets.last.count == 365 }
219
+ Then { es_collection.aggregations.last.buckets.last.aggregations.size == 1 }
220
+ Then { es_collection.aggregations.last.buckets.last.aggregations.first.name == :taxonomy_level_2 }
221
+ Then { es_collection.aggregations.last.buckets.last.aggregations.first.buckets.size == 8 }
222
+ Then { es_collection.aggregations.last.buckets.last.aggregations.first.buckets.first.name == 'Emotional Impact' }
223
+ Then { es_collection.aggregations.last.buckets.last.aggregations.first.buckets.first.count == 104 }
224
+ Then { es_collection.aggregations.last.buckets.last.aggregations.first.buckets.last.name == 'Cognitive Impact' }
225
+ Then { es_collection.aggregations.last.buckets.last.aggregations.first.buckets.last.count == 3 }
226
+ end
172
227
  end
173
228
 
174
229
  end
@@ -0,0 +1,187 @@
1
+ {
2
+ "took": 40,
3
+ "timed_out": false,
4
+ "_shards": {
5
+ "total": 5,
6
+ "successful": 5,
7
+ "failed": 0
8
+ },
9
+ "hits": {
10
+ "total": 1234,
11
+ "max_score": 0,
12
+ "hits": []
13
+ },
14
+ "aggregations": {
15
+ "publication_types": {
16
+ "doc_count_error_upper_bound": 0,
17
+ "sum_other_doc_count": 0,
18
+ "buckets": [
19
+ {
20
+ "key": "Expert Opinion",
21
+ "doc_count": 1798
22
+ },
23
+ {
24
+ "key": "Observational Studies",
25
+ "doc_count": 777
26
+ },
27
+ {
28
+ "key": "Clinical Observations",
29
+ "doc_count": 627
30
+ },
31
+ {
32
+ "key": "Controlled Studies",
33
+ "doc_count": 303
34
+ },
35
+ {
36
+ "key": "Randomised Controlled Trials",
37
+ "doc_count": 299
38
+ },
39
+ {
40
+ "key": "Systematic Reviews",
41
+ "doc_count": 220
42
+ },
43
+ {
44
+ "key": "Meta-Analysis",
45
+ "doc_count": 49
46
+ },
47
+ {
48
+ "key": "Guidelines",
49
+ "doc_count": 33
50
+ }
51
+ ]
52
+ },
53
+ "taxonomy": {
54
+ "doc_count": 4674,
55
+ "taxonomy_level_1": {
56
+ "doc_count_error_upper_bound": 0,
57
+ "sum_other_doc_count": 0,
58
+ "buckets": [
59
+ {
60
+ "key": "Treatment",
61
+ "doc_count": 2404,
62
+ "taxonomy_level_2": {
63
+ "doc_count_error_upper_bound": 0,
64
+ "sum_other_doc_count": 0,
65
+ "buckets": [
66
+ {
67
+ "key": "Drug Treatments",
68
+ "doc_count": 977
69
+ },
70
+ {
71
+ "key": "Drug Development",
72
+ "doc_count": 731
73
+ },
74
+ {
75
+ "key": "Other Treatments",
76
+ "doc_count": 358
77
+ },
78
+ {
79
+ "key": "Surgical Treatments",
80
+ "doc_count": 264
81
+ },
82
+ {
83
+ "key": "Assistive Devices",
84
+ "doc_count": 43
85
+ },
86
+ {
87
+ "key": "Palliative Care",
88
+ "doc_count": 17
89
+ },
90
+ {
91
+ "key": "Complementary and Alternative Therapies",
92
+ "doc_count": 14
93
+ }
94
+ ]
95
+ }
96
+ },
97
+ {
98
+ "key": "Understand",
99
+ "doc_count": 1356,
100
+ "taxonomy_level_2": {
101
+ "doc_count_error_upper_bound": 0,
102
+ "sum_other_doc_count": 0,
103
+ "buckets": [
104
+ {
105
+ "key": "Symptoms",
106
+ "doc_count": 1066
107
+ },
108
+ {
109
+ "key": "Outlook",
110
+ "doc_count": 143
111
+ },
112
+ {
113
+ "key": "Causes",
114
+ "doc_count": 123
115
+ },
116
+ {
117
+ "key": "Ethics",
118
+ "doc_count": 24
119
+ }
120
+ ]
121
+ }
122
+ },
123
+ {
124
+ "key": "Diagnosis",
125
+ "doc_count": 549,
126
+ "taxonomy_level_2": {
127
+ "doc_count_error_upper_bound": 0,
128
+ "sum_other_doc_count": 0,
129
+ "buckets": [
130
+ {
131
+ "key": "Diagnostic Techniques",
132
+ "doc_count": 525
133
+ },
134
+ {
135
+ "key": "Diagnostic Challenges",
136
+ "doc_count": 24
137
+ }
138
+ ]
139
+ }
140
+ },
141
+ {
142
+ "key": "Living",
143
+ "doc_count": 365,
144
+ "taxonomy_level_2": {
145
+ "doc_count_error_upper_bound": 0,
146
+ "sum_other_doc_count": 0,
147
+ "buckets": [
148
+ {
149
+ "key": "Emotional Impact",
150
+ "doc_count": 104
151
+ },
152
+ {
153
+ "key": "Genetic Counseling",
154
+ "doc_count": 63
155
+ },
156
+ {
157
+ "key": "Diet",
158
+ "doc_count": 59
159
+ },
160
+ {
161
+ "key": "Fertility/Sex",
162
+ "doc_count": 56
163
+ },
164
+ {
165
+ "key": "Exercise",
166
+ "doc_count": 48
167
+ },
168
+ {
169
+ "key": "Physical Impact",
170
+ "doc_count": 26
171
+ },
172
+ {
173
+ "key": "Sleep",
174
+ "doc_count": 6
175
+ },
176
+ {
177
+ "key": "Cognitive Impact",
178
+ "doc_count": 3
179
+ }
180
+ ]
181
+ }
182
+ }
183
+ ]
184
+ }
185
+ }
186
+ }
187
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: artirix_data_models
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.6.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eduardo Turiño
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-12 00:00:00.000000000 Z
11
+ date: 2015-08-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -259,6 +259,7 @@ files:
259
259
  - spec/artirix_data_models/gateways/gateway_response_adaptors/model_adaptor_spec.rb
260
260
  - spec/artirix_data_models/model_fields_dao_spec.rb
261
261
  - spec/fixtures/articles_search_dl.json
262
+ - spec/fixtures/articles_search_multiple_nested_raw_es.json
262
263
  - spec/fixtures/articles_search_nested_raw_es.json
263
264
  - spec/fixtures/articles_search_nested_single_raw_es.json
264
265
  - spec/fixtures/articles_search_raw_es.json
@@ -299,6 +300,7 @@ test_files:
299
300
  - spec/artirix_data_models/gateways/gateway_response_adaptors/model_adaptor_spec.rb
300
301
  - spec/artirix_data_models/model_fields_dao_spec.rb
301
302
  - spec/fixtures/articles_search_dl.json
303
+ - spec/fixtures/articles_search_multiple_nested_raw_es.json
302
304
  - spec/fixtures/articles_search_nested_raw_es.json
303
305
  - spec/fixtures/articles_search_nested_single_raw_es.json
304
306
  - spec/fixtures/articles_search_raw_es.json