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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 75c272978a418036f10a0f03297b48af7f40b7f4
4
- data.tar.gz: 44b65c108649fb2fd8ab58f337c919ad02e7e959
3
+ metadata.gz: 3043b4d0a900dcc861435dd5377a7acabca5329c
4
+ data.tar.gz: f170e087c3f43e1770db9d4071bbc2f798c367f9
5
5
  SHA512:
6
- metadata.gz: 72f85f23a8d05e8adc1308e389796fb605867d6f9126655744e03c04ae9f9bc298a302418078f1ab3e2bba57c56d3b34e4b747a9c6212912a84fcc10c83fdf90
7
- data.tar.gz: 05640ad20ba4b52f3671d7a1ffeb401f4445b9a2edc4c5bafb76794ebdf35241e5b7f36a4508aa840daa43d0279582850fcd551908716e87bd1b80997440db65
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
 
@@ -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', "0.17.1")
29
- spec.add_development_dependency('sqlite3', "1.3.9")
30
- # spec.add_development_dependency('pry')
31
- # spec.add_development_dependency('pry-debugger')
32
- # spec.add_development_dependency('pry-stack_explorer')
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
@@ -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
@@ -1,6 +1,9 @@
1
1
  require "chawk/version"
2
2
  require 'quantizer'
3
3
  require 'models'
4
+ require 'node'
5
+ require 'range'
6
+ require 'aggregator'
4
7
 
5
8
  # Chawk is a gem for storing and retrieving time seris data.
6
9
  module Chawk
@@ -10,6 +10,7 @@ class CreateChawkBase < ActiveRecord::Migration
10
10
  t.float "stop_ts"
11
11
  t.integer "beats"
12
12
  t.integer "default"
13
+ t.string "strategy"
13
14
  t.timestamp "expires"
14
15
  t.timestamps
15
16
  end
@@ -1,4 +1,4 @@
1
1
  module Chawk
2
2
  # The current version of Chawk
3
- VERSION = "0.3.0"
3
+ VERSION = "0.4.0"
4
4
  end
@@ -1,6 +1,4 @@
1
1
  require 'active_record'
2
- require 'node'
3
- require 'range'
4
2
  module Chawk
5
3
  # Models used in Chawk. ActiveRecord classes.
6
4
  module Models
@@ -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
@@ -44,7 +44,19 @@ module Chawk
44
44
  populate!
45
45
  end
46
46
 
47
- def point_from_parent_point(now)
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
- point = point_from_parent_point now
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
@@ -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 range" do
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::NodeAggregator.new(range.data_node)
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::NodeAggregator.new(range.data_node)
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::NodeAggregator.new(range.data_node)
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::NodeAggregator.new(range.data_node)
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
@@ -44,6 +44,7 @@ ActiveRecord::Schema.define(version: 0) do
44
44
  t.float "stop_ts"
45
45
  t.integer "beats"
46
46
  t.integer "default"
47
+ t.string "strategy"
47
48
  t.datetime "expires"
48
49
  t.datetime "created_at"
49
50
  t.datetime "updated_at"
@@ -27,6 +27,7 @@ ENV["CHAWK_DEBUG"] ? debug_level=ENV["CHAWK_DEBUG"] : debug_level=:info
27
27
  #end
28
28
 
29
29
  require 'active_record'
30
+ require 'yaml'
30
31
 
31
32
  if ENV["TEST_DATABASE_URLX"]
32
33
  ActiveRecord::Base.establish_connection ENV["TEST_DATABASE_URL"]
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.3.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-29 00:00:00.000000000 Z
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.17.1
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.17.1
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: 1.3.9
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: 1.3.9
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