Browse Source

Added Presto adapter

Andrew Kane 7 years ago
parent
commit
fda1e86c72
4 changed files with 65 additions and 4 deletions
  1. 11 0
      README.md
  2. 1 0
      lib/blazer.rb
  3. 45 0
      lib/blazer/adapters/presto_adapter.rb
  4. 8 4
      lib/blazer/data_source.rb

+ 11 - 0
README.md

@@ -367,6 +367,7 @@ data_sources:
 - [Redshift](#redshift)
 - [MongoDB](#mongodb) [beta]
 - [Elasticsearch](#elasticsearch) [beta]
+- [Presto](#presto) [beta] [master]
 
 You can also create an adapter for any other data store.
 
@@ -409,6 +410,16 @@ data_sources:
     url: http://user:password@hostname:9200/
 ```
 
+### Presto
+
+Add [presto-client](https://github.com/treasure-data/presto-client-ruby) to your Gemfile and set:
+
+```yml
+data_sources:
+  my_source:
+    url: presto://user@hostname:8080/catalog?schema=schema
+```
+
 ## Learn SQL
 
 Have team members who want to learn SQL? Here are a few great, free resources.

+ 1 - 0
lib/blazer.rb

@@ -9,6 +9,7 @@ require "blazer/run_statement"
 require "blazer/adapters/base_adapter"
 require "blazer/adapters/elasticsearch_adapter"
 require "blazer/adapters/mongodb_adapter"
+require "blazer/adapters/presto_adapter"
 require "blazer/adapters/sql_adapter"
 require "blazer/engine"
 

+ 45 - 0
lib/blazer/adapters/presto_adapter.rb

@@ -0,0 +1,45 @@
+module Blazer
+  module Adapters
+    class PrestoAdapter < BaseAdapter
+      def run_statement(statement, comment)
+        columns = []
+        rows = []
+        error = nil
+
+        begin
+          columns, rows = client.run("#{statement} /*#{comment}*/")
+          columns = columns.map(&:name)
+        rescue => e
+          error = e.message
+        end
+
+        [columns, rows, error]
+      end
+
+      def tables
+        _, rows = client.run("SHOW TABLES")
+        rows.map(&:first)
+      end
+
+      def preview_statement
+        "SELECT * FROM {table} LIMIT 10"
+      end
+
+      protected
+
+      def client
+        @client ||= begin
+          uri = URI.parse(settings["url"])
+          query = uri.query ? CGI::parse(uri.query) : {}
+          Presto::Client.new(
+            server: "#{uri.host}:#{uri.port}",
+            catalog: uri.path.to_s.sub(/\A\//, ""),
+            schema: query["schema"],
+            user: uri.user,
+            http_debug: false
+          )
+        end
+      end
+    end
+  end
+end

+ 8 - 4
lib/blazer/data_source.rb

@@ -18,12 +18,14 @@ module Blazer
 
       @adapter_instance =
         case adapter
-        when "sql"
-          Blazer::Adapters::SqlAdapter.new(self)
         when "elasticsearch"
           Blazer::Adapters::ElasticsearchAdapter.new(self)
         when "mongodb"
           Blazer::Adapters::MongodbAdapter.new(self)
+        when "presto"
+          Blazer::Adapters::PrestoAdapter.new(self)
+        when "sql"
+          Blazer::Adapters::SqlAdapter.new(self)
         else
           raise Blazer::Error, "Unknown adapter"
         end
@@ -178,8 +180,10 @@ module Blazer
     end
 
     def detect_adapter
-      if settings["url"].to_s.start_with?("mongodb://")
-        "mongodb"
+      schema = settings["url"].to_s.split("://").first
+      case schema
+      when "mongodb", "presto"
+        schema
       else
         "sql"
       end