Sha256: a3baa84e64a6bfb47c1d2a4d00981624943c7d8d93f36d7e48f358d8a5fac526

Contents?: true

Size: 1.82 KB

Versions: 2

Compression:

Stored size: 1.82 KB

Contents

require 'bundler/setup'
require 'timescaledb'


# Compare volatility processing in Ruby vs SQL.
class Measurement < ActiveRecord::Base
  acts_as_hypertable time_column: "ts"
  acts_as_time_vector segment_by: "device_id", value_column: "val"

  scope :volatility_sql, -> do
    select("device_id, timevector(#{time_column}, #{value_column}) -> sort() -> delta() -> abs() -> sum() as volatility")
     .group("device_id")
  end

  scope :volatility_ruby, -> {
    volatility = Hash.new(0)
    previous = Hash.new
    find_all do |measurement|
      device_id = measurement.device_id
      if previous[device_id]
        delta = (measurement.val - previous[device_id]).abs
        volatility[device_id] += delta
      end
      previous[device_id] = measurement.val
    end
    volatility
  }
end

ActiveRecord::Base.establish_connection ENV["PG_URI"]
ActiveRecord::Base.connection.add_toolkit_to_search_path!


ActiveRecord::Base.connection.instance_exec do
  ActiveRecord::Base.logger = Logger.new(STDOUT)

  unless Measurement.table_exists?
    hypertable_options = {
      time_column: 'ts',
      chunk_time_interval: '1 day',
    }
    create_table :measurements, hypertable: hypertable_options, id: false do |t|
      t.integer :device_id
      t.decimal :val
      t.timestamp :ts
    end
  end
end

if Measurement.count.zero?
  ActiveRecord::Base.connection.execute(<<~SQL)
      INSERT INTO measurements (ts, device_id, val)
        SELECT ts, device_id, random()*80
      FROM generate_series(TIMESTAMP '2022-01-01 00:00:00',
                            TIMESTAMP '2022-02-01 00:00:00',
                            INTERVAL '5 minutes') AS g1(ts),
        generate_series(0, 5) AS g2(device_id);
     SQL
end

Benchmark.bm do |x|
  x.report("ruby")  { Measurement.volatility_ruby }
  x.report("sql") { Measurement.volatility_sql.map(&:attributes)  }
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
timescaledb-0.2.3 examples/toolkit-demo/compare_volatility.rb
timescaledb-0.2.2 examples/toolkit-demo/compare_volatility.rb