Class: Blazer::DataSource

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/blazer/data_source.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(id, settings) ⇒ DataSource

Returns a new instance of DataSource.



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/blazer/data_source.rb', line 11

def initialize(id, settings)
  @id = id
  @settings = settings

  unless settings["url"] || Rails.env.development? || settings["adapter"] == "bigquery"
    raise Blazer::Error, "Empty url for data source: #{id}"
  end

  @adapter_instance =
    if Blazer.adapters[adapter]
      Blazer.adapters[adapter].new(self)
    else
      raise Blazer::Error, "Unknown adapter"
    end
end

Instance Attribute Details

#adapterObject (readonly)

Returns the value of attribute adapter.



7
8
9
# File 'lib/blazer/data_source.rb', line 7

def adapter
  @adapter
end

#adapter_instanceObject (readonly)

Returns the value of attribute adapter_instance.



7
8
9
# File 'lib/blazer/data_source.rb', line 7

def adapter_instance
  @adapter_instance
end

#idObject (readonly)

Returns the value of attribute id.



7
8
9
# File 'lib/blazer/data_source.rb', line 7

def id
  @id
end

#settingsObject (readonly)

Returns the value of attribute settings.



7
8
9
# File 'lib/blazer/data_source.rb', line 7

def settings
  @settings
end

Instance Method Details

#cacheObject



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/blazer/data_source.rb', line 55

def cache
  @cache ||= begin
    if settings["cache"].is_a?(Hash)
      settings["cache"]
    elsif settings["cache"]
      {
        "mode" => "all",
        "expires_in" => settings["cache"]
      }
    else
      {
        "mode" => "off"
      }
    end
  end
end

#cache_expires_inObject



76
77
78
# File 'lib/blazer/data_source.rb', line 76

def cache_expires_in
  (cache["expires_in"] || 60).to_f
end

#cache_key(key) ⇒ Object



143
144
145
# File 'lib/blazer/data_source.rb', line 143

def cache_key(key)
  (["blazer", "v4"] + key).join("/")
end

#cache_modeObject



72
73
74
# File 'lib/blazer/data_source.rb', line 72

def cache_mode
  cache["mode"]
end

#cache_slow_thresholdObject



80
81
82
# File 'lib/blazer/data_source.rb', line 80

def cache_slow_threshold
  (cache["slow_threshold"] || 15).to_f
end

#clear_cache(statement) ⇒ Object



139
140
141
# File 'lib/blazer/data_source.rb', line 139

def clear_cache(statement)
  Blazer.cache.delete(statement_cache_key(statement))
end

#delete_results(run_id) ⇒ Object



99
100
101
# File 'lib/blazer/data_source.rb', line 99

def delete_results(run_id)
  Blazer.cache.delete(run_cache_key(run_id))
end

#linked_columnsObject



35
36
37
# File 'lib/blazer/data_source.rb', line 35

def linked_columns
  settings["linked_columns"] || {}
end

#local_time_suffixObject



84
85
86
# File 'lib/blazer/data_source.rb', line 84

def local_time_suffix
  @local_time_suffix ||= Array(settings["local_time_suffix"])
end

#nameObject



31
32
33
# File 'lib/blazer/data_source.rb', line 31

def name
  settings["name"] || @id
end

#read_cache(cache_key) ⇒ Object



88
89
90
91
92
93
# File 'lib/blazer/data_source.rb', line 88

def read_cache(cache_key)
  value = Blazer.cache.read(cache_key)
  if value
    Blazer::Result.new(self, *Marshal.load(value), nil)
  end
end

#run_cache_key(run_id) ⇒ Object



151
152
153
# File 'lib/blazer/data_source.rb', line 151

def run_cache_key(run_id)
  cache_key(["run", run_id])
end

#run_results(run_id) ⇒ Object



95
96
97
# File 'lib/blazer/data_source.rb', line 95

def run_results(run_id)
  read_cache(run_cache_key(run_id))
end

#run_statement(statement, options = {}) ⇒ Object



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# File 'lib/blazer/data_source.rb', line 103

def run_statement(statement, options = {})
  run_id = options[:run_id]
  async = options[:async]
  result = nil
  if cache_mode != "off"
    if options[:refresh_cache]
      clear_cache(statement) # for checks
    else
      result = read_cache(statement_cache_key(statement))
    end
  end

  unless result
    comment = "blazer"
    if options[:user].respond_to?(:id)
      comment << ",user_id:#{options[:user].id}"
    end
    if options[:user].respond_to?(Blazer.user_name)
      # only include letters, numbers, and spaces to prevent injection
      comment << ",user_name:#{options[:user].send(Blazer.user_name).to_s.gsub(/[^a-zA-Z0-9 ]/, "")}"
    end
    if options[:query].respond_to?(:id)
      comment << ",query_id:#{options[:query].id}"
    end
    if options[:check]
      comment << ",check_id:#{options[:check].id},check_emails:#{options[:check].emails}"
    end
    if options[:run_id]
      comment << ",run_id:#{options[:run_id]}"
    end
    result = run_statement_helper(statement, comment, async ? options[:run_id] : nil)
  end

  result
end

#smart_columnsObject



39
40
41
# File 'lib/blazer/data_source.rb', line 39

def smart_columns
  settings["smart_columns"] || {}
end

#smart_variablesObject



43
44
45
# File 'lib/blazer/data_source.rb', line 43

def smart_variables
  settings["smart_variables"] || {}
end

#statement_cache_key(statement) ⇒ Object



147
148
149
# File 'lib/blazer/data_source.rb', line 147

def statement_cache_key(statement)
  cache_key(["statement", id, Digest::MD5.hexdigest(statement.to_s.gsub("\r\n", "\n"))])
end

#timeoutObject



51
52
53
# File 'lib/blazer/data_source.rb', line 51

def timeout
  settings["timeout"]
end

#variable_defaultsObject



47
48
49
# File 'lib/blazer/data_source.rb', line 47

def variable_defaults
  settings["variable_defaults"] || {}
end