timescaledb 0.1.0 → 0.1.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 +0 -6
- data/Gemfile.lock +2 -2
- data/README.md +30 -8
- data/bin/console +4 -1
- data/bin/tsdb +24 -0
- data/lib/timescale/acts_as_hypertable.rb +114 -0
- data/lib/timescale/hypertable.rb +18 -2
- data/lib/timescale/job_stats.rb +6 -0
- data/lib/timescale/stats_report.rb +28 -0
- data/lib/timescale/version.rb +1 -1
- data/lib/timescale.rb +19 -4
- data/timescale.gemspec +10 -4
- metadata +79 -6
- data/lib/timescale/hypertable_helpers.rb +0 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 69db00d0dc568db01a5bd739183cd5615dbdc66267ad1441502d5c3774753dcb
|
4
|
+
data.tar.gz: be2271adcbc9e9b81302d9597824d18462ff64530c095c9e4a3239db1ccbaa51
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cc6a3bf67e7c73096d6a9a739d1a52ca0f4c560c80e1a7febf90a8e99d3f1009bd282ad16dfeb235b03c6613e27d7d35938a51a10314a1ffb83209b81686e748
|
7
|
+
data.tar.gz: effbd8f2686a312671c9275945a8705ec64453687699935872e7cb5e3445e1edcd982ee86b625dc69ba673166b13c9839d11a5756e95212b3dab4cca59055eeb
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -7,12 +7,13 @@ repository:
|
|
7
7
|
git clone https://github.com/jonatas/timescale.git
|
8
8
|
cd timescale
|
9
9
|
bundle install
|
10
|
+
rake install
|
10
11
|
```
|
11
12
|
|
12
|
-
Then you can run `
|
13
|
+
Then, with `rake install` or installing the gem in your computer, you can run `tsdb` for an interactive prompt.
|
13
14
|
|
14
15
|
```bash
|
15
|
-
|
16
|
+
tsdb postgres://<user>@localhost:5432/<dbname> --stats --flags
|
16
17
|
```
|
17
18
|
|
18
19
|
You can create a `.env` file locally to run tests locally. Make sure to put your
|
@@ -22,14 +23,35 @@ own credentials there!
|
|
22
23
|
PG_URI_TEST="postgres://<user>@localhost:5432/<dbname>"
|
23
24
|
```
|
24
25
|
|
25
|
-
You can
|
26
|
-
`
|
26
|
+
You can put some postgres URI directly as a parameter of
|
27
|
+
`tsdb`. Here is an example from the console:
|
27
28
|
|
28
|
-
|
29
|
-
|
29
|
+
```bash
|
30
|
+
tsdb "postgres://jonatasdp@localhost:5432/timescale_test"
|
31
|
+
```
|
32
|
+
|
33
|
+
To join the console use `--console`:
|
30
34
|
|
31
35
|
```bash
|
32
|
-
|
36
|
+
tsdb "postgres://jonatasdp@localhost:5432/timescale_test" --console
|
37
|
+
```
|
38
|
+
|
39
|
+
Or just check the stats:
|
40
|
+
|
41
|
+
```bash
|
42
|
+
tsdb "postgres://jonatasdp@localhost:5432/timescale_test" --stats
|
43
|
+
```
|
44
|
+
|
45
|
+
These is a sample output from an almost empty database:
|
46
|
+
|
47
|
+
```ruby
|
48
|
+
{:hypertables=>
|
49
|
+
{:count=>3,
|
50
|
+
:uncompressed=>2,
|
51
|
+
:chunks=>{:total=>1, :compressed=>0, :uncompressed=>1},
|
52
|
+
:size=>{:before_compressing=>"80 KB", :after_compressing=>"0 Bytes"}},
|
53
|
+
:continuous_aggregates=>{:count=>1},
|
54
|
+
:jobs_stats=>[{:success=>nil, :runs=>nil, :failures=>nil}]}
|
33
55
|
```
|
34
56
|
|
35
57
|
The console will dynamically create models for all hypertables that it finds
|
@@ -265,7 +287,7 @@ create the hypertable adding this hook to your `spec/rspec_helper.rb` file:
|
|
265
287
|
|
266
288
|
## Development
|
267
289
|
|
268
|
-
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `
|
290
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `tsdb` for an interactive prompt that will allow you to experiment.
|
269
291
|
|
270
292
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
271
293
|
|
data/bin/console
CHANGED
@@ -13,11 +13,14 @@ ActiveRecord::Base.establish_connection(ARGV[0] || uri_from_test)
|
|
13
13
|
|
14
14
|
Timescale::Hypertable.find_each do |hypertable|
|
15
15
|
class_name = hypertable.hypertable_name.singularize.camelize
|
16
|
+
|
16
17
|
model = Class.new(ActiveRecord::Base) do
|
17
18
|
self.table_name = hypertable.hypertable_name
|
18
19
|
self.primary_key = self.column_names.first
|
19
|
-
|
20
|
+
|
21
|
+
acts_as_hypertable
|
20
22
|
end
|
23
|
+
|
21
24
|
Timescale.const_set(class_name, model)
|
22
25
|
end
|
23
26
|
|
data/bin/tsdb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require "bundler/setup"
|
3
|
+
require "timescale"
|
4
|
+
|
5
|
+
ActiveRecord::Base.establish_connection(ARGV[0])
|
6
|
+
|
7
|
+
Timescale::Hypertable.find_each do |hypertable|
|
8
|
+
class_name = hypertable.hypertable_name.singularize.camelize
|
9
|
+
model = Class.new(ActiveRecord::Base) do
|
10
|
+
self.table_name = hypertable.hypertable_name
|
11
|
+
self.primary_key = self.column_names.first
|
12
|
+
include Timescale::HypertableHelpers
|
13
|
+
end
|
14
|
+
Timescale.const_set(class_name, model)
|
15
|
+
end
|
16
|
+
|
17
|
+
if ARGV.index("--stats")
|
18
|
+
pp Timescale.show_stats
|
19
|
+
end
|
20
|
+
|
21
|
+
if ARGV.index("--console")
|
22
|
+
require "pry"
|
23
|
+
Pry.start(Timescale)
|
24
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Timescale
|
4
|
+
# If you want your model to hook into its underlying hypertable
|
5
|
+
# as well as have access to TimescaleDB specific data, methods, and more,
|
6
|
+
# specify this macro in your model.
|
7
|
+
#
|
8
|
+
# @note Your model's table needs to have already been converted to a hypertable
|
9
|
+
# via the TimescaleDB `create_hypertable` function for this to work.
|
10
|
+
#
|
11
|
+
# @see https://docs.timescale.com/api/latest/hypertable/create_hypertable/ for
|
12
|
+
# how to use the SQL `create_hypertable` function.
|
13
|
+
# @see Timescale::MigrationHelpers#create_table for how to create a new hypertable
|
14
|
+
# via a Rails migration utilizing the standard `create_table` method.
|
15
|
+
#
|
16
|
+
# @example Enabling the macro on your model
|
17
|
+
# class Event < ActiveRecord::Base
|
18
|
+
# acts_as_hypertable
|
19
|
+
# end
|
20
|
+
#
|
21
|
+
# @see Timescale::ActsAsHypertable::ClassMethods#acts_as_hypertable
|
22
|
+
# for configuration options
|
23
|
+
module ActsAsHypertable
|
24
|
+
extend ActiveSupport::Concern
|
25
|
+
|
26
|
+
DEFAULT_OPTIONS = {
|
27
|
+
time_column: :created_at
|
28
|
+
}.freeze
|
29
|
+
|
30
|
+
module ClassMethods
|
31
|
+
# == Configuration options
|
32
|
+
#
|
33
|
+
# @param [Hash] options The options to initialize your macro with.
|
34
|
+
# @option options [Symbol] :time_column The name of the column in your
|
35
|
+
# model's table containing time values. The name provided should be
|
36
|
+
# the same name as the `time_column_name` you passed to the
|
37
|
+
# TimescaleDB `create_hypertable` function.
|
38
|
+
#
|
39
|
+
# @example Enabling the macro on your model with options
|
40
|
+
# class Event < ActiveRecord::Base
|
41
|
+
# acts_as_hypertable time_column: :timestamp
|
42
|
+
# end
|
43
|
+
#
|
44
|
+
def acts_as_hypertable(options = {})
|
45
|
+
return if already_declared_as_hypertable?
|
46
|
+
|
47
|
+
extend Timescale::ActsAsHypertable::HypertableClassMethods
|
48
|
+
|
49
|
+
class_attribute :hypertable_options, instance_writer: false
|
50
|
+
|
51
|
+
self.hypertable_options = DEFAULT_OPTIONS.dup
|
52
|
+
hypertable_options.merge!(options)
|
53
|
+
normalize_hypertable_options
|
54
|
+
|
55
|
+
define_association_scopes
|
56
|
+
define_default_scopes
|
57
|
+
end
|
58
|
+
|
59
|
+
def define_association_scopes
|
60
|
+
scope :chunks, -> do
|
61
|
+
Chunk.where(hypertable_name: table_name)
|
62
|
+
end
|
63
|
+
|
64
|
+
scope :hypertable, -> do
|
65
|
+
Hypertable.find_by(hypertable_name: table_name)
|
66
|
+
end
|
67
|
+
|
68
|
+
scope :jobs, -> do
|
69
|
+
Job.where(hypertable_name: table_name)
|
70
|
+
end
|
71
|
+
|
72
|
+
scope :job_stats, -> do
|
73
|
+
JobStats.where(hypertable_name: table_name)
|
74
|
+
end
|
75
|
+
|
76
|
+
scope :compression_settings, -> do
|
77
|
+
CompressionSettings.where(hypertable_name: table_name)
|
78
|
+
end
|
79
|
+
|
80
|
+
scope :continuous_aggregates, -> do
|
81
|
+
ContinuousAggregates.where(hypertable_name: table_name)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def define_default_scopes
|
86
|
+
scope :last_month, -> { where("#{time_column} > ?", 1.month.ago) }
|
87
|
+
scope :last_week, -> { where("#{time_column} > ?", 1.week.ago) }
|
88
|
+
scope :last_hour, -> { where("#{time_column} > ?", 1.hour.ago) }
|
89
|
+
scope :yesterday, -> { where("#{time_column} = ?", 1.day.ago.to_date) }
|
90
|
+
scope :today, -> { where("#{time_column} = ?", Date.today) }
|
91
|
+
end
|
92
|
+
|
93
|
+
private
|
94
|
+
|
95
|
+
def already_declared_as_hypertable?
|
96
|
+
singleton_class
|
97
|
+
.included_modules
|
98
|
+
.include?(Timescale::ActsAsHypertable::HypertableClassMethods)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
module HypertableClassMethods
|
103
|
+
def time_column
|
104
|
+
@hypertable_time_column ||= hypertable_options[:time_column] || :created_at
|
105
|
+
end
|
106
|
+
|
107
|
+
protected
|
108
|
+
|
109
|
+
def normalize_hypertable_options
|
110
|
+
hypertable_options[:time_column] = hypertable_options[:time_column].to_sym
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
data/lib/timescale/hypertable.rb
CHANGED
@@ -15,12 +15,28 @@ module Timescale
|
|
15
15
|
foreign_key: "hypertable_name",
|
16
16
|
class_name: "Timescale::ContinuousAggregates"
|
17
17
|
|
18
|
-
def
|
18
|
+
def chunks_detailed_size
|
19
19
|
struct_from "SELECT * from chunks_detailed_size('#{self.hypertable_name}')"
|
20
20
|
end
|
21
21
|
|
22
|
+
def approximate_row_count
|
23
|
+
struct_from("SELECT * FROM approximate_row_count('#{self.hypertable_name}')").first.approximate_row_count
|
24
|
+
end
|
25
|
+
|
22
26
|
def compression_stats
|
23
|
-
struct_from
|
27
|
+
struct_from("SELECT * from hypertable_compression_stats('#{self.hypertable_name}')").first || {}
|
28
|
+
end
|
29
|
+
|
30
|
+
def detailed_size
|
31
|
+
struct_from("SELECT * FROM hypertable_detailed_size('#{self.hypertable_name}')").first
|
32
|
+
end
|
33
|
+
|
34
|
+
def before_total_bytes
|
35
|
+
compression_stats["before_compression_total_bytes"] || detailed_size.total_bytes
|
36
|
+
end
|
37
|
+
|
38
|
+
def after_total_bytes
|
39
|
+
compression_stats["after_compression_total_bytes"] || 0
|
24
40
|
end
|
25
41
|
|
26
42
|
private
|
data/lib/timescale/job_stats.rb
CHANGED
@@ -8,5 +8,11 @@ module Timescale
|
|
8
8
|
|
9
9
|
scope :success, -> { where(last_run_status: "Success") }
|
10
10
|
scope :scheduled, -> { where(job_status: "Scheduled") }
|
11
|
+
scope :resume, -> do
|
12
|
+
select("sum(total_successes)::int as success,
|
13
|
+
sum(total_runs)::int as runs,
|
14
|
+
sum(total_failures)::int as failures")
|
15
|
+
.to_a.map{|e|e.attributes.transform_keys(&:to_sym) }
|
16
|
+
end
|
11
17
|
end
|
12
18
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "active_support/core_ext/numeric/conversions"
|
2
|
+
module Timescale
|
3
|
+
module StatsReport
|
4
|
+
module_function
|
5
|
+
def resume
|
6
|
+
{
|
7
|
+
hypertables: {
|
8
|
+
count: Hypertable.count,
|
9
|
+
uncompressed: Hypertable.all.to_a.count { |h| h.compression_stats.empty? },
|
10
|
+
approximate_row_count: Hypertable.all.to_a.map do |hypertable|
|
11
|
+
{ hypertable.hypertable_name => hypertable.approximate_row_count }
|
12
|
+
end.inject(&:merge!),
|
13
|
+
chunks: {
|
14
|
+
total: Chunk.count,
|
15
|
+
compressed: Chunk.compressed.count,
|
16
|
+
uncompressed: Chunk.uncompressed.count
|
17
|
+
},
|
18
|
+
size: {
|
19
|
+
before_compressing: Hypertable.all.map{|h|h.before_total_bytes}.inject(:+).to_s(:human_size),
|
20
|
+
after_compressing: Hypertable.all.map{|h|h.after_total_bytes}.inject(:+).to_s(:human_size)
|
21
|
+
}
|
22
|
+
},
|
23
|
+
continuous_aggregates: { count: ContinuousAggregates.count },
|
24
|
+
jobs_stats: JobStats.resume
|
25
|
+
}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/timescale/version.rb
CHANGED
data/lib/timescale.rb
CHANGED
@@ -1,16 +1,19 @@
|
|
1
|
-
require "timescale/version"
|
2
1
|
require 'active_record'
|
2
|
+
|
3
|
+
require_relative 'timescale/acts_as_hypertable'
|
3
4
|
require_relative 'timescale/chunk'
|
5
|
+
require_relative 'timescale/compression_settings'
|
6
|
+
require_relative 'timescale/continuous_aggregates'
|
4
7
|
require_relative 'timescale/hypertable'
|
5
8
|
require_relative 'timescale/job'
|
6
9
|
require_relative 'timescale/job_stats'
|
7
|
-
require_relative 'timescale/
|
8
|
-
require_relative 'timescale/compression_settings'
|
9
|
-
require_relative 'timescale/hypertable_helpers'
|
10
|
+
require_relative 'timescale/stats_report'
|
10
11
|
require_relative 'timescale/migration_helpers'
|
12
|
+
require_relative 'timescale/version'
|
11
13
|
|
12
14
|
module Timescale
|
13
15
|
module_function
|
16
|
+
|
14
17
|
def chunks
|
15
18
|
Chunk.all
|
16
19
|
end
|
@@ -34,4 +37,16 @@ module Timescale
|
|
34
37
|
def job_stats
|
35
38
|
JobStats.all
|
36
39
|
end
|
40
|
+
|
41
|
+
def show_stats
|
42
|
+
StatsReport.resume
|
43
|
+
end
|
44
|
+
|
45
|
+
def default_hypertable_options
|
46
|
+
Timescale::ActsAsHypertable::DEFAULT_OPTIONS
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
ActiveSupport.on_load :active_record do
|
51
|
+
include Timescale::ActsAsHypertable
|
37
52
|
end
|
data/timescale.gemspec
CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |spec|
|
|
6
6
|
spec.authors = ["Jônatas Davi Paganini"]
|
7
7
|
spec.email = ["jonatasdp@gmail.com"]
|
8
8
|
|
9
|
-
spec.summary = %q{
|
9
|
+
spec.summary = %q{TimescaleDB helpers for Ruby ecosystem.}
|
10
10
|
spec.description = %q{Functions from timescaledb available in the ActiveRecord models.}
|
11
11
|
spec.homepage = "https://github.com/jonatas/timescale"
|
12
12
|
spec.license = "MIT"
|
@@ -23,10 +23,16 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
24
24
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
25
25
|
end
|
26
|
-
spec.bindir = "
|
27
|
-
spec.executables = spec.files.grep(%r{^
|
26
|
+
spec.bindir = "bin"
|
27
|
+
spec.executables = spec.files.grep(%r{^bin/tsdb}) { |f| File.basename(f) }
|
28
28
|
spec.require_paths = ["lib"]
|
29
29
|
|
30
30
|
spec.add_dependency "pg", "~> 1.2"
|
31
|
-
spec.add_dependency
|
31
|
+
spec.add_dependency "activerecord"
|
32
|
+
|
33
|
+
spec.add_development_dependency "pry"
|
34
|
+
spec.add_development_dependency "rspec-its"
|
35
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
36
|
+
spec.add_development_dependency "dotenv"
|
37
|
+
spec.add_development_dependency "rake", "~> 12.0"
|
32
38
|
end
|
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.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jônatas Davi Paganini
|
8
8
|
autorequire:
|
9
|
-
bindir:
|
9
|
+
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-10-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pg
|
@@ -38,10 +38,81 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: pry
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec-its
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '3.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: dotenv
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rake
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '12.0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '12.0'
|
41
111
|
description: Functions from timescaledb available in the ActiveRecord models.
|
42
112
|
email:
|
43
113
|
- jonatasdp@gmail.com
|
44
|
-
executables:
|
114
|
+
executables:
|
115
|
+
- tsdb
|
45
116
|
extensions: []
|
46
117
|
extra_rdoc_files: []
|
47
118
|
files:
|
@@ -56,18 +127,20 @@ files:
|
|
56
127
|
- Rakefile
|
57
128
|
- bin/console
|
58
129
|
- bin/setup
|
130
|
+
- bin/tsdb
|
59
131
|
- examples/Gemfile
|
60
132
|
- examples/Gemfile.lock
|
61
133
|
- examples/all_in_one.rb
|
62
134
|
- lib/timescale.rb
|
135
|
+
- lib/timescale/acts_as_hypertable.rb
|
63
136
|
- lib/timescale/chunk.rb
|
64
137
|
- lib/timescale/compression_settings.rb
|
65
138
|
- lib/timescale/continuous_aggregates.rb
|
66
139
|
- lib/timescale/hypertable.rb
|
67
|
-
- lib/timescale/hypertable_helpers.rb
|
68
140
|
- lib/timescale/job.rb
|
69
141
|
- lib/timescale/job_stats.rb
|
70
142
|
- lib/timescale/migration_helpers.rb
|
143
|
+
- lib/timescale/stats_report.rb
|
71
144
|
- lib/timescale/version.rb
|
72
145
|
- timescale.gemspec
|
73
146
|
homepage: https://github.com/jonatas/timescale
|
@@ -94,5 +167,5 @@ requirements: []
|
|
94
167
|
rubygems_version: 3.0.3
|
95
168
|
signing_key:
|
96
169
|
specification_version: 4
|
97
|
-
summary:
|
170
|
+
summary: TimescaleDB helpers for Ruby ecosystem.
|
98
171
|
test_files: []
|
@@ -1,39 +0,0 @@
|
|
1
|
-
require_relative 'chunk'
|
2
|
-
require_relative 'hypertable'
|
3
|
-
module Timescale
|
4
|
-
module HypertableHelpers
|
5
|
-
extend ActiveSupport::Concern
|
6
|
-
|
7
|
-
included do
|
8
|
-
scope :chunks, -> () do
|
9
|
-
Chunk.where(hypertable_name: self.table_name)
|
10
|
-
end
|
11
|
-
|
12
|
-
scope :hypertable, -> () do
|
13
|
-
Hypertable.find_by(hypertable_name: self.table_name)
|
14
|
-
end
|
15
|
-
|
16
|
-
scope :jobs, -> () do
|
17
|
-
Job.where(hypertable_name: self.table_name)
|
18
|
-
end
|
19
|
-
|
20
|
-
scope :job_stats, -> () do
|
21
|
-
JobStats.where(hypertable_name: self.table_name)
|
22
|
-
end
|
23
|
-
|
24
|
-
scope :compression_settings, -> () do
|
25
|
-
CompressionSettings.where(hypertable_name: self.table_name)
|
26
|
-
end
|
27
|
-
|
28
|
-
scope :continuous_aggregates, -> () do
|
29
|
-
ContinuousAggregates.where(hypertable_name: self.table_name)
|
30
|
-
end
|
31
|
-
|
32
|
-
scope :last_month, -> { where('created_at > ?', 1.month.ago) }
|
33
|
-
scope :last_week, -> { where('created_at > ?', 1.week.ago) }
|
34
|
-
scope :last_hour, -> { where('created_at > ?', 1.hour.ago) }
|
35
|
-
scope :yesterday, -> { where('DATE(created_at) = ?', 1.day.ago.to_date) }
|
36
|
-
scope :today, -> { where('DATE(created_at) = ?', Date.today) }
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|