瀏覽代碼

Lazy load adapter instance

Andrew 6 年之前
父節點
當前提交
de03cbaf15
共有 1 個文件被更改,包括 17 次插入14 次删除
  1. 17 14
      lib/blazer/data_source.rb

+ 17 - 14
lib/blazer/data_source.rb

@@ -4,24 +4,13 @@ module Blazer
   class DataSource
   class DataSource
     extend Forwardable
     extend Forwardable
 
 
-    attr_reader :id, :settings, :adapter, :adapter_instance
+    attr_reader :id, :settings
 
 
     def_delegators :adapter_instance, :schema, :tables, :preview_statement, :reconnect, :cost, :explain, :cancel
     def_delegators :adapter_instance, :schema, :tables, :preview_statement, :reconnect, :cost, :explain, :cancel
 
 
     def initialize(id, settings)
     def initialize(id, settings)
       @id = id
       @id = id
       @settings = settings
       @settings = settings
-
-      unless settings["url"] || Rails.env.development? || ["bigquery", "athena"].include?(settings["adapter"])
-        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
     end
 
 
     def adapter
     def adapter
@@ -154,9 +143,23 @@ module Blazer
 
 
     protected
     protected
 
 
+    def adapter_instance
+      @adapter_instance ||= begin
+        unless settings["url"] || Rails.env.development? || ["bigquery", "athena"].include?(settings["adapter"])
+          raise Blazer::Error, "Empty url for data source: #{id}"
+        end
+
+        unless Blazer.adapters[adapter]
+          raise Blazer::Error, "Unknown adapter"
+        end
+
+        Blazer.adapters[adapter].new(self)
+      end
+    end
+
     def run_statement_helper(statement, comment, run_id)
     def run_statement_helper(statement, comment, run_id)
       start_time = Time.now
       start_time = Time.now
-      columns, rows, error = @adapter_instance.run_statement(statement, comment)
+      columns, rows, error = adapter_instance.run_statement(statement, comment)
       duration = Time.now - start_time
       duration = Time.now - start_time
 
 
       cache_data = nil
       cache_data = nil
@@ -165,7 +168,7 @@ module Blazer
         cache_data = Marshal.dump([columns, rows, error, cache ? Time.now : nil]) rescue nil
         cache_data = Marshal.dump([columns, rows, error, cache ? Time.now : nil]) rescue nil
       end
       end
 
 
-      if cache && cache_data && @adapter_instance.cachable?(statement)
+      if cache && cache_data && adapter_instance.cachable?(statement)
         Blazer.cache.write(statement_cache_key(statement), cache_data, expires_in: cache_expires_in.to_f * 60)
         Blazer.cache.write(statement_cache_key(statement), cache_data, expires_in: cache_expires_in.to_f * 60)
       end
       end