ruby-druid 0.9.1 → 0.10.0
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 +4 -4
- data/lib/druid/dimension.rb +54 -0
- data/lib/druid/query.rb +42 -8
- data/lib/druid/version.rb +1 -1
- data/spec/lib/query_spec.rb +3 -1
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ef87663c236bf89b7937fef4c7709d3937e5f0e6
|
4
|
+
data.tar.gz: 82d29a256a0cebc175aeb9d88173f1455e9a8475
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a81d42c823310788cf35fcde9c683674fd863ea3f71557d1ab0e3c01d21f66cdeedd601a816deced10367b27db19d625fc19803d6463bfdaea3aa42f063f8875
|
7
|
+
data.tar.gz: 1a0c049e54420fc1c6773e489cbef4a118f751f4e5c9172377ace9474173dab10cba6d41253056e305e5c4156c02cc8594814f1138852ad7806272c249532583
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Druid
|
2
|
+
class Dimension
|
3
|
+
include ActiveModel::Model
|
4
|
+
|
5
|
+
attr_accessor :type
|
6
|
+
validates :type, inclusion: { in: %w(default extraction) }
|
7
|
+
|
8
|
+
attr_accessor :dimension
|
9
|
+
validates :dimension, presence: true
|
10
|
+
|
11
|
+
attr_accessor :outputName
|
12
|
+
validates :outputName, presence: true
|
13
|
+
|
14
|
+
class ExtractionFnValidator < ActiveModel::EachValidator
|
15
|
+
TYPES = %w(extraction)
|
16
|
+
def validate_each(record, attribute, value)
|
17
|
+
if TYPES.include?(record.type)
|
18
|
+
record.errors.add(attribute, 'may not be blank') if value.blank?
|
19
|
+
else
|
20
|
+
record.errors.add(attribute, "is not supported by type=#{record.type}") if value
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
attr_accessor :extractionFn
|
26
|
+
validates :extractionFn, extraction_fn: true
|
27
|
+
|
28
|
+
def initialize(params)
|
29
|
+
if params.is_a?(Hash)
|
30
|
+
super
|
31
|
+
else
|
32
|
+
super(type: 'default', dimension: params.to_s, outputName: params.to_s)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def as_json(options = {})
|
37
|
+
super(options.merge(except: %w(errors validation_context)))
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.lookup(dimension, namespace, retain: true, injective: false)
|
41
|
+
new({
|
42
|
+
type: 'extraction',
|
43
|
+
dimension: dimension,
|
44
|
+
outputName: dimension,
|
45
|
+
extractionFn: {
|
46
|
+
type: 'registeredLookup',
|
47
|
+
lookup: namespace,
|
48
|
+
retainMissingValue: retain,
|
49
|
+
injective: injective,
|
50
|
+
},
|
51
|
+
})
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/lib/druid/query.rb
CHANGED
@@ -5,6 +5,7 @@ require 'active_support/all'
|
|
5
5
|
require 'active_model'
|
6
6
|
|
7
7
|
require 'druid/granularity'
|
8
|
+
require 'druid/dimension'
|
8
9
|
require 'druid/aggregation'
|
9
10
|
require 'druid/post_aggregation'
|
10
11
|
require 'druid/filter'
|
@@ -80,7 +81,16 @@ module Druid
|
|
80
81
|
TYPES = %w(groupBy select)
|
81
82
|
def validate_each(record, attribute, value)
|
82
83
|
if TYPES.include?(record.queryType)
|
83
|
-
|
84
|
+
if !value.is_a?(Array) || value.blank?
|
85
|
+
record.errors.add(attribute, 'must be a list with at least one dimension')
|
86
|
+
else
|
87
|
+
value.each(&:valid?) # trigger validation
|
88
|
+
value.each do |avalue|
|
89
|
+
avalue.errors.messages.each do |k, v|
|
90
|
+
record.errors.add(attribute, { k => v })
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
84
94
|
else
|
85
95
|
record.errors.add(attribute, "is not supported by type=#{record.queryType}") if value
|
86
96
|
end
|
@@ -90,14 +100,34 @@ module Druid
|
|
90
100
|
attr_accessor :dimensions
|
91
101
|
validates :dimensions, dimensions: true
|
92
102
|
|
103
|
+
def dimensions
|
104
|
+
@dimensions ||= []
|
105
|
+
end
|
106
|
+
|
107
|
+
def dimensions=(value)
|
108
|
+
if value.is_a?(Array)
|
109
|
+
@dimensions = value.map do |x|
|
110
|
+
x.is_a?(Dimension) ? x : Dimension.new(x)
|
111
|
+
end
|
112
|
+
else
|
113
|
+
@dimensions = [
|
114
|
+
value.is_a?(Dimension) ? value : Dimension.new(value)
|
115
|
+
]
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
93
119
|
class AggregationsValidator < ActiveModel::EachValidator
|
94
120
|
TYPES = %w(timeseries groupBy topN)
|
95
121
|
def validate_each(record, attribute, value)
|
96
122
|
if TYPES.include?(record.queryType)
|
97
|
-
value.
|
98
|
-
|
99
|
-
|
100
|
-
|
123
|
+
if !value.is_a?(Array) || value.blank?
|
124
|
+
record.errors.add(attribute, 'must be a list with at least one aggregator')
|
125
|
+
else
|
126
|
+
value.each(&:valid?) # trigger validation
|
127
|
+
value.each do |avalue|
|
128
|
+
avalue.errors.messages.each do |k, v|
|
129
|
+
record.errors.add(attribute, { k => v })
|
130
|
+
end
|
101
131
|
end
|
102
132
|
end
|
103
133
|
else
|
@@ -116,10 +146,12 @@ module Druid
|
|
116
146
|
def aggregations=(value)
|
117
147
|
if value.is_a?(Array)
|
118
148
|
@aggregations = value.map do |x|
|
119
|
-
Aggregation.new(x)
|
149
|
+
x.is_a?(Aggregation) ? x : Aggregation.new(x)
|
120
150
|
end
|
121
151
|
else
|
122
|
-
@aggregations = [
|
152
|
+
@aggregations = [
|
153
|
+
value.is_a?(Aggregation) ? value : Aggregation.new(value)
|
154
|
+
]
|
123
155
|
end
|
124
156
|
end
|
125
157
|
|
@@ -333,7 +365,9 @@ module Druid
|
|
333
365
|
|
334
366
|
def group_by(*dimensions)
|
335
367
|
query_type(:groupBy)
|
336
|
-
@query.dimensions = dimensions.
|
368
|
+
@query.dimensions = dimensions.map do |dimension|
|
369
|
+
dimension.is_a?(Dimension) ? dimension : Dimension.new(dimension)
|
370
|
+
end
|
337
371
|
self
|
338
372
|
end
|
339
373
|
|
data/lib/druid/version.rb
CHANGED
data/spec/lib/query_spec.rb
CHANGED
@@ -21,7 +21,9 @@ describe Druid::Query do
|
|
21
21
|
|
22
22
|
it 'takes dimensions from group_by method' do
|
23
23
|
@query.group_by(:a, :b, :c)
|
24
|
-
expect(JSON.parse(@query.query.to_json)['dimensions']).to eq([
|
24
|
+
expect(JSON.parse(@query.query.to_json)['dimensions']).to eq([{"type"=>"default", "dimension"=>"a", "outputName"=>"a"},
|
25
|
+
{"type"=>"default", "dimension"=>"b", "outputName"=>"b"},
|
26
|
+
{"type"=>"default", "dimension"=>"c", "outputName"=>"c"}])
|
25
27
|
end
|
26
28
|
|
27
29
|
it 'takes dimension, metric and threshold from topn method' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-druid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ruby Druid Community
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-10-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -177,6 +177,7 @@ files:
|
|
177
177
|
- lib/druid/client.rb
|
178
178
|
- lib/druid/context.rb
|
179
179
|
- lib/druid/data_source.rb
|
180
|
+
- lib/druid/dimension.rb
|
180
181
|
- lib/druid/filter.rb
|
181
182
|
- lib/druid/granularity.rb
|
182
183
|
- lib/druid/having.rb
|
@@ -210,13 +211,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
210
211
|
version: '0'
|
211
212
|
requirements: []
|
212
213
|
rubyforge_project:
|
213
|
-
rubygems_version: 2.
|
214
|
+
rubygems_version: 2.4.8
|
214
215
|
signing_key:
|
215
216
|
specification_version: 4
|
216
217
|
summary: A Ruby client for Druid
|
217
218
|
test_files:
|
219
|
+
- spec/spec_helper.rb
|
218
220
|
- spec/lib/client_spec.rb
|
219
221
|
- spec/lib/data_source_spec.rb
|
220
|
-
- spec/lib/query_spec.rb
|
221
222
|
- spec/lib/zk_spec.rb
|
222
|
-
- spec/
|
223
|
+
- spec/lib/query_spec.rb
|