class Influxer::Relation

Relation is used to build queries

Constants

MULTI_KEY_METHODS
MULTI_VALUE_METHODS
MULTI_VALUE_SIMPLE_METHODS
SINGLE_VALUE_METHODS
SINGLE_VALUE_SIMPLE_METHODS
SUPPORTED_EPOCH_FORMAT

Attributes

values[R]

Public Class Methods

new(klass, params = {}) click to toggle source

Initialize new Relation for 'klass' (Class) metrics.

Available params:

:attributes - hash of attributes to be included to new Metrics object
and where clause of Relation
# File lib/influxer/metrics/relation.rb, line 83
def initialize(klass, params = {})
  @klass = klass
  @instance = klass.new params[:attributes]
  reset
  where(params[:attributes]) if params[:attributes].present?
end

Public Instance Methods

as_json(options = nil) click to toggle source
# File lib/influxer/metrics/relation.rb, line 199
def as_json(options = nil)
  to_a.as_json(options)
end
build(params = {}) click to toggle source
# File lib/influxer/metrics/relation.rb, line 98
def build(params = {})
  point = @instance.dup
  params.each do |key, val|
    point.send("#{key}=", val) if point.respond_to?(key)
  end
  point
end
Also aliased as: new
delete_all() click to toggle source
# File lib/influxer/metrics/relation.rb, line 215
def delete_all
  sql = if where_contains_time?
    ["delete"]
  else
    ["drop series"]
  end

  sql << "from #{@instance.series(write: true)}"

  sql << "where #{where_values.join(" and ")}" unless where_values.empty?

  sql = sql.join " "

  @instance.client.query sql
end
empty?() click to toggle source
# File lib/influxer/metrics/relation.rb, line 190
def empty?
  unless loaded?
    # we don't need selects here
    select_values.clear
    limit(1).load
  end
  @records.empty?
end
epoch(val) click to toggle source
# File lib/influxer/metrics/relation.rb, line 117
def epoch(val)
  return self unless SUPPORTED_EPOCH_FORMAT.include? val

  @values[:epoch] = val
  self
end
inspect() click to toggle source
# File lib/influxer/metrics/relation.rb, line 183
def inspect
  entries = to_a.take(11).map!(&:inspect)
  entries[10] = "..." if entries.size == 11

  "#<#{self.class.name} [#{entries.join(", ")}]>"
end
load() click to toggle source
# File lib/influxer/metrics/relation.rb, line 203
def load
  @records = get_points(
    @instance.client.query(
      to_sql,
      denormalize: !normalized?,
      epoch: @values[:epoch]
    )
  )
  @loaded = true
  @records
end
merge!(rel) click to toggle source

rubocop:disable Metrics/AbcSize rubocop:disable Metrics/MethodLength

# File lib/influxer/metrics/relation.rb, line 241
def merge!(rel)
  return self if rel.nil?

  MULTI_VALUE_METHODS.each do |method|
    (@values[method] ||= []).concat(rel.values[method]).uniq! unless rel.values[method].nil?
  end

  MULTI_KEY_METHODS.each do |method|
    (@values[method] ||= {}).merge!(rel.values[method]) unless rel.values[method].nil?
  end

  SINGLE_VALUE_METHODS.each do |method|
    @values[method] = rel.values[method] unless rel.values[method].nil?
  end

  self
end
new(params = {})
Alias for: build
normalized() click to toggle source
# File lib/influxer/metrics/relation.rb, line 108
def normalized
  @values[:normalized] = true
  self
end
normalized?() click to toggle source
# File lib/influxer/metrics/relation.rb, line 113
def normalized?
  @values[:normalized] == true
end
order(val) click to toggle source
# File lib/influxer/metrics/relation.rb, line 131
def order(val)
  case val
  when Hash
    val.each { |k, v| order_values << "#{k} #{v}" }
  when String
    order_values << val
  end
  self
end
scoping() { || ... } click to toggle source
# File lib/influxer/metrics/relation.rb, line 231
def scoping
  previous = @klass.current_scope
  @klass.current_scope = self
  yield
ensure
  @klass.current_scope = previous
end
timezone(val) click to toggle source
# File lib/influxer/metrics/relation.rb, line 124
def timezone(val)
  return self if val.blank?

  @values[:timezone] = val
  self
end
to_a() click to toggle source

rubocop:enable Metrics/AbcSize rubocop:enable Metrics/CyclomaticComplexity rubocop:enable Metrics/MethodLength rubocop:enable Metrics/PerceivedComplexity

# File lib/influxer/metrics/relation.rb, line 177
def to_a
  return @records if loaded?

  load
end
to_sql() click to toggle source

rubocop:disable Metrics/AbcSize rubocop:disable Metrics/CyclomaticComplexity rubocop:disable Metrics/MethodLength rubocop:disable Metrics/PerceivedComplexity

# File lib/influxer/metrics/relation.rb, line 145
def to_sql
  sql = ["select"]
  select_values << "*" if select_values.empty?

  sql << select_values.uniq.join(", ")

  sql << "from #{build_series_name}"

  sql << "where #{where_values.join(" and ")}" unless where_values.empty?

  unless group_values.empty? && time_value.nil?
    group_fields = (time_value.nil? ? [] : ["time(" + @values[:time] + ")"]) + group_values
    group_fields.uniq!
    sql << "group by #{group_fields.join(", ")}"
  end

  sql << "fill(#{fill_value})" unless fill_value.nil?

  sql << "order by #{order_values.uniq.join(",")}" unless order_values.empty?

  sql << "limit #{limit_value}" unless limit_value.nil?
  sql << "offset #{offset_value}" unless offset_value.nil?
  sql << "slimit #{slimit_value}" unless slimit_value.nil?
  sql << "soffset #{soffset_value}" unless soffset_value.nil?
  sql << "TZ('#{timezone_value}')" unless timezone_value.blank?
  sql.join " "
end
write(params = {}) click to toggle source
# File lib/influxer/metrics/relation.rb, line 90
def write(params = {})
  build(params).write
end
write!(params = {}) click to toggle source
# File lib/influxer/metrics/relation.rb, line 94
def write!(params = {})
  build(params).write!
end

Protected Instance Methods

build_series_name() click to toggle source

rubocop:enable Metrics/AbcSize rubocop:enable Metrics/MethodLength

# File lib/influxer/metrics/relation.rb, line 263
def build_series_name
  from_value.present? ? @klass.quoted_series(from_value) : @instance.series
end
get_points(list) click to toggle source
# File lib/influxer/metrics/relation.rb, line 294
def get_points(list)
  return list if normalized?

  list.reduce([]) do |a, e|
    a + e.fetch("values", []).map { |v| inject_tags(v, e["tags"] || {}) }
  end
end
inject_tags(val, tags) click to toggle source
# File lib/influxer/metrics/relation.rb, line 302
def inject_tags(val, tags)
  val.merge(tags)
end
loaded?() click to toggle source
# File lib/influxer/metrics/relation.rb, line 267
def loaded?
  @loaded
end
method_missing(method, *args, &block) click to toggle source
Calls superclass method
# File lib/influxer/metrics/relation.rb, line 306
def method_missing(method, *args, &block)
  return super unless @klass.respond_to?(method)

  merge!(scoping { @klass.public_send(method, *args, &block) })
end
quoted(val, key = nil) click to toggle source
# File lib/influxer/metrics/relation.rb, line 284
def quoted(val, key = nil)
  if val.is_a?(String) || val.is_a?(Symbol) || @klass.tag?(key)
    "'#{val}'"
  elsif key.to_s == "time"
    quote_timestamp val, @instance.client
  else
    val.to_s
  end
end
reload() click to toggle source
# File lib/influxer/metrics/relation.rb, line 278
def reload
  reset
  load
  self
end
reset() click to toggle source
# File lib/influxer/metrics/relation.rb, line 271
def reset
  @values = {}
  @records = []
  @loaded = false
  self
end
respond_to_missing?(method, *args) click to toggle source
Calls superclass method
# File lib/influxer/metrics/relation.rb, line 312
def respond_to_missing?(method, *args)
  return true if @klass.respond_to?(method)

  super
end