timescaledb 0.2.0 → 0.2.2
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 +41 -9
- data/bin/console +2 -2
- data/bin/tsdb +3 -3
- data/docs/command_line.md +178 -0
- data/docs/img/lttb_example.png +0 -0
- data/docs/img/lttb_sql_vs_ruby.gif +0 -0
- data/docs/img/lttb_zoom.gif +0 -0
- data/docs/index.md +61 -0
- data/docs/migrations.md +69 -0
- data/docs/models.md +78 -0
- data/docs/toolkit.md +394 -0
- data/docs/toolkit_lttb_tutorial.md +557 -0
- data/docs/toolkit_lttb_zoom.md +357 -0
- data/docs/videos.md +16 -0
- data/examples/all_in_one/all_in_one.rb +40 -6
- data/examples/all_in_one/benchmark_comparison.rb +108 -0
- data/examples/all_in_one/caggs.rb +93 -0
- data/examples/all_in_one/query_data.rb +78 -0
- data/examples/ranking/config/initializers/timescale.rb +1 -2
- data/examples/toolkit-demo/compare_volatility.rb +64 -0
- data/examples/toolkit-demo/lttb/README.md +15 -0
- data/examples/toolkit-demo/lttb/lttb.rb +92 -0
- data/examples/toolkit-demo/lttb/lttb_sinatra.rb +139 -0
- data/examples/toolkit-demo/lttb/lttb_test.rb +21 -0
- data/examples/toolkit-demo/lttb/views/index.erb +27 -0
- data/examples/toolkit-demo/lttb-zoom/README.md +13 -0
- data/examples/toolkit-demo/lttb-zoom/lttb_zoomable.rb +90 -0
- data/examples/toolkit-demo/lttb-zoom/views/index.erb +33 -0
- data/lib/timescaledb/acts_as_time_vector.rb +18 -0
- data/lib/timescaledb/dimensions.rb +1 -0
- data/lib/timescaledb/hypertable.rb +5 -1
- data/lib/timescaledb/migration_helpers.rb +30 -11
- data/lib/timescaledb/schema_dumper.rb +4 -1
- data/lib/timescaledb/stats_report.rb +1 -1
- data/lib/timescaledb/toolkit/helpers.rb +20 -0
- data/lib/timescaledb/toolkit/time_vector.rb +66 -0
- data/lib/timescaledb/toolkit.rb +3 -0
- data/lib/timescaledb/version.rb +1 -1
- data/lib/timescaledb.rb +1 -0
- data/mkdocs.yml +33 -0
- metadata +30 -4
- data/examples/all_in_one/Gemfile +0 -11
- data/examples/all_in_one/Gemfile.lock +0 -51
@@ -10,13 +10,16 @@ module Timescaledb
|
|
10
10
|
|
11
11
|
def table(table_name, stream)
|
12
12
|
super(table_name, stream)
|
13
|
-
if
|
13
|
+
if Timescaledb::Hypertable.table_exists? &&
|
14
|
+
(hypertable = Timescaledb::Hypertable.find_by(hypertable_name: table_name))
|
14
15
|
timescale_hypertable(hypertable, stream)
|
15
16
|
timescale_retention_policy(hypertable, stream)
|
16
17
|
end
|
17
18
|
end
|
18
19
|
|
19
20
|
def views(stream)
|
21
|
+
return unless Timescaledb::ContinuousAggregates.table_exists?
|
22
|
+
|
20
23
|
timescale_continuous_aggregates(stream) # Define these before any Scenic views that might use them
|
21
24
|
super if defined?(super)
|
22
25
|
end
|
@@ -19,7 +19,7 @@ module Timescaledb
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def compression_resume(scope)
|
22
|
-
sum = -> (method) { (scope.map(&method).inject(:+) || 0).
|
22
|
+
sum = -> (method) { (scope.map(&method).inject(:+) || 0).to_s(:human_size)}
|
23
23
|
{
|
24
24
|
uncompressed: sum[:before_total_bytes],
|
25
25
|
compressed: sum[:after_total_bytes]
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'active_record/connection_adapters/postgresql_adapter'
|
2
|
+
|
3
|
+
# Useful methods to run TimescaleDB with Toolkit functions in you Ruby app.
|
4
|
+
module Timescaledb
|
5
|
+
# Helpers methods to setup queries that uses the toolkit.
|
6
|
+
module Toolkit
|
7
|
+
module Helpers
|
8
|
+
|
9
|
+
# Includes toolkit_experimental in the search path to make it easy to have
|
10
|
+
# access to all the functions
|
11
|
+
def add_toolkit_to_search_path!
|
12
|
+
return if schema_search_path.include?("toolkit_experimental")
|
13
|
+
|
14
|
+
self.schema_search_path = "#{schema_search_path}, toolkit_experimental"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.include(Timescaledb::Toolkit::Helpers)
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Timescaledb
|
4
|
+
module Toolkit
|
5
|
+
module TimeVector
|
6
|
+
def self.included(base)
|
7
|
+
base.extend(ClassMethods)
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
def value_column
|
12
|
+
@value_column ||= time_vector_options[:value_column] || :val
|
13
|
+
end
|
14
|
+
|
15
|
+
def time_column
|
16
|
+
respond_to?(:time_column) && super || time_vector_options[:time_column]
|
17
|
+
end
|
18
|
+
def segment_by_column
|
19
|
+
time_vector_options[:segment_by]
|
20
|
+
end
|
21
|
+
|
22
|
+
protected
|
23
|
+
|
24
|
+
def define_default_scopes
|
25
|
+
scope :volatility, -> (segment_by: segment_by_column) do
|
26
|
+
select([*segment_by,
|
27
|
+
"timevector(#{time_column}, #{value_column}) -> sort() -> delta() -> abs() -> sum() as volatility"
|
28
|
+
].join(", "))
|
29
|
+
.group(segment_by)
|
30
|
+
end
|
31
|
+
|
32
|
+
scope :time_weight, -> (segment_by: segment_by_column) do
|
33
|
+
select([*segment_by,
|
34
|
+
"timevector(#{time_column}, #{value_column}) -> sort() -> delta() -> abs() -> time_weight() as time_weight"
|
35
|
+
].join(", "))
|
36
|
+
.group(segment_by)
|
37
|
+
end
|
38
|
+
|
39
|
+
scope :lttb, -> (threshold:, segment_by: segment_by_column, time: time_column, value: value_column) do
|
40
|
+
lttb_query = <<~SQL
|
41
|
+
WITH x AS ( #{select(*segment_by, time_column, value_column).to_sql})
|
42
|
+
SELECT #{"x.#{segment_by}," if segment_by}
|
43
|
+
(lttb( x.#{time_column}, x.#{value_column}, #{threshold})
|
44
|
+
-> toolkit_experimental.unnest()).*
|
45
|
+
FROM x
|
46
|
+
#{"GROUP BY device_id" if segment_by}
|
47
|
+
SQL
|
48
|
+
downsampled = unscoped
|
49
|
+
.select(*segment_by, "time as #{time_column}, value as #{value_column}")
|
50
|
+
.from("(#{lttb_query}) as x")
|
51
|
+
if segment_by
|
52
|
+
downsampled.inject({}) do |group,e|
|
53
|
+
key = e.send(segment_by)
|
54
|
+
(group[key] ||= []) << [e.send(time_column), e.send(value_column)]
|
55
|
+
group
|
56
|
+
end
|
57
|
+
else
|
58
|
+
downsampled.map{|e|[ e[time_column],e[value_column]]}
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
data/lib/timescaledb/version.rb
CHANGED
data/lib/timescaledb.rb
CHANGED
@@ -2,6 +2,7 @@ require 'active_record'
|
|
2
2
|
|
3
3
|
require_relative 'timescaledb/acts_as_hypertable'
|
4
4
|
require_relative 'timescaledb/acts_as_hypertable/core'
|
5
|
+
require_relative 'timescaledb/toolkit'
|
5
6
|
require_relative 'timescaledb/chunk'
|
6
7
|
require_relative 'timescaledb/compression_settings'
|
7
8
|
require_relative 'timescaledb/continuous_aggregates'
|
data/mkdocs.yml
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
site_name: The Timescaledb gem
|
2
|
+
repo_url: https://github.com/jonatas/timescaledb
|
3
|
+
edit_uri: edit/master/docs/
|
4
|
+
extra:
|
5
|
+
analytics:
|
6
|
+
provider: google
|
7
|
+
property: G-9B2BMB0TNQ
|
8
|
+
theme:
|
9
|
+
name: material
|
10
|
+
palette:
|
11
|
+
primary: indigo
|
12
|
+
accent: pink
|
13
|
+
markdown_extensions:
|
14
|
+
- admonition
|
15
|
+
- codehilite:
|
16
|
+
guess_lang: false
|
17
|
+
- toc:
|
18
|
+
permalink: true
|
19
|
+
- pymdownx.highlight:
|
20
|
+
anchor_linenums: true
|
21
|
+
- pymdownx.inlinehilite
|
22
|
+
- pymdownx.snippets
|
23
|
+
- pymdownx.superfences
|
24
|
+
|
25
|
+
nav:
|
26
|
+
- Introduction: index.md
|
27
|
+
- Migrations: migrations.md
|
28
|
+
- Models: models.md
|
29
|
+
- Toolkit Integration: toolkit.md
|
30
|
+
- Toolkit LTTB Tutorial: toolkit_lttb_tutorial.md
|
31
|
+
- Zooming with High Resolution: toolkit_lttb_zoom.md
|
32
|
+
- Command Line: command_line.md
|
33
|
+
- Videos: videos.md
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: timescaledb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jônatas Davi Paganini
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-10-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pg
|
@@ -160,9 +160,21 @@ files:
|
|
160
160
|
- bin/console
|
161
161
|
- bin/setup
|
162
162
|
- bin/tsdb
|
163
|
-
-
|
164
|
-
-
|
163
|
+
- docs/command_line.md
|
164
|
+
- docs/img/lttb_example.png
|
165
|
+
- docs/img/lttb_sql_vs_ruby.gif
|
166
|
+
- docs/img/lttb_zoom.gif
|
167
|
+
- docs/index.md
|
168
|
+
- docs/migrations.md
|
169
|
+
- docs/models.md
|
170
|
+
- docs/toolkit.md
|
171
|
+
- docs/toolkit_lttb_tutorial.md
|
172
|
+
- docs/toolkit_lttb_zoom.md
|
173
|
+
- docs/videos.md
|
165
174
|
- examples/all_in_one/all_in_one.rb
|
175
|
+
- examples/all_in_one/benchmark_comparison.rb
|
176
|
+
- examples/all_in_one/caggs.rb
|
177
|
+
- examples/all_in_one/query_data.rb
|
166
178
|
- examples/ranking/.gitattributes
|
167
179
|
- examples/ranking/.gitignore
|
168
180
|
- examples/ranking/.ruby-version
|
@@ -212,9 +224,19 @@ files:
|
|
212
224
|
- examples/ranking/tmp/pids/.keep
|
213
225
|
- examples/ranking/tmp/storage/.keep
|
214
226
|
- examples/ranking/vendor/.keep
|
227
|
+
- examples/toolkit-demo/compare_volatility.rb
|
228
|
+
- examples/toolkit-demo/lttb-zoom/README.md
|
229
|
+
- examples/toolkit-demo/lttb-zoom/lttb_zoomable.rb
|
230
|
+
- examples/toolkit-demo/lttb-zoom/views/index.erb
|
231
|
+
- examples/toolkit-demo/lttb/README.md
|
232
|
+
- examples/toolkit-demo/lttb/lttb.rb
|
233
|
+
- examples/toolkit-demo/lttb/lttb_sinatra.rb
|
234
|
+
- examples/toolkit-demo/lttb/lttb_test.rb
|
235
|
+
- examples/toolkit-demo/lttb/views/index.erb
|
215
236
|
- lib/timescaledb.rb
|
216
237
|
- lib/timescaledb/acts_as_hypertable.rb
|
217
238
|
- lib/timescaledb/acts_as_hypertable/core.rb
|
239
|
+
- lib/timescaledb/acts_as_time_vector.rb
|
218
240
|
- lib/timescaledb/chunk.rb
|
219
241
|
- lib/timescaledb/compression_settings.rb
|
220
242
|
- lib/timescaledb/continuous_aggregates.rb
|
@@ -227,7 +249,11 @@ files:
|
|
227
249
|
- lib/timescaledb/scenic/extension.rb
|
228
250
|
- lib/timescaledb/schema_dumper.rb
|
229
251
|
- lib/timescaledb/stats_report.rb
|
252
|
+
- lib/timescaledb/toolkit.rb
|
253
|
+
- lib/timescaledb/toolkit/helpers.rb
|
254
|
+
- lib/timescaledb/toolkit/time_vector.rb
|
230
255
|
- lib/timescaledb/version.rb
|
256
|
+
- mkdocs.yml
|
231
257
|
- timescaledb.gemspec
|
232
258
|
homepage: https://github.com/jonatas/timescaledb
|
233
259
|
licenses:
|
data/examples/all_in_one/Gemfile
DELETED
@@ -1,51 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: ..
|
3
|
-
specs:
|
4
|
-
timescaledb (0.1.2)
|
5
|
-
activerecord
|
6
|
-
pg (~> 1.2)
|
7
|
-
|
8
|
-
GEM
|
9
|
-
remote: https://rubygems.org/
|
10
|
-
specs:
|
11
|
-
activemodel (6.1.4.1)
|
12
|
-
activesupport (= 6.1.4.1)
|
13
|
-
activerecord (6.1.4.1)
|
14
|
-
activemodel (= 6.1.4.1)
|
15
|
-
activesupport (= 6.1.4.1)
|
16
|
-
activesupport (6.1.4.1)
|
17
|
-
concurrent-ruby (~> 1.0, >= 1.0.2)
|
18
|
-
i18n (>= 1.6, < 2)
|
19
|
-
minitest (>= 5.1)
|
20
|
-
tzinfo (~> 2.0)
|
21
|
-
zeitwerk (~> 2.3)
|
22
|
-
coderay (1.1.3)
|
23
|
-
composite_primary_keys (6.0.5)
|
24
|
-
activerecord (>= 4.0.0)
|
25
|
-
concurrent-ruby (1.1.9)
|
26
|
-
dotenv (2.7.6)
|
27
|
-
i18n (1.8.10)
|
28
|
-
concurrent-ruby (~> 1.0)
|
29
|
-
method_source (1.0.0)
|
30
|
-
minitest (5.14.4)
|
31
|
-
pg (1.2.3)
|
32
|
-
pry (0.14.0)
|
33
|
-
coderay (~> 1.1)
|
34
|
-
method_source (~> 1.0)
|
35
|
-
tzinfo (2.0.4)
|
36
|
-
concurrent-ruby (~> 1.0)
|
37
|
-
zeitwerk (2.4.2)
|
38
|
-
|
39
|
-
PLATFORMS
|
40
|
-
ruby
|
41
|
-
|
42
|
-
DEPENDENCIES
|
43
|
-
activerecord
|
44
|
-
composite_primary_keys (~> 6.0)
|
45
|
-
dotenv (~> 2.7)
|
46
|
-
pg
|
47
|
-
pry
|
48
|
-
timescaledb!
|
49
|
-
|
50
|
-
BUNDLED WITH
|
51
|
-
2.1.4
|