diff --git a/lib/timeseries/hoarder.rb b/lib/timeseries/hoarder.rb index 39236de..e6944ef 100644 --- a/lib/timeseries/hoarder.rb +++ b/lib/timeseries/hoarder.rb @@ -2,6 +2,8 @@ require_relative "hoarder/version" +require_relative 'hoarder/TimeseriesDatabase.rb' + module Timeseries module Hoarder class Error < StandardError; end diff --git a/lib/timeseries/hoarder/TimeseriesDatabase.rb b/lib/timeseries/hoarder/TimeseriesDatabase.rb index 076400a..64f3067 100644 --- a/lib/timeseries/hoarder/TimeseriesDatabase.rb +++ b/lib/timeseries/hoarder/TimeseriesDatabase.rb @@ -2,6 +2,7 @@ require 'pg' require_relative 'CachingTable.rb' +require_relative 'TimeseriesTable.rb' module Timeseries module Hoarder @@ -18,6 +19,14 @@ module Timeseries @pg.exec("CREATE SCHEMA IF NOT EXISTS ts_hoarder") @data_sources = CachingTable.new(self, 'sources', 'source') + + @series = {} + end + + def add_timeseries(name, **opts) + return @series[name] if @series.include? name + + new_series = SeriesTable.new(self, name, **opts) end end end diff --git a/lib/timeseries/hoarder/TimeseriesTable.rb b/lib/timeseries/hoarder/TimeseriesTable.rb new file mode 100644 index 0000000..6e9eebd --- /dev/null +++ b/lib/timeseries/hoarder/TimeseriesTable.rb @@ -0,0 +1,36 @@ + +require_relative 'Table.rb' +require_relative 'CachingTable.rb' + +module Timeseries + module Hoarder + class SeriesTable < Table + def initialize(db, name, **opts) + @chunk_time = opts[:chunk_time] || '3h' + @compress_chunk_time = opts[:compress_chunk_time] || '24h' + + @name = name + @tags = CachingTable.new(db, name + '_tags') + + super(db, name, 'ts_hoarder') + end + + def table_creation + @pg.exec("CREATE TABLE #{@table_id} ( time TIMESTAMPTZ NOT NULL, source_id INTEGER NOT NULL, tags_id INTEGER NOT NULL, value DOUBLE PRECISION NOT NULL)") + + @pg.exec_params("SELECT create_hypertable('#{@table_schema}.#{@table_name}', 'time', chunk_time_interval => $1::interval)", [@chunk_time]) + @pg.exec_params("ALTER TABLE #{@table_id} SET (timescaledb.compress, timescaledb.compress_segmentby = 'source_id, tags_id', timescaledb.compress_chunk_time_interval='#{@compress_chunk_time}')") + + view_sql = <