chawk 0.3.0 → 0.4.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/README.md +8 -0
- data/chawk.gemspec +5 -5
- data/lib/aggregator.rb +46 -0
- data/lib/chawk.rb +3 -0
- data/lib/chawk/migration.rb +1 -0
- data/lib/chawk/version.rb +1 -1
- data/lib/models.rb +0 -2
- data/lib/node.rb +0 -41
- data/lib/range.rb +26 -2
- data/test/lib/range_test.rb +42 -5
- data/test/schema.rb +1 -0
- data/test/test_helper.rb +1 -0
- metadata +11 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3043b4d0a900dcc861435dd5377a7acabca5329c
|
4
|
+
data.tar.gz: f170e087c3f43e1770db9d4071bbc2f798c367f9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2db59a3c7073ad42f2abdd659ce9c037b107cdf9f7d732559d9a35eaaa6f3fb2f0e495d8f22c83f5e67a6f22e9c1794de09f73138b41bd9b67bb4053b48e7ea6
|
7
|
+
data.tar.gz: 44c77569af5f921eb69eacc838d34083efe9f1c01fe0dc26ccdf75e83daf908a72f6bf07a23e63fff6c4e270e0f50d354efc67121b8a1737ba87d322f2169002
|
data/README.md
CHANGED
@@ -119,6 +119,14 @@ This will return all data from the Node parent_node in the range from timestamp
|
|
119
119
|
|
120
120
|
This will return all data from the Node parent_node in the range from timestamp 1085 to 8100, resampled to the quarter beat. (2 data points, no matter how many are actually present in the sample)
|
121
121
|
|
122
|
+
Chawk::Models::Range also accepts a "strategy" field which indicates how it builds it's data points.
|
123
|
+
|
124
|
+
The default is "recent_point", which constructs timestamps and fills them with the most recent value for that timestamp.
|
125
|
+
|
126
|
+
"cluster" creates clustered group timestamps and fills them with a sum of all values within the timeframe from one timestamp to another.
|
127
|
+
|
128
|
+
"tally" creates timestamps and fills them with a sum of all values from the beginning of the range to the timestamp.
|
129
|
+
|
122
130
|
## Chawk::Models::NodeAggregator
|
123
131
|
The NodeAggregator is a (currently expensive) object for aggregate calculations on a Node. It's intended ot be use on a Range's data_node property, since doing aggregate math on an entire datase can be prohibitively expensive.
|
124
132
|
|
data/chawk.gemspec
CHANGED
@@ -25,9 +25,9 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.add_development_dependency('rack-test', "0.6.2")
|
26
26
|
spec.add_development_dependency('json', "1.8.1")
|
27
27
|
spec.add_development_dependency('simplecov', "0.8.2")
|
28
|
-
spec.add_development_dependency('pg'
|
29
|
-
spec.add_development_dependency('sqlite3'
|
30
|
-
#
|
31
|
-
#
|
32
|
-
#
|
28
|
+
spec.add_development_dependency('pg')
|
29
|
+
spec.add_development_dependency('sqlite3')
|
30
|
+
#spec.add_development_dependency('pry')
|
31
|
+
#spec.add_development_dependency('pry-debugger')
|
32
|
+
#spec.add_development_dependency('pry-stack_explorer')
|
33
33
|
end
|
data/lib/aggregator.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
module Chawk
|
3
|
+
module Models
|
4
|
+
# TODO: Most expensive version imaginable. To be replaced.
|
5
|
+
class Aggregator
|
6
|
+
|
7
|
+
attr_reader :dataset
|
8
|
+
|
9
|
+
def initialize(node)
|
10
|
+
node.check_read_access
|
11
|
+
if node.points.length > 0
|
12
|
+
@dataset = node.points.to_a.reduce([]) {|ary,p| ary << p.value}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def max()
|
17
|
+
@dataset.max
|
18
|
+
end
|
19
|
+
|
20
|
+
def min()
|
21
|
+
@dataset.min
|
22
|
+
end
|
23
|
+
|
24
|
+
def mean
|
25
|
+
sum.to_f / @dataset.length
|
26
|
+
end
|
27
|
+
|
28
|
+
def sum
|
29
|
+
@dataset.reduce(0) {|sum,p| sum+=p}
|
30
|
+
end
|
31
|
+
|
32
|
+
def count
|
33
|
+
@dataset.length
|
34
|
+
end
|
35
|
+
|
36
|
+
def sumsqr
|
37
|
+
@dataset.map {|x| x * x}.reduce(&:+)
|
38
|
+
end
|
39
|
+
|
40
|
+
def stdev
|
41
|
+
m = mean
|
42
|
+
Math.sqrt((sumsqr - count * m * m)/(count-1))
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/chawk.rb
CHANGED
data/lib/chawk/migration.rb
CHANGED
data/lib/chawk/version.rb
CHANGED
data/lib/models.rb
CHANGED
data/lib/node.rb
CHANGED
@@ -23,47 +23,6 @@ module Chawk
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
class NodeAggregator
|
27
|
-
|
28
|
-
attr_reader :dataset
|
29
|
-
|
30
|
-
def initialize(node)
|
31
|
-
node.check_read_access
|
32
|
-
if node.points.length > 0
|
33
|
-
@dataset = node.points.to_a.reduce([]) {|ary,p| ary << p.value}
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def max()
|
38
|
-
@dataset.max
|
39
|
-
end
|
40
|
-
|
41
|
-
def min()
|
42
|
-
@dataset.min
|
43
|
-
end
|
44
|
-
|
45
|
-
def mean
|
46
|
-
sum.to_f / @dataset.length
|
47
|
-
end
|
48
|
-
|
49
|
-
def sum
|
50
|
-
@dataset.reduce(0) {|sum,p| sum+=p}
|
51
|
-
end
|
52
|
-
|
53
|
-
def count
|
54
|
-
@dataset.length
|
55
|
-
end
|
56
|
-
|
57
|
-
def sumsqr
|
58
|
-
@dataset.map {|x| x * x}.reduce(&:+)
|
59
|
-
end
|
60
|
-
|
61
|
-
def stdev
|
62
|
-
m = mean
|
63
|
-
Math.sqrt((sumsqr - count * m * m)/(count-1))
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
26
|
# The Node, where most Chawk:Node information is persisted..
|
68
27
|
class Node < ActiveRecord::Base
|
69
28
|
attr_accessor :agent
|
data/lib/range.rb
CHANGED
@@ -44,7 +44,19 @@ module Chawk
|
|
44
44
|
populate!
|
45
45
|
end
|
46
46
|
|
47
|
-
def
|
47
|
+
def cluster(now, benow)
|
48
|
+
sum = parent_node.points.where("observed_at > ? AND observed_at <= ?",benow,now).sum(:value)
|
49
|
+
data_node.points.create(observed_at:now, recorded_at:Time.now, value:sum)
|
50
|
+
end
|
51
|
+
|
52
|
+
def tally(now, benow, beval)
|
53
|
+
sum = parent_node.points.where("observed_at > ? AND observed_at <= ?",benow,now).sum(:value)
|
54
|
+
#puts "\n\n VAL #{beval} SUM #{sum}"
|
55
|
+
value = beval + sum
|
56
|
+
data_node.points.create(observed_at:now, recorded_at:Time.now, value:value)
|
57
|
+
end
|
58
|
+
|
59
|
+
def recent_point(now, benow)
|
48
60
|
point = parent_node.points.where("observed_at <= :dt_to",{dt_to:now}).order(observed_at: :desc, id: :desc).first
|
49
61
|
if point
|
50
62
|
value = point.value
|
@@ -60,8 +72,20 @@ module Chawk
|
|
60
72
|
self.data_node.points.destroy_all
|
61
73
|
step = 0.25 * self.beats
|
62
74
|
now = (self.start_ts*4).round/4.to_f
|
75
|
+
benow = now - step
|
76
|
+
beval = 0
|
63
77
|
while now < self.stop_ts
|
64
|
-
|
78
|
+
#binding.pry
|
79
|
+
case strategy
|
80
|
+
when "cluster"
|
81
|
+
point = cluster now, benow
|
82
|
+
when "tally"
|
83
|
+
point = tally now, benow, beval
|
84
|
+
when "recent_point","",nil
|
85
|
+
point = recent_point now, benow
|
86
|
+
end
|
87
|
+
beval = point.value
|
88
|
+
benow = now
|
65
89
|
now += step
|
66
90
|
end
|
67
91
|
end
|
data/test/lib/range_test.rb
CHANGED
@@ -13,12 +13,12 @@ describe Chawk do
|
|
13
13
|
Chawk::Models::Range.new(start_ts:1000.0,stop_ts:1140.0,beats:1,parent_node:node1).save.must_equal true
|
14
14
|
end
|
15
15
|
|
16
|
-
it "calculates
|
16
|
+
it "calculates recent point" do
|
17
17
|
node1 = Chawk.node(@agent,'a:b')
|
18
18
|
node1.clear_points!
|
19
19
|
|
20
20
|
range = Chawk::Models::Range.create(start_ts:1085.0,stop_ts:1140.0,beats:1,parent_node:node1)
|
21
|
-
ag = Chawk::Models::
|
21
|
+
ag = Chawk::Models::Aggregator.new(range.data_node)
|
22
22
|
ag.sum.must_equal(0)
|
23
23
|
ag.mean.round(2).must_equal(0.0)
|
24
24
|
|
@@ -36,7 +36,7 @@ describe Chawk do
|
|
36
36
|
range.data_node.points.length.must_equal(220)
|
37
37
|
range.data_node.points[25].value.must_equal(92)
|
38
38
|
range.data_node.points[140].value.must_equal(94)
|
39
|
-
ag = Chawk::Models::
|
39
|
+
ag = Chawk::Models::Aggregator.new(range.data_node)
|
40
40
|
ag.sum.must_equal(20066)
|
41
41
|
ag.mean.round(2).must_equal(91.21)
|
42
42
|
|
@@ -44,7 +44,7 @@ describe Chawk do
|
|
44
44
|
|
45
45
|
range.reload
|
46
46
|
range.data_node.points[200].value.must_equal(1500)
|
47
|
-
ag = Chawk::Models::
|
47
|
+
ag = Chawk::Models::Aggregator.new(range.data_node)
|
48
48
|
ag.sum.must_equal(48306)
|
49
49
|
ag.max.must_equal(1500)
|
50
50
|
ag.min.must_equal(0)
|
@@ -52,10 +52,47 @@ describe Chawk do
|
|
52
52
|
range = Chawk::Models::Range.create(start_ts:1088.0,stop_ts:8100.0,beats:14400,parent_node:node1)
|
53
53
|
range.data_node.points.length.must_equal(2)
|
54
54
|
|
55
|
-
ag = Chawk::Models::
|
55
|
+
ag = Chawk::Models::Aggregator.new(range.data_node)
|
56
56
|
ag.sum.must_equal(1592)
|
57
57
|
ag.mean.must_equal(796)
|
58
58
|
ag.stdev.round(2).must_equal(995.61)
|
59
59
|
|
60
60
|
end
|
61
|
+
|
62
|
+
it "calculates clusters" do
|
63
|
+
node1 = Chawk.node(@agent,'vals')
|
64
|
+
|
65
|
+
node1._insert_point(1,Time.parse("Nov 29, 2014 9:33:20 ").to_f)
|
66
|
+
node1._insert_point(1,Time.parse("Nov 29, 2014 12:40:20").to_f)
|
67
|
+
node1._insert_point(1,Time.parse("Nov 29, 2014 17:44:20").to_f)
|
68
|
+
node1._insert_point(1,Time.parse("Nov 30, 2014 9:33:20").to_f)
|
69
|
+
node1._insert_point(1,Time.parse("Nov 30, 2014 12:40:20").to_f)
|
70
|
+
node1._insert_point(1,Time.parse("Dec 1, 2014 17:44:20").to_f)
|
71
|
+
|
72
|
+
range = Chawk::Models::Range.create(start_ts:Time.parse("Nov 29, 2014 8:00:00").to_f,stop_ts:Time.parse("Dec 2, 2014 10:00:00"),beats:345600,parent_node:node1,strategy:"cluster")
|
73
|
+
range.data_node.points.length.must_equal(4)
|
74
|
+
range.data_node.points[0].value.must_equal(0)
|
75
|
+
range.data_node.points[1].value.must_equal(3)
|
76
|
+
range.data_node.points[2].value.must_equal(2)
|
77
|
+
range.data_node.points[3].value.must_equal(1)
|
78
|
+
end
|
79
|
+
|
80
|
+
it "calculates tallies" do
|
81
|
+
node1 = Chawk.node(@agent,'vals')
|
82
|
+
|
83
|
+
node1._insert_point(1,Time.parse("Nov 29, 2014 9:33:20 ").to_f)
|
84
|
+
node1._insert_point(1,Time.parse("Nov 29, 2014 12:40:20").to_f)
|
85
|
+
node1._insert_point(1,Time.parse("Nov 29, 2014 17:44:20").to_f)
|
86
|
+
node1._insert_point(1,Time.parse("Nov 30, 2014 9:33:20").to_f)
|
87
|
+
node1._insert_point(1,Time.parse("Nov 30, 2014 12:40:20").to_f)
|
88
|
+
node1._insert_point(1,Time.parse("Dec 1, 2014 17:44:20").to_f)
|
89
|
+
|
90
|
+
range = Chawk::Models::Range.create(start_ts:Time.parse("Nov 29, 2014 8:00:00").to_f,stop_ts:Time.parse("Dec 2, 2014 10:00:00"),beats:345600,parent_node:node1,strategy:"tally")
|
91
|
+
range.data_node.points.length.must_equal(4)
|
92
|
+
range.data_node.points[0].value.must_equal(0)
|
93
|
+
range.data_node.points[1].value.must_equal(3)
|
94
|
+
range.data_node.points[2].value.must_equal(5)
|
95
|
+
range.data_node.points[3].value.must_equal(6)
|
96
|
+
end
|
97
|
+
|
61
98
|
end
|
data/test/schema.rb
CHANGED
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chawk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Scott Russell
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03
|
11
|
+
date: 2014-04-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -98,30 +98,30 @@ dependencies:
|
|
98
98
|
name: pg
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - ">="
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: 0
|
103
|
+
version: '0'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- -
|
108
|
+
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: 0
|
110
|
+
version: '0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: sqlite3
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- -
|
115
|
+
- - ">="
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
117
|
+
version: '0'
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- -
|
122
|
+
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version:
|
124
|
+
version: '0'
|
125
125
|
description: A storage engine for time-series data. Eventually to include resampling,
|
126
126
|
statistical and aggregate data management.
|
127
127
|
email:
|
@@ -139,6 +139,7 @@ files:
|
|
139
139
|
- README.md
|
140
140
|
- Rakefile
|
141
141
|
- chawk.gemspec
|
142
|
+
- lib/aggregator.rb
|
142
143
|
- lib/chawk.rb
|
143
144
|
- lib/chawk/Jackdaw.svg
|
144
145
|
- lib/chawk/migration.rb
|