Sha256: fcc7baca00de0ad73f0e416fe11cdc8a9f598929a12a5aaf4c08f638c07e8962

Contents?: true

Size: 1.2 KB

Versions: 1

Compression:

Stored size: 1.2 KB

Contents

require "json"
require "net/http"
require "drill/version"

class Drill
  class Error < StandardError; end

  HEADERS = {
    "Content-Type" => "application/json",
    "Accept" => "application/json"
  }

  def initialize(url: nil, open_timeout: 3, read_timeout: nil)
    url ||= ENV["DRILL_URL"] || "http://localhost:8047"
    # strip trailing slash if exists
    @uri = URI.parse("#{url.sub(/\/\z/, "")}/query.json")
    @http = Net::HTTP.new(@uri.host, @uri.port)
    @http.use_ssl = true if @uri.scheme == "https"
    @http.open_timeout = open_timeout if open_timeout
    @http.read_timeout = read_timeout if read_timeout
  end

  def query(statement)
    data = {
      queryType: "sql",
      query: statement
    }

    begin
      response = @http.post(@uri.request_uri, data.to_json, HEADERS)
    rescue Errno::ECONNREFUSED => e
      raise Drill::Error, e.message
    end

    body = JSON.parse(response.body)
    if body["errorMessage"]
      raise Drill::Error, body["errorMessage"].split("\n")[0]
    end

    # return columns in order
    result = []
    columns = body["columns"]
    body["rows"].each do |row|
      result << columns.each_with_object({}) { |c, memo| memo[c] = row[c] }
    end
    result
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
drill-sergeant-0.1.2 lib/drill-sergeant.rb