Skip to content

Commit 758fdee

Browse files
committed
Allow timescale to be a non-primary rails db
1 parent f2add16 commit 758fdee

File tree

13 files changed

+53
-28
lines changed

13 files changed

+53
-28
lines changed

lib/timescaledb/rails/extensions/active_record/schema_dumper.rb

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
require 'active_record/connection_adapters/postgresql_adapter'
44
require 'timescaledb/rails/orderby_compression'
5+
require 'tsort'
56

67
module Timescaledb
78
module Rails
@@ -19,14 +20,20 @@ def tables(stream)
1920
def continuous_aggregates(stream)
2021
return unless timescale_enabled?
2122

22-
Timescaledb::Rails::ContinuousAggregate.all.each do |continuous_aggregate|
23-
continuous_aggregate(continuous_aggregate, stream)
24-
continuous_aggregate_policy(continuous_aggregate, stream)
23+
deps = Timescaledb::Rails::ContinuousAggregate.find_each.index_by(&:materialization_hypertable_name)
24+
25+
TSort.tsort(
26+
->(&b) { deps.each_value(&b) },
27+
->(n, &b) { Array.wrap(deps[n.hypertable_name]).each(&b) }
28+
).each do |ca|
29+
continuous_aggregate(ca, stream)
30+
continuous_aggregate_policy(ca, stream)
2531
end
2632
end
2733

28-
def continuous_aggregate(continuous_aggregate, stream)
29-
stream.puts " create_continuous_aggregate #{continuous_aggregate.view_name.inspect}, <<-SQL"
34+
def continuous_aggregate(continuous_aggregate, stream, force: false)
35+
stream.puts " create_continuous_aggregate #{continuous_aggregate.view_name.inspect}, <<-SQL, " \
36+
"force: #{force.inspect}"
3037
stream.puts " #{continuous_aggregate.view_definition.strip.indent(2)}"
3138
stream.puts ' SQL'
3239
stream.puts
@@ -149,7 +156,8 @@ def format_hypertable_option_value(value)
149156
end
150157

151158
def timescale_enabled?
152-
Timescaledb::Rails::Hypertable.table_exists?
159+
@connection.pool.db_config.name == Timescaledb::Rails::Hypertable.connection.pool.db_config.name &&
160+
Timescaledb::Rails::Hypertable.table_exists?
153161
end
154162
end
155163
end

lib/timescaledb/rails/extensions/active_record/schema_statements.rb

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,15 @@ def remove_hypertable_reorder_policy(table_name, _index_name = nil)
116116
# 'temperature_events', "SELECT * FROM events where event_type = 'temperature'"
117117
# )
118118
#
119-
def create_continuous_aggregate(view_name, view_query)
120-
execute "CREATE MATERIALIZED VIEW #{view_name} WITH (timescaledb.continuous) AS #{view_query};"
119+
def create_continuous_aggregate(view_name, view_query, force: false)
120+
if force
121+
execute "DROP MATERIALIZED VIEW #{quote_table_name(view_name)} CASCADE;" if view_exists? view_name
122+
else
123+
schema_cache.clear_data_source_cache!(view_name.to_s)
124+
end
125+
126+
execute "CREATE MATERIALIZED VIEW #{quote_table_name(view_name)} " \
127+
"WITH (timescaledb.continuous) AS #{view_query};"
121128
end
122129

123130
# Drops a continuous aggregate

lib/timescaledb/rails/model/hyperfunctions.rb

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,18 @@ module Hyperfunctions
1010
TIME_BUCKET_ALIAS = 'time_bucket'
1111

1212
# @return [ActiveRecord::Relation<ActiveRecord::Base>]
13-
def time_bucket(interval, target_column = nil)
14-
target_column ||= hypertable_time_column_name
13+
def time_bucket(interval, target_column = nil, select_alias: TIME_BUCKET_ALIAS)
14+
target_column &&= Arel.sql(target_column.to_s)
15+
target_column ||= arel_table[hypertable_time_column_name]
1516

16-
select("time_bucket('#{format_interval_value(interval)}', #{target_column}) as #{TIME_BUCKET_ALIAS}")
17-
.group(TIME_BUCKET_ALIAS)
18-
.order(TIME_BUCKET_ALIAS)
17+
time_bucket = Arel::Nodes::NamedFunction.new(
18+
'time_bucket',
19+
[Arel::Nodes.build_quoted(format_interval_value(interval)), target_column]
20+
)
21+
22+
select(time_bucket.dup.as(select_alias))
23+
.group(time_bucket)
24+
.order(time_bucket)
1925
.extending(AggregateFunctions)
2026
end
2127

lib/timescaledb/rails/models/chunk.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
module Timescaledb
44
module Rails
55
# :nodoc:
6-
class Chunk < ::ActiveRecord::Base
6+
class Chunk < Railtie.config.record_base.constantize
77
self.table_name = 'timescaledb_information.chunks'
88
self.primary_key = 'hypertable_name'
99

@@ -17,13 +17,13 @@ def chunk_full_name
1717
end
1818

1919
def compress!
20-
::ActiveRecord::Base.connection.execute(
20+
self.class.connection.execute(
2121
"SELECT compress_chunk('#{chunk_full_name}')"
2222
)
2323
end
2424

2525
def decompress!
26-
::ActiveRecord::Base.connection.execute(
26+
self.class.connection.execute(
2727
"SELECT decompress_chunk('#{chunk_full_name}')"
2828
)
2929
end
@@ -40,7 +40,7 @@ def reorder!(index = nil)
4040
options = ["'#{chunk_full_name}'"]
4141
options << "'#{index}'" if index.present?
4242

43-
::ActiveRecord::Base.connection.execute(
43+
self.class.connection.execute(
4444
"SELECT reorder_chunk(#{options.join(', ')})"
4545
)
4646
end

lib/timescaledb/rails/models/compression_setting.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
module Timescaledb
44
module Rails
55
# :nodoc:
6-
class CompressionSetting < ::ActiveRecord::Base
6+
class CompressionSetting < Railtie.config.record_base.constantize
77
self.table_name = 'timescaledb_information.compression_settings'
88
self.primary_key = 'hypertable_name'
99

lib/timescaledb/rails/models/concerns/durationable.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ module Durationable
1111

1212
# @return [String]
1313
def parse_duration(duration)
14+
return if duration.nil?
15+
1416
duration_in_seconds = duration_in_seconds(duration)
1517

1618
duration_to_interval(

lib/timescaledb/rails/models/continuous_aggregate.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
module Timescaledb
66
module Rails
77
# :nodoc:
8-
class ContinuousAggregate < ::ActiveRecord::Base
8+
class ContinuousAggregate < Railtie.config.record_base.constantize
99
include Timescaledb::Rails::Models::Durationable
1010

1111
self.table_name = 'timescaledb_information.continuous_aggregates'
@@ -19,7 +19,7 @@ class ContinuousAggregate < ::ActiveRecord::Base
1919
# @param [DateTime] end_time
2020
#
2121
def refresh!(start_time = 'NULL', end_time = 'NULL')
22-
::ActiveRecord::Base.connection.execute(
22+
self.class.connection.execute(
2323
"CALL refresh_continuous_aggregate('#{view_name}', #{start_time}, #{end_time});"
2424
)
2525
end

lib/timescaledb/rails/models/dimension.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
module Timescaledb
44
module Rails
55
# :nodoc:
6-
class Dimension < ::ActiveRecord::Base
6+
class Dimension < Railtie.config.record_base.constantize
77
TIME_TYPE = 'Time'
88

99
self.table_name = 'timescaledb_information.dimensions'

lib/timescaledb/rails/models/hypertable.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
module Timescaledb
66
module Rails
77
# :nodoc:
8-
class Hypertable < ::ActiveRecord::Base
8+
class Hypertable < Railtie.config.record_base.constantize
99
include Timescaledb::Rails::Models::Durationable
1010

1111
self.table_name = 'timescaledb_information.hypertables'

lib/timescaledb/rails/models/job.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
module Timescaledb
44
module Rails
55
# :nodoc:
6-
class Job < ::ActiveRecord::Base
6+
class Job < Railtie.config.record_base.constantize
77
self.table_name = 'timescaledb_information.jobs'
88
self.primary_key = 'hypertable_name'
99

0 commit comments

Comments
 (0)