timescaledb 0.2.6 → 0.2.7

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.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/lib/timescaledb/acts_as_hypertable/core.rb +1 -1
  3. data/lib/timescaledb/database/quoting.rb +12 -0
  4. data/lib/timescaledb/database/schema_statements.rb +168 -0
  5. data/lib/timescaledb/database/types.rb +17 -0
  6. data/lib/timescaledb/database.rb +11 -0
  7. data/lib/timescaledb/toolkit/time_vector.rb +41 -4
  8. data/lib/timescaledb/version.rb +1 -1
  9. metadata +6 -95
  10. data/.github/workflows/ci.yml +0 -72
  11. data/.gitignore +0 -12
  12. data/.rspec +0 -3
  13. data/.ruby-version +0 -1
  14. data/.tool-versions +0 -1
  15. data/.travis.yml +0 -9
  16. data/CODE_OF_CONDUCT.md +0 -74
  17. data/Fastfile +0 -17
  18. data/Gemfile +0 -8
  19. data/Gemfile.lock +0 -75
  20. data/Gemfile.scenic +0 -7
  21. data/Gemfile.scenic.lock +0 -119
  22. data/README.md +0 -490
  23. data/Rakefile +0 -21
  24. data/bin/console +0 -28
  25. data/bin/setup +0 -13
  26. data/docs/command_line.md +0 -178
  27. data/docs/img/lttb_example.png +0 -0
  28. data/docs/img/lttb_sql_vs_ruby.gif +0 -0
  29. data/docs/img/lttb_zoom.gif +0 -0
  30. data/docs/index.md +0 -72
  31. data/docs/migrations.md +0 -76
  32. data/docs/models.md +0 -78
  33. data/docs/toolkit.md +0 -507
  34. data/docs/toolkit_lttb_tutorial.md +0 -557
  35. data/docs/toolkit_lttb_zoom.md +0 -357
  36. data/docs/toolkit_ohlc.md +0 -315
  37. data/docs/videos.md +0 -16
  38. data/examples/all_in_one/all_in_one.rb +0 -94
  39. data/examples/all_in_one/benchmark_comparison.rb +0 -108
  40. data/examples/all_in_one/caggs.rb +0 -93
  41. data/examples/all_in_one/query_data.rb +0 -78
  42. data/examples/ranking/.gitattributes +0 -7
  43. data/examples/ranking/.gitignore +0 -29
  44. data/examples/ranking/.ruby-version +0 -1
  45. data/examples/ranking/Gemfile +0 -33
  46. data/examples/ranking/Gemfile.lock +0 -189
  47. data/examples/ranking/README.md +0 -166
  48. data/examples/ranking/Rakefile +0 -6
  49. data/examples/ranking/app/controllers/application_controller.rb +0 -2
  50. data/examples/ranking/app/controllers/concerns/.keep +0 -0
  51. data/examples/ranking/app/jobs/application_job.rb +0 -7
  52. data/examples/ranking/app/models/application_record.rb +0 -3
  53. data/examples/ranking/app/models/concerns/.keep +0 -0
  54. data/examples/ranking/app/models/game.rb +0 -2
  55. data/examples/ranking/app/models/play.rb +0 -7
  56. data/examples/ranking/bin/bundle +0 -114
  57. data/examples/ranking/bin/rails +0 -4
  58. data/examples/ranking/bin/rake +0 -4
  59. data/examples/ranking/bin/setup +0 -33
  60. data/examples/ranking/config/application.rb +0 -39
  61. data/examples/ranking/config/boot.rb +0 -4
  62. data/examples/ranking/config/credentials.yml.enc +0 -1
  63. data/examples/ranking/config/database.yml +0 -86
  64. data/examples/ranking/config/environment.rb +0 -5
  65. data/examples/ranking/config/environments/development.rb +0 -60
  66. data/examples/ranking/config/environments/production.rb +0 -75
  67. data/examples/ranking/config/environments/test.rb +0 -53
  68. data/examples/ranking/config/initializers/cors.rb +0 -16
  69. data/examples/ranking/config/initializers/filter_parameter_logging.rb +0 -8
  70. data/examples/ranking/config/initializers/inflections.rb +0 -16
  71. data/examples/ranking/config/initializers/timescale.rb +0 -2
  72. data/examples/ranking/config/locales/en.yml +0 -33
  73. data/examples/ranking/config/puma.rb +0 -43
  74. data/examples/ranking/config/routes.rb +0 -6
  75. data/examples/ranking/config/storage.yml +0 -34
  76. data/examples/ranking/config.ru +0 -6
  77. data/examples/ranking/db/migrate/20220209120747_create_games.rb +0 -10
  78. data/examples/ranking/db/migrate/20220209120910_create_plays.rb +0 -19
  79. data/examples/ranking/db/migrate/20220209143347_create_score_per_hours.rb +0 -5
  80. data/examples/ranking/db/schema.rb +0 -47
  81. data/examples/ranking/db/seeds.rb +0 -7
  82. data/examples/ranking/db/views/score_per_hours_v01.sql +0 -7
  83. data/examples/ranking/lib/tasks/.keep +0 -0
  84. data/examples/ranking/log/.keep +0 -0
  85. data/examples/ranking/public/robots.txt +0 -1
  86. data/examples/ranking/storage/.keep +0 -0
  87. data/examples/ranking/tmp/.keep +0 -0
  88. data/examples/ranking/tmp/pids/.keep +0 -0
  89. data/examples/ranking/tmp/storage/.keep +0 -0
  90. data/examples/ranking/vendor/.keep +0 -0
  91. data/examples/toolkit-demo/compare_volatility.rb +0 -104
  92. data/examples/toolkit-demo/lttb/README.md +0 -15
  93. data/examples/toolkit-demo/lttb/lttb.rb +0 -92
  94. data/examples/toolkit-demo/lttb/lttb_sinatra.rb +0 -139
  95. data/examples/toolkit-demo/lttb/lttb_test.rb +0 -21
  96. data/examples/toolkit-demo/lttb/views/index.erb +0 -27
  97. data/examples/toolkit-demo/lttb-zoom/README.md +0 -13
  98. data/examples/toolkit-demo/lttb-zoom/lttb_zoomable.rb +0 -90
  99. data/examples/toolkit-demo/lttb-zoom/views/index.erb +0 -33
  100. data/examples/toolkit-demo/ohlc.rb +0 -175
  101. data/mkdocs.yml +0 -34
  102. data/timescaledb.gemspec +0 -40
data/Gemfile.lock DELETED
@@ -1,75 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- timescaledb (0.2.6)
5
- activerecord
6
- activesupport
7
- pg (~> 1.2)
8
-
9
- GEM
10
- remote: https://rubygems.org/
11
- specs:
12
- activemodel (6.1.4.1)
13
- activesupport (= 6.1.4.1)
14
- activerecord (6.1.4.1)
15
- activemodel (= 6.1.4.1)
16
- activesupport (= 6.1.4.1)
17
- activesupport (6.1.4.1)
18
- concurrent-ruby (~> 1.0, >= 1.0.2)
19
- i18n (>= 1.6, < 2)
20
- minitest (>= 5.1)
21
- tzinfo (~> 2.0)
22
- zeitwerk (~> 2.3)
23
- coderay (1.1.3)
24
- concurrent-ruby (1.1.9)
25
- database_cleaner-active_record (2.0.1)
26
- activerecord (>= 5.a)
27
- database_cleaner-core (~> 2.0.0)
28
- database_cleaner-core (2.0.1)
29
- diff-lcs (1.4.4)
30
- dotenv (2.7.6)
31
- gemika (0.6.1)
32
- i18n (1.8.10)
33
- concurrent-ruby (~> 1.0)
34
- method_source (1.0.0)
35
- minitest (5.14.4)
36
- pg (1.4.5)
37
- pry (0.14.1)
38
- coderay (~> 1.1)
39
- method_source (~> 1.0)
40
- rake (12.3.3)
41
- rspec (3.10.0)
42
- rspec-core (~> 3.10.0)
43
- rspec-expectations (~> 3.10.0)
44
- rspec-mocks (~> 3.10.0)
45
- rspec-core (3.10.1)
46
- rspec-support (~> 3.10.0)
47
- rspec-expectations (3.10.1)
48
- diff-lcs (>= 1.2.0, < 2.0)
49
- rspec-support (~> 3.10.0)
50
- rspec-its (1.3.0)
51
- rspec-core (>= 3.0.0)
52
- rspec-expectations (>= 3.0.0)
53
- rspec-mocks (3.10.2)
54
- diff-lcs (>= 1.2.0, < 2.0)
55
- rspec-support (~> 3.10.0)
56
- rspec-support (3.10.2)
57
- tzinfo (2.0.4)
58
- concurrent-ruby (~> 1.0)
59
- zeitwerk (2.4.2)
60
-
61
- PLATFORMS
62
- ruby
63
-
64
- DEPENDENCIES
65
- database_cleaner-active_record
66
- dotenv
67
- gemika
68
- pry
69
- rake (~> 12.0)
70
- rspec (~> 3.0)
71
- rspec-its
72
- timescaledb!
73
-
74
- BUNDLED WITH
75
- 2.2.31
data/Gemfile.scenic DELETED
@@ -1,7 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- # Specify your gem's dependencies in timescale.gemspec
4
- gemspec
5
-
6
- gem "scenic"
7
- gem "gemika"
data/Gemfile.scenic.lock DELETED
@@ -1,119 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- timescaledb (0.2.6)
5
- activerecord
6
- activesupport
7
- pg (~> 1.2)
8
-
9
- GEM
10
- remote: https://rubygems.org/
11
- specs:
12
- actionpack (6.1.4.1)
13
- actionview (= 6.1.4.1)
14
- activesupport (= 6.1.4.1)
15
- rack (~> 2.0, >= 2.0.9)
16
- rack-test (>= 0.6.3)
17
- rails-dom-testing (~> 2.0)
18
- rails-html-sanitizer (~> 1.0, >= 1.2.0)
19
- actionview (6.1.4.1)
20
- activesupport (= 6.1.4.1)
21
- builder (~> 3.1)
22
- erubi (~> 1.4)
23
- rails-dom-testing (~> 2.0)
24
- rails-html-sanitizer (~> 1.1, >= 1.2.0)
25
- activemodel (6.1.4.1)
26
- activesupport (= 6.1.4.1)
27
- activerecord (6.1.4.1)
28
- activemodel (= 6.1.4.1)
29
- activesupport (= 6.1.4.1)
30
- activesupport (6.1.4.1)
31
- concurrent-ruby (~> 1.0, >= 1.0.2)
32
- i18n (>= 1.6, < 2)
33
- minitest (>= 5.1)
34
- tzinfo (~> 2.0)
35
- zeitwerk (~> 2.3)
36
- builder (3.2.4)
37
- coderay (1.1.3)
38
- concurrent-ruby (1.1.9)
39
- crass (1.0.6)
40
- database_cleaner-active_record (2.0.1)
41
- activerecord (>= 5.a)
42
- database_cleaner-core (~> 2.0.0)
43
- database_cleaner-core (2.0.1)
44
- diff-lcs (1.4.4)
45
- dotenv (2.7.6)
46
- erubi (1.10.0)
47
- gemika (0.6.1)
48
- i18n (1.8.11)
49
- concurrent-ruby (~> 1.0)
50
- loofah (2.12.0)
51
- crass (~> 1.0.2)
52
- nokogiri (>= 1.5.9)
53
- method_source (1.0.0)
54
- mini_portile2 (2.6.1)
55
- minitest (5.14.4)
56
- nokogiri (1.12.5)
57
- mini_portile2 (~> 2.6.1)
58
- racc (~> 1.4)
59
- pg (1.4.5)
60
- pry (0.14.1)
61
- coderay (~> 1.1)
62
- method_source (~> 1.0)
63
- racc (1.6.0)
64
- rack (2.2.3)
65
- rack-test (1.1.0)
66
- rack (>= 1.0, < 3)
67
- rails-dom-testing (2.0.3)
68
- activesupport (>= 4.2.0)
69
- nokogiri (>= 1.6)
70
- rails-html-sanitizer (1.4.2)
71
- loofah (~> 2.3)
72
- railties (6.1.4.1)
73
- actionpack (= 6.1.4.1)
74
- activesupport (= 6.1.4.1)
75
- method_source
76
- rake (>= 0.13)
77
- thor (~> 1.0)
78
- rake (12.3.3)
79
- rspec (3.10.0)
80
- rspec-core (~> 3.10.0)
81
- rspec-expectations (~> 3.10.0)
82
- rspec-mocks (~> 3.10.0)
83
- rspec-core (3.10.1)
84
- rspec-support (~> 3.10.0)
85
- rspec-expectations (3.10.1)
86
- diff-lcs (>= 1.2.0, < 2.0)
87
- rspec-support (~> 3.10.0)
88
- rspec-its (1.3.0)
89
- rspec-core (>= 3.0.0)
90
- rspec-expectations (>= 3.0.0)
91
- rspec-mocks (3.10.2)
92
- diff-lcs (>= 1.2.0, < 2.0)
93
- rspec-support (~> 3.10.0)
94
- rspec-support (3.10.3)
95
- scenic (1.5.4)
96
- activerecord (>= 4.0.0)
97
- railties (>= 4.0.0)
98
- thor (1.1.0)
99
- tzinfo (2.0.4)
100
- concurrent-ruby (~> 1.0)
101
- zeitwerk (2.5.1)
102
-
103
- PLATFORMS
104
- ruby
105
- x86_64-darwin-20
106
-
107
- DEPENDENCIES
108
- database_cleaner-active_record
109
- dotenv
110
- gemika
111
- pry
112
- rake (~> 12.0)
113
- rspec (~> 3.0)
114
- rspec-its
115
- scenic
116
- timescaledb!
117
-
118
- BUNDLED WITH
119
- 2.2.33
data/README.md DELETED
@@ -1,490 +0,0 @@
1
- # TimescaleDB
2
-
3
- Welcome to the TimescaleDB gem! To experiment with the code, start installing the
4
- gem:
5
-
6
- ```bash
7
- gem install timescaledb
8
- ```
9
-
10
- ## The `tsdb` CLI
11
-
12
- When you install the gem locally, a new command line application named `tsdb`
13
- will be linked in your command line.
14
-
15
- It accepts a Postgresql URI and some extra flags that can help you to get more
16
- info from your TimescaleDB server:
17
-
18
- ```bash
19
- tsdb <uri> --stats
20
- ```
21
-
22
- Where the `<uri>` is replaced with params from your connection like:
23
-
24
- ```bash
25
- tsdb postgres://<user>@localhost:5432/<dbname> --stats
26
- ```
27
-
28
-
29
- Or just check the stats:
30
-
31
- ```bash
32
- tsdb "postgres://<user>@localhost:5432/timescaledb_test" --stats
33
- ```
34
-
35
- These is a sample output from database example with almost no data:
36
-
37
- ```ruby
38
- {:hypertables=>
39
- {:count=>3,
40
- :uncompressed=>2,
41
- :chunks=>{:total=>1, :compressed=>0, :uncompressed=>1},
42
- :size=>{:before_compressing=>"80 KB", :after_compressing=>"0 Bytes"}},
43
- :continuous_aggregates=>{:count=>1},
44
- :jobs_stats=>[{:success=>nil, :runs=>nil, :failures=>nil}]}
45
- ```
46
-
47
- To start a interactive ruby/[pry](https://github.com/pry/pry) console use `--console`:
48
- The console will dynamically create models for all hypertables that it finds
49
- in the database.
50
-
51
- Let's consider the [caggs.sql](https://gist.github.com/jonatas/95573ad8744994094ec9f284150004f9#file-caggs-sql)
52
- as the example of database.
53
-
54
-
55
- ```bash
56
- psql postgres://<user>@localhost:5432/playground -f caggs.sql
57
- ```
58
-
59
- Then use `tsdb` in the command line with the same URI and `--stats`:
60
-
61
- ```bash
62
- tsdb postgres://<user>@localhost:5432/playground --stats
63
- {:hypertables=>
64
- {:count=>1,
65
- :uncompressed=>1,
66
- :approximate_row_count=>{"ticks"=>352},
67
- :chunks=>{:total=>1, :compressed=>0, :uncompressed=>1},
68
- :size=>{:uncompressed=>"88 KB", :compressed=>"0 Bytes"}},
69
- :continuous_aggregates=>{:total=>1},
70
- :jobs_stats=>[{:success=>nil, :runs=>nil, :failures=>nil}]}
71
- ```
72
-
73
- To have some interactive playground with the actual database using ruby, just
74
- try the same command before changing from `--stats` to `--console`:
75
-
76
- ### tsdb --console
77
-
78
- The same database from previous example, is used so
79
- the context has a hypertable named `ticks` and a view named `ohlc_1m`.
80
-
81
-
82
- ```ruby
83
- tsdb postgres://<user>@localhost:5432/playground --console
84
- pry(Timescale)>
85
- ```
86
-
87
- The `tsdb` CLI will automatically create ActiveRecord models for hypertables and
88
- continuous aggregates views.
89
-
90
- ```ruby
91
- Tick
92
- => Timescaledb::Tick(time: datetime, symbol: string, price: decimal, volume: integer)
93
- ```
94
-
95
- Note that it's only created for this session and will never be cached in the
96
- library or any other place.
97
-
98
- In this case, `Tick` model comes from `ticks` hypertable that was found in the database.
99
- It contains several extra methods inherited from `acts_as_hypertable` macro.
100
-
101
- Let's start with the `.hypertable` method.
102
-
103
- ```ruby
104
- Tick.hypertable
105
- => #<Timescaledb::Hypertable:0x00007fe99c258900
106
- hypertable_schema: "public",
107
- hypertable_name: "ticks",
108
- owner: "jonatasdp",
109
- num_dimensions: 1,
110
- num_chunks: 1,
111
- compression_enabled: false,
112
- is_distributed: false,
113
- replication_factor: nil,
114
- data_nodes: nil,
115
- tablespaces: nil>
116
- ```
117
-
118
- The core of the hypertables are the fragmentation of the data into chunks that
119
- are the child tables that distribute the data. You can check all chunks directly
120
- from the hypertable relation.
121
-
122
- ```ruby
123
- Tick.hypertable.chunks
124
- unknown OID 2206: failed to recognize type of 'primary_dimension_type'. It will be treated as String.
125
- => [#<Timescaledb::Chunk:0x00007fe99c31b068
126
- hypertable_schema: "public",
127
- hypertable_name: "ticks",
128
- chunk_schema: "_timescaledb_internal",
129
- chunk_name: "_hyper_33_17_chunk",
130
- primary_dimension: "time",
131
- primary_dimension_type: "timestamp without time zone",
132
- range_start: 1999-12-30 00:00:00 +0000,
133
- range_end: 2000-01-06 00:00:00 +0000,
134
- range_start_integer: nil,
135
- range_end_integer: nil,
136
- is_compressed: false,
137
- chunk_tablespace: nil,
138
- data_nodes: nil>]
139
- ```
140
-
141
- > Chunks are created by partitioning a hypertable's data into one
142
- > (or potentially multiple) dimensions. All hypertables are partitioned by the
143
- > values belonging to a time column, which may be in timestamp, date, or
144
- > various integer forms. If the time partitioning interval is one day,
145
- > for example, then rows with timestamps that belong to the same day are co-located
146
- > within the same chunk, while rows belonging to different days belong to different chunks.
147
- > Learn more [here](https://docs.timescale.com/timescaledb/latest/overview/core-concepts/hypertables-and-chunks/).
148
-
149
- Another core concept of TimescaleDB is compression. With data partitioned, it
150
- becomes very convenient to compress and decompress chunks independently.
151
-
152
- ```ruby
153
- Tick.hypertable.chunks.first.compress!
154
- ActiveRecord::StatementInvalid: PG::FeatureNotSupported: ERROR: compression not enabled on "ticks"
155
- DETAIL: It is not possible to compress chunks on a hypertable that does not have compression enabled.
156
- HINT: Enable compression using ALTER TABLE with the timescaledb.compress option.
157
- ```
158
-
159
- As compression is not enabled, let's do it executing a plain SQL directly from
160
- the actual context. To borrow a connection, let's use the Tick object.
161
-
162
- ```ruby
163
- Tick.connection.execute("ALTER TABLE ticks SET (timescaledb.compress)") # => PG_OK
164
- ```
165
-
166
- And now, it's possible to compress and decompress:
167
-
168
- ```ruby
169
- Tick.hypertable.chunks.first.compress!
170
- Tick.hypertable.chunks.first.decompress!
171
- ```
172
- Learn more about TimescaleDB compression [here](https://docs.timescale.com/timescaledb/latest/overview/core-concepts/compression/).
173
-
174
- The `ohlc_1m` view is also available as an ActiveRecord:
175
-
176
- ```ruby
177
- Ohlc1m
178
- => Timescaledb::Ohlc1m(bucket: datetime, symbol: string, open: decimal, high: decimal, low: decimal, close: decimal, volume: integer)
179
- ```
180
-
181
- And you can run any query as you do with regular active record queries.
182
-
183
- ```ruby
184
- Ohlc1m.order(bucket: :desc).last
185
- => #<Timescaledb::Ohlc1m:0x00007fe99c2c38e0
186
- bucket: 2000-01-01 00:00:00 UTC,
187
- symbol: "SYMBOL",
188
- open: 0.13e2,
189
- high: 0.3e2,
190
- low: 0.1e1,
191
- close: 0.1e2,
192
- volume: 27600>
193
- ```
194
-
195
- ## Installation
196
-
197
- Add this line to your application's Gemfile:
198
-
199
- ```ruby
200
- gem 'timescaledb'
201
- ```
202
-
203
- And then execute:
204
-
205
- $ bundle install
206
-
207
- Or install it yourself as:
208
-
209
- $ gem install timescaledb
210
-
211
-
212
- ## Usage
213
-
214
- Check the [examples/ranking](examples/ranking) to get a Rails complete example.
215
-
216
- You can check the [all_in_one.rb](examples/all_in_one/all_in_one.rb) example that will:
217
-
218
- 1. Create hypertable with compression settings
219
- 2. Insert data
220
- 3. Run some queries
221
- 4. Check chunk size per model
222
- 5. Compress a chunk
223
- 6. Check chunk status
224
- 7. Decompress a chunk
225
-
226
- ### Toolkit
227
-
228
- Toolkit contains a lot of extra features to analyse data more deeply directly in
229
- the SQL. There are a few examples in the [examples/toolkit-demo](examples/toolkit-demo)
230
- folder that can let you benchmark and see the differences between implementing
231
- the algorithm directly in Ruby or directly in SQL using the [Timescaledb
232
- Toolkit](https://github.com/timescale/timescaledb-toolkit) extension.
233
-
234
- For now you can benchmark and compare:
235
-
236
- 1. [volatility](examples/toolkit-demo/compare_volatility.rb) algorithm.
237
- 2. [lttb](examples/toolkit-demo/lttb/lttb_sinatra.rb) algorithm.
238
-
239
- ### Testing
240
-
241
- If you need some inspiration for how are you going to test your hypertables,
242
- please check the [spec/spec_helper.rb](spec/spec_helper.rb) for inspiration.
243
-
244
- ### Migrations
245
-
246
- Create table is now with the `hypertable` keyword allowing to pass a few options
247
- to the function call while also using `create_table` method:
248
-
249
- #### create_table with `:hypertable`
250
-
251
- ```ruby
252
- hypertable_options = {
253
- time_column: 'created_at',
254
- chunk_time_interval: '1 min',
255
- compress_segmentby: 'identifier',
256
- compression_interval: '7 days'
257
- }
258
-
259
- create_table(:events, id: false, hypertable: hypertable_options) do |t|
260
- t.string :identifier, null: false
261
- t.jsonb :payload
262
- t.timestamps
263
- end
264
- ```
265
-
266
- #### create_continuous_aggregate
267
-
268
- This example shows a ticks table grouping ticks as OHLCV histograms for every
269
- minute.
270
-
271
- ```ruby
272
- hypertable_options = {
273
- time_column: 'created_at',
274
- chunk_time_interval: '1 min',
275
- compress_segmentby: 'symbol',
276
- compress_orderby: 'created_at',
277
- compression_interval: '7 days'
278
- }
279
- create_table :ticks, hypertable: hypertable_options, id: false do |t|
280
- t.string :symbol
281
- t.decimal :price
282
- t.integer :volume
283
- t.timestamps
284
- end
285
- Tick = Class.new(ActiveRecord::Base) do
286
- self.table_name = 'ticks'
287
- self.primary_key = 'symbol'
288
- acts_as_hypertable
289
- end
290
-
291
- query = Tick.select(<<~QUERY)
292
- time_bucket('1m', created_at) as time,
293
- symbol,
294
- FIRST(price, created_at) as open,
295
- MAX(price) as high,
296
- MIN(price) as low,
297
- LAST(price, created_at) as close,
298
- SUM(volume) as volume").group("1,2")
299
- QUERY
300
-
301
- options = {
302
- with_data: false,
303
- refresh_policies: {
304
- start_offset: "INTERVAL '1 month'",
305
- end_offset: "INTERVAL '1 minute'",
306
- schedule_interval: "INTERVAL '1 minute'"
307
- }
308
- }
309
-
310
- create_continuous_aggregate('ohlc_1m', query, **options)
311
- ```
312
-
313
- #### Scenic integration
314
-
315
- The [Scenic](https://github.com/scenic-views/scenic) gem is an easy way to
316
- manage database view definitions for a Rails application. TimescaleDB's
317
- continuous aggregates are more complex than regular PostgreSQL views, and
318
- the schema dumper included with Scenic can't dump a complete definition.
319
-
320
- This gem automatically configures Scenic to use a `Timescaledb::Scenic::Adapter`
321
- which will correctly handle schema dumping.
322
-
323
- ### Enable ActsAsHypertable
324
-
325
- You can declare a Rails model as a Hypertable by invoking the `acts_as_hypertable` macro. This macro extends your existing model with timescaledb-related functionality.
326
- model:
327
-
328
- ```ruby
329
- class Event < ActiveRecord::Base
330
- acts_as_hypertable
331
- end
332
- ```
333
-
334
- By default, ActsAsHypertable assumes a record's _time_column_ is called `created_at`.
335
-
336
- ### Options
337
-
338
- If you are using a different time_column name, you can specify it as follows when invoking the `acts_as_hypertable` macro:
339
-
340
- ```ruby
341
- class Event < ActiveRecord::Base
342
- acts_as_hypertable time_column: :timestamp
343
- end
344
- ```
345
-
346
- ### Chunks
347
-
348
- To get all the chunks from a model's hypertable, you can use `.chunks`.
349
-
350
- ```ruby
351
- Event.chunks # => [#<Timescaledb::Chunk>, ...]
352
- ```
353
-
354
- ### Hypertable metadata
355
-
356
- To get the models' hypertable metadata, you can use `.hypertable`.
357
-
358
- ```ruby
359
- Event.hypertable # => #<Timescaledb::Hypertable>
360
- ```
361
-
362
- To get hypertable metadata for all hypertables: `Timescaledb.hypertables`.
363
-
364
- ### Compression Settings
365
-
366
- Compression settings are accessible through the hypertable.
367
-
368
- ```ruby
369
- Event.hypertable.compression_settings # => [#<Timescaledb::CompressionSettings>, ...]
370
- ```
371
-
372
- To get compression settings for all hypertables: `Timescaledb.compression_settings`.
373
-
374
- ### Scopes
375
-
376
- The `acts_as_hypertable` macro can be very useful to generate some extra scopes
377
- for you. Example of a weather condition:
378
-
379
- ```ruby
380
- class Condition < ActiveRecord::Base
381
- acts_as_hypertable time_column: "time"
382
- end
383
- ```
384
-
385
- Through the [ActsAsHypertable](./lib/timescaledb/acts_as_hypertable) on the model,
386
- a few scopes are created based on the `time_column` argument:
387
-
388
- | Scope name | What they return |
389
- |------------------------|---------------------------------------|
390
- | `Model.previous_month` | Records created in the previous month |
391
- | `Model.previous_week` | Records created in the previous week |
392
- | `Model.this_month` | Records created this month |
393
- | `Model.this_week` | Records created this week |
394
- | `Model.yesterday` | Records created yesterday |
395
- | `Model.today` | Records created today |
396
- | `Model.last_hour` | Records created in the last hour |
397
-
398
- All time-related scopes respect your application's timezone.
399
-
400
- When you enable ActsAsTimeVector on your model, we include a couple default scopes. They are:
401
-
402
- ```ruby
403
- class Condition < ActiveRecord::Base
404
- acts_as_time_vector time_column: "time",
405
- value_column: "temperature",
406
- segment_by: "device_id"
407
- end
408
- ```
409
-
410
- ## RSpec Hooks
411
-
412
- In case you want to use TimescaleDB on a Rails environment, you may have some
413
- issues as the schema dump used for tests does not consider hypertables metadata.
414
-
415
- As a work around, you can dynamically create the hypertables yourself for
416
- testing environments using the following hook which you can
417
- define in `spec/rspec_helper.rb`:
418
-
419
- ```ruby
420
- config.before(:suite) do
421
- hypertable_models = ActiveRecord::Base.descendants.select(&:acts_as_hypertable?)
422
-
423
- hypertable_models.each do |klass|
424
- table_name = klass.table_name
425
- time_column = klass.hypertable_options[:time_column]
426
-
427
- if klass.try(:hypertable).present?
428
- ApplicationRecord.logger.info "hypertable already created for '#{table_name}', skipping."
429
- next
430
- end
431
-
432
- ApplicationRecord.connection.execute <<~SQL
433
- SELECT create_hypertable('#{table_name}', '#{time_column.to_s}')
434
- SQL
435
- end
436
- end
437
- ```
438
-
439
- ## Development
440
-
441
- After checking out the repo, run `bin/setup` to install the development dependencies. Then, `bundle exec rake test:setup` to setup the test database and tables. Finally, run `bundle exec rake` to run the tests.
442
-
443
- You can also run `tsdb` for an interactive prompt that will allow you to experiment.
444
-
445
- 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).
446
-
447
- You can create a `.env` file locally to run tests locally. Make sure to put your
448
- own credentials there!
449
-
450
- ```bash
451
- PG_URI_TEST="postgres://<user>@localhost:5432/<dbname>"
452
- ```
453
-
454
- You can put some postgres URI directly as a parameter of
455
- `tsdb`. Here is an example from the console:
456
-
457
- ```bash
458
- tsdb "postgres://<user>@localhost:5432/timescaledb_test"
459
- ```
460
-
461
- ## More resources
462
-
463
- This library was started on [twitch.tv/timescaledb](https://twitch.tv/timescaledb).
464
- You can watch all episodes here:
465
-
466
- 1. [Wrapping Functions to Ruby Helpers](https://www.youtube.com/watch?v=hGPsUxLFAYk).
467
- 2. [Extending ActiveRecord with Timescale Helpers](https://www.youtube.com/watch?v=IEyJIHk1Clk).
468
- 3. [Setup Hypertables for Rails testing environment](https://www.youtube.com/watch?v=wM6hVrZe7xA).
469
- 4. [Packing the code to this repository](https://www.youtube.com/watch?v=CMdGAl_XlL4).
470
- 4. [the code to this repository](https://www.youtube.com/watch?v=CMdGAl_XlL4).
471
- 5. [Working with Timescale continuous aggregates](https://youtu.be/co4HnBkHzVw).
472
- 6. [Creating the command-line application in Ruby to explore the Timescale API](https://www.youtube.com/watch?v=I3vM_q2m7T0).
473
-
474
- ### TODO
475
-
476
- Here is a list of functions that would be great to have:
477
-
478
- - [ ] Add data nodes support
479
-
480
- ## Contributing
481
-
482
- Bug reports and pull requests are welcome on GitHub at https://github.com/jonatas/timescaledb. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/jonatas/timescaledb/blob/master/CODE_OF_CONDUCT.md).
483
-
484
- ## License
485
-
486
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
487
-
488
- ## Code of Conduct
489
-
490
- Everyone interacting in the Timescale project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/jonatas/timescaledb/blob/master/CODE_OF_CONDUCT.md).
data/Rakefile DELETED
@@ -1,21 +0,0 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
3
-
4
- begin
5
- require "gemika/tasks"
6
- rescue LoadError
7
- puts "Run `gem install gemika` for additional tasks"
8
- end
9
-
10
- RSpec::Core::RakeTask.new(:spec)
11
-
12
- task default: "matrix:spec"
13
-
14
- namespace :test do
15
- task :setup do
16
- require_relative "spec/spec_helper"
17
-
18
- teardown_tables
19
- setup_tables
20
- end
21
- end