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
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
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