Bläddra i källkod

Added very basic Elasticsearch adapter

Andrew Kane 8 år sedan
förälder
incheckning
a2b06eaea4

+ 10 - 6
app/views/blazer/queries/show.html.erb

@@ -172,13 +172,17 @@
   </script>
 <% end %>
 
-<script>
-  // do not highlight really long queries
-  // this can lead to performance issues
-  if ($("code").text().length < 10000) {
-    hljs.initHighlightingOnLoad();
-  }
+<% if Blazer.data_sources[@query.data_source].adapter == "activerecord" %>
+  <script>
+    // do not highlight really long queries
+    // this can lead to performance issues
+    if ($("code").text().length < 10000) {
+      hljs.initHighlightingOnLoad();
+    }
+  </script>
+<% end %>
 
+<script>
   $(".form-inline input, .form-inline select").change( function () {
     submitIfCompleted($(this).closest("form"));
   });

+ 1 - 0
lib/blazer.rb

@@ -8,6 +8,7 @@ require "blazer/result"
 require "blazer/run_statement"
 require "blazer/adapters/base_adapter"
 require "blazer/adapters/active_record_adapter"
+require "blazer/adapters/elasticsearch_adapter"
 require "blazer/engine"
 
 module Blazer

+ 8 - 10
lib/blazer/adapters/active_record_adapter.rb

@@ -62,7 +62,7 @@ module Blazer
         nil
       end
 
-      private
+      protected
 
       def postgresql?
         ["PostgreSQL", "PostGIS"].include?(adapter_name)
@@ -100,19 +100,17 @@ module Blazer
       end
 
       def in_transaction
-        if use_transaction?
-          connection_model.transaction do
+        connection_model.connection_pool.with_connection do
+          if use_transaction?
+            connection_model.transaction do
+              yield
+              raise ActiveRecord::Rollback
+            end
+          else
             yield
-            raise ActiveRecord::Rollback
           end
-        else
-          yield
         end
       end
-
-      def settings
-        @data_source.settings
-      end
     end
   end
 end

+ 6 - 0
lib/blazer/adapters/base_adapter.rb

@@ -26,6 +26,12 @@ module Blazer
       def explain(statement)
         # optional
       end
+
+      protected
+
+      def settings
+        @data_source.settings
+      end
     end
   end
 end

+ 31 - 0
lib/blazer/adapters/elasticsearch_adapter.rb

@@ -0,0 +1,31 @@
+module Blazer
+  module Adapters
+    class ElasticsearchAdapter < BaseAdapter
+      def run_statement(statement, comment)
+        columns = []
+        rows = []
+        error = nil
+
+        begin
+          response = client.search(body: JSON.parse(statement))
+          columns = ["response"]
+          rows = [[response]]
+        rescue => e
+          error = e.message
+        end
+
+        [columns, rows, error]
+      end
+
+      def tables
+        client.indices.get_aliases.map { |k, v| [k, v["aliases"].keys] }.flatten.uniq
+      end
+
+      protected
+
+      def client
+        @client ||= Elasticsearch::Client.new(url: settings["url"])
+      end
+    end
+  end
+end

+ 16 - 4
lib/blazer/data_source.rb

@@ -4,9 +4,9 @@ module Blazer
   class DataSource
     extend Forwardable
 
-    attr_reader :id, :settings, :adapter
+    attr_reader :id, :settings, :adapter, :adapter_instance
 
-    def_delegators :adapter, :schema, :tables, :reconnect, :cost, :explain
+    def_delegators :adapter_instance, :schema, :tables, :reconnect, :cost, :explain
 
     def initialize(id, settings)
       @id = id
@@ -16,7 +16,19 @@ module Blazer
         raise Blazer::Error, "Empty url"
       end
 
-      @adapter = Blazer::Adapters::ActiveRecordAdapter.new(self)
+      @adapter_instance =
+        case adapter
+        when "activerecord"
+          Blazer::Adapters::ActiveRecordAdapter.new(self)
+        when "elasticsearch"
+          Blazer::Adapters::ElasticsearchAdapter.new(self)
+        else
+          raise Blazer::Error, "Unknown adapter"
+        end
+    end
+
+    def adapter
+      settings["adapter"] || "activerecord"
     end
 
     def name
@@ -139,7 +151,7 @@ module Blazer
 
     def run_statement_helper(statement, comment, run_id)
       start_time = Time.now
-      columns, rows, error = @adapter.run_statement(statement, comment)
+      columns, rows, error = @adapter_instance.run_statement(statement, comment)
       duration = Time.now - start_time
 
       cache_data = nil

+ 1 - 3
lib/blazer/run_statement_job.rb

@@ -8,9 +8,7 @@ module Blazer
     def perform(result, data_source, statement, options)
       begin
         ActiveRecord::Base.connection_pool.with_connection do
-          data_source.adapter.connection_model.connection_pool.with_connection do
-            result << RunStatement.new.perform(data_source, statement, options)
-          end
+          result << RunStatement.new.perform(data_source, statement, options)
         end
       rescue Exception => e
         result.clear