trifle-stats 2.4.1 → 2.5.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/Gemfile.lock +1 -1
- data/README.md +20 -2
- data/lib/trifle/stats/driver/mysql.rb +33 -15
- data/lib/trifle/stats/driver/postgres.rb +66 -37
- data/lib/trifle/stats/driver/redis.rb +37 -30
- data/lib/trifle/stats/driver/sqlite.rb +66 -35
- data/lib/trifle/stats/nocturnal.rb +2 -2
- data/lib/trifle/stats/transponder/expression.rb +117 -0
- data/lib/trifle/stats/transponder/expression_engine.rb +356 -0
- data/lib/trifle/stats/version.rb +1 -1
- data/lib/trifle/stats.rb +2 -10
- metadata +4 -13
- data/lib/trifle/stats/nocturnal_legacy.rb +0 -161
- data/lib/trifle/stats/transponder/add.rb +0 -30
- data/lib/trifle/stats/transponder/divide.rb +0 -30
- data/lib/trifle/stats/transponder/max.rb +0 -31
- data/lib/trifle/stats/transponder/mean.rb +0 -31
- data/lib/trifle/stats/transponder/min.rb +0 -31
- data/lib/trifle/stats/transponder/multiply.rb +0 -30
- data/lib/trifle/stats/transponder/ratio.rb +0 -30
- data/lib/trifle/stats/transponder/standard_deviation.rb +0 -34
- data/lib/trifle/stats/transponder/subtract.rb +0 -30
- data/lib/trifle/stats/transponder/sum.rb +0 -28
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Trifle
|
|
4
|
-
module Stats
|
|
5
|
-
class Transponder
|
|
6
|
-
class Add
|
|
7
|
-
include Trifle::Stats::Mixins::Packer
|
|
8
|
-
Trifle::Stats::Series.register_transponder(:add, self)
|
|
9
|
-
|
|
10
|
-
def transpond(series:, left:, right:, response: 'add') # rubocop:disable Metrics/MethodLength
|
|
11
|
-
left_keys = left.to_s.split('.')
|
|
12
|
-
right_keys = right.to_s.split('.')
|
|
13
|
-
|
|
14
|
-
series[:values] = series[:values].map do |data|
|
|
15
|
-
dleft = data.dig(*left_keys)
|
|
16
|
-
dright = data.dig(*right_keys)
|
|
17
|
-
next data unless dleft && dright
|
|
18
|
-
|
|
19
|
-
dres = dleft + dright
|
|
20
|
-
signal = {
|
|
21
|
-
response => dres
|
|
22
|
-
}
|
|
23
|
-
self.class.deep_merge(data, self.class.unpack(hash: signal))
|
|
24
|
-
end
|
|
25
|
-
series
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Trifle
|
|
4
|
-
module Stats
|
|
5
|
-
class Transponder
|
|
6
|
-
class Divide
|
|
7
|
-
include Trifle::Stats::Mixins::Packer
|
|
8
|
-
Trifle::Stats::Series.register_transponder(:divide, self)
|
|
9
|
-
|
|
10
|
-
def transpond(series:, left:, right:, response: 'divide') # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
|
11
|
-
left_keys = left.to_s.split('.')
|
|
12
|
-
right_keys = right.to_s.split('.')
|
|
13
|
-
|
|
14
|
-
series[:values] = series[:values].map do |data|
|
|
15
|
-
dleft = data.dig(*left_keys)
|
|
16
|
-
dright = data.dig(*right_keys)
|
|
17
|
-
next data unless dleft && dright
|
|
18
|
-
|
|
19
|
-
dres = (dleft / dright)
|
|
20
|
-
signal = {
|
|
21
|
-
response => dres.nan? ? BigDecimal(0) : dres
|
|
22
|
-
}
|
|
23
|
-
self.class.deep_merge(data, self.class.unpack(hash: signal))
|
|
24
|
-
end
|
|
25
|
-
series
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Trifle
|
|
4
|
-
module Stats
|
|
5
|
-
class Transponder
|
|
6
|
-
class Max
|
|
7
|
-
include Trifle::Stats::Mixins::Packer
|
|
8
|
-
Trifle::Stats::Series.register_transponder(:max, self)
|
|
9
|
-
|
|
10
|
-
def transpond(series:, paths:, response: 'max') # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity
|
|
11
|
-
path_keys = paths.map { |path| path.to_s.split('.') }
|
|
12
|
-
|
|
13
|
-
series[:values] = series[:values].map do |data|
|
|
14
|
-
dvalues = path_keys.map { |path_key| data.dig(*path_key) }
|
|
15
|
-
next data if dvalues.any?(&:nil?)
|
|
16
|
-
|
|
17
|
-
numeric_values = dvalues.select { |v| v.is_a?(Numeric) }
|
|
18
|
-
next data if numeric_values.empty?
|
|
19
|
-
|
|
20
|
-
dres = numeric_values.max
|
|
21
|
-
signal = {
|
|
22
|
-
response => dres
|
|
23
|
-
}
|
|
24
|
-
self.class.deep_merge(data, self.class.unpack(hash: signal))
|
|
25
|
-
end
|
|
26
|
-
series
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
end
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Trifle
|
|
4
|
-
module Stats
|
|
5
|
-
class Transponder
|
|
6
|
-
class Mean
|
|
7
|
-
include Trifle::Stats::Mixins::Packer
|
|
8
|
-
Trifle::Stats::Series.register_transponder(:mean, self)
|
|
9
|
-
|
|
10
|
-
def transpond(series:, paths:, response: 'mean') # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
11
|
-
path_keys = paths.map { |path| path.to_s.split('.') }
|
|
12
|
-
|
|
13
|
-
series[:values] = series[:values].map do |data|
|
|
14
|
-
dvalues = path_keys.map { |path_key| data.dig(*path_key) }
|
|
15
|
-
next data if dvalues.any?(&:nil?)
|
|
16
|
-
|
|
17
|
-
numeric_values = dvalues.select { |v| v.is_a?(Numeric) }
|
|
18
|
-
next data if numeric_values.empty?
|
|
19
|
-
|
|
20
|
-
dres = (numeric_values.sum.to_f / numeric_values.length)
|
|
21
|
-
signal = {
|
|
22
|
-
response => dres.nan? ? BigDecimal(0) : dres
|
|
23
|
-
}
|
|
24
|
-
self.class.deep_merge(data, self.class.unpack(hash: signal))
|
|
25
|
-
end
|
|
26
|
-
series
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
end
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Trifle
|
|
4
|
-
module Stats
|
|
5
|
-
class Transponder
|
|
6
|
-
class Min
|
|
7
|
-
include Trifle::Stats::Mixins::Packer
|
|
8
|
-
Trifle::Stats::Series.register_transponder(:min, self)
|
|
9
|
-
|
|
10
|
-
def transpond(series:, paths:, response: 'min') # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity
|
|
11
|
-
path_keys = paths.map { |path| path.to_s.split('.') }
|
|
12
|
-
|
|
13
|
-
series[:values] = series[:values].map do |data|
|
|
14
|
-
dvalues = path_keys.map { |path_key| data.dig(*path_key) }
|
|
15
|
-
next data if dvalues.any?(&:nil?)
|
|
16
|
-
|
|
17
|
-
numeric_values = dvalues.select { |v| v.is_a?(Numeric) }
|
|
18
|
-
next data if numeric_values.empty?
|
|
19
|
-
|
|
20
|
-
dres = numeric_values.min
|
|
21
|
-
signal = {
|
|
22
|
-
response => dres
|
|
23
|
-
}
|
|
24
|
-
self.class.deep_merge(data, self.class.unpack(hash: signal))
|
|
25
|
-
end
|
|
26
|
-
series
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
end
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Trifle
|
|
4
|
-
module Stats
|
|
5
|
-
class Transponder
|
|
6
|
-
class Multiply
|
|
7
|
-
include Trifle::Stats::Mixins::Packer
|
|
8
|
-
Trifle::Stats::Series.register_transponder(:multiply, self)
|
|
9
|
-
|
|
10
|
-
def transpond(series:, left:, right:, response: 'multiply') # rubocop:disable Metrics/MethodLength
|
|
11
|
-
left_keys = left.to_s.split('.')
|
|
12
|
-
right_keys = right.to_s.split('.')
|
|
13
|
-
|
|
14
|
-
series[:values] = series[:values].map do |data|
|
|
15
|
-
dleft = data.dig(*left_keys)
|
|
16
|
-
dright = data.dig(*right_keys)
|
|
17
|
-
next data unless dleft && dright
|
|
18
|
-
|
|
19
|
-
dres = dleft * dright
|
|
20
|
-
signal = {
|
|
21
|
-
response => dres
|
|
22
|
-
}
|
|
23
|
-
self.class.deep_merge(data, self.class.unpack(hash: signal))
|
|
24
|
-
end
|
|
25
|
-
series
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Trifle
|
|
4
|
-
module Stats
|
|
5
|
-
class Transponder
|
|
6
|
-
class Ratio
|
|
7
|
-
include Trifle::Stats::Mixins::Packer
|
|
8
|
-
Trifle::Stats::Series.register_transponder(:ratio, self)
|
|
9
|
-
|
|
10
|
-
def transpond(series:, left:, right:, response: 'ratio') # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
|
11
|
-
left_keys = left.to_s.split('.')
|
|
12
|
-
right_keys = right.to_s.split('.')
|
|
13
|
-
|
|
14
|
-
series[:values] = series[:values].map do |data|
|
|
15
|
-
dleft = data.dig(*left_keys)
|
|
16
|
-
dright = data.dig(*right_keys)
|
|
17
|
-
next data unless dleft && dright
|
|
18
|
-
|
|
19
|
-
dres = (dleft / dright) * 100
|
|
20
|
-
signal = {
|
|
21
|
-
response => dres.nan? ? BigDecimal(0) : dres
|
|
22
|
-
}
|
|
23
|
-
self.class.deep_merge(data, self.class.unpack(hash: signal))
|
|
24
|
-
end
|
|
25
|
-
series
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Trifle
|
|
4
|
-
module Stats
|
|
5
|
-
class Transponder
|
|
6
|
-
class StandardDeviation
|
|
7
|
-
include Trifle::Stats::Mixins::Packer
|
|
8
|
-
Trifle::Stats::Series.register_transponder(:standard_deviation, self)
|
|
9
|
-
|
|
10
|
-
def transpond(series:, left:, right:, square:, response: 'sd') # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
|
11
|
-
left_keys = left.to_s.split('.')
|
|
12
|
-
right_keys = right.to_s.split('.')
|
|
13
|
-
square_keys = square.to_s.split('.')
|
|
14
|
-
|
|
15
|
-
series[:values] = series[:values].map do |data|
|
|
16
|
-
dright = data.dig(*right_keys)
|
|
17
|
-
dsquare = data.dig(*square_keys)
|
|
18
|
-
dleft = data.dig(*left_keys)
|
|
19
|
-
next data unless dright && dsquare && dleft
|
|
20
|
-
|
|
21
|
-
dres = Math.sqrt(
|
|
22
|
-
(dright * dsquare - dleft * dleft) / (dright * (dright - 1)) # rubocop:disable Lint/BinaryOperatorWithIdenticalOperands
|
|
23
|
-
)
|
|
24
|
-
signal = {
|
|
25
|
-
response => dres.nan? ? BigDecimal(0) : dres
|
|
26
|
-
}
|
|
27
|
-
self.class.deep_merge(data, self.class.unpack(hash: signal))
|
|
28
|
-
end
|
|
29
|
-
series
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Trifle
|
|
4
|
-
module Stats
|
|
5
|
-
class Transponder
|
|
6
|
-
class Subtract
|
|
7
|
-
include Trifle::Stats::Mixins::Packer
|
|
8
|
-
Trifle::Stats::Series.register_transponder(:subtract, self)
|
|
9
|
-
|
|
10
|
-
def transpond(series:, left:, right:, response: 'subtract') # rubocop:disable Metrics/MethodLength
|
|
11
|
-
left_keys = left.to_s.split('.')
|
|
12
|
-
right_keys = right.to_s.split('.')
|
|
13
|
-
|
|
14
|
-
series[:values] = series[:values].map do |data|
|
|
15
|
-
dleft = data.dig(*left_keys)
|
|
16
|
-
dright = data.dig(*right_keys)
|
|
17
|
-
next data unless dleft && dright
|
|
18
|
-
|
|
19
|
-
dres = dleft - dright
|
|
20
|
-
signal = {
|
|
21
|
-
response => dres
|
|
22
|
-
}
|
|
23
|
-
self.class.deep_merge(data, self.class.unpack(hash: signal))
|
|
24
|
-
end
|
|
25
|
-
series
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Trifle
|
|
4
|
-
module Stats
|
|
5
|
-
class Transponder
|
|
6
|
-
class Sum
|
|
7
|
-
include Trifle::Stats::Mixins::Packer
|
|
8
|
-
Trifle::Stats::Series.register_transponder(:sum, self)
|
|
9
|
-
|
|
10
|
-
def transpond(series:, paths:, response: 'sum') # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity
|
|
11
|
-
path_keys = paths.map { |path| path.to_s.split('.') }
|
|
12
|
-
|
|
13
|
-
series[:values] = series[:values].map do |data|
|
|
14
|
-
dvalues = path_keys.map { |path_key| data.dig(*path_key) }
|
|
15
|
-
next data if dvalues.any?(&:nil?)
|
|
16
|
-
|
|
17
|
-
dres = dvalues.sum { |v| v.is_a?(Numeric) ? v : 0 }
|
|
18
|
-
signal = {
|
|
19
|
-
response => dres
|
|
20
|
-
}
|
|
21
|
-
self.class.deep_merge(data, self.class.unpack(hash: signal))
|
|
22
|
-
end
|
|
23
|
-
series
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|