Current section
Files
Jump to
Current section
Files
lib/druid/client/sql.ex
defmodule Druid.Client.SQL do @moduledoc """ Builds requests for Druid's SQL API. """ @doc """ Builds a query request for Druid's SQL API. ## Examples Druid.Client.SQL.query("SELECT * FROM wikipedia") |> Druid.Client.request!(host: "localhost", port: 8082) """ @query_path "/druid/v2/sql" @spec query(String.t(), list(), Keyword.t()) :: Req.Request.t() def query(query, params \\ [], opts \\ []) do context = Keyword.get(opts, :context, %{}) body = %{ query: query, parameters: params, context: Map.merge( %{ sqlQueryId: Ecto.UUID.generate(), sqlStringifyArrays: false, skipEmptyBuckets: false, enableWindowing: true }, context ), resultFormat: "array", header: false, typesHeader: false } Req.new(method: :post, url: @query_path, json: body) end @doc """ Builds an insert request for Druid's SQL API. ## Examples sql = \""" INSERT INTO w000 SELECT TIME_PARSE("timestamp") AS __time, isRobot, channel, flags, isUnpatrolled, page, diffUrl, added, comment, commentLength, isNew, isMinor, delta, isAnonymous, user, deltaBucket, deleted, namespace, cityName, countryName, regionIsoCode, metroCode, countryIsoCode, regionName FROM TABLE( EXTERN( '{"type":"http","uris":["https://druid.apache.org/data/wikipedia.json.gz"]}', '{"type":"json"}', '[{"name":"isRobot","type":"string"},{"name":"channel","type":"string"},{"name":"timestamp","type":"string"},{"name":"flags","type":"string"},{"name":"isUnpatrolled","type":"string"},{"name":"page","type":"string"},{"name":"diffUrl","type":"string"},{"name":"added","type":"long"},{"name":"comment","type":"string"},{"name":"commentLength","type":"long"},{"name":"isNew","type":"string"},{"name":"isMinor","type":"string"},{"name":"delta","type":"long"},{"name":"isAnonymous","type":"string"},{"name":"user","type":"string"},{"name":"deltaBucket","type":"long"},{"name":"deleted","type":"long"},{"name":"namespace","type":"string"},{"name":"cityName","type":"string"},{"name":"countryName","type":"string"},{"name":"regionIsoCode","type":"string"},{"name":"metroCode","type":"long"},{"name":"countryIsoCode","type":"string"},{"name":"regionName","type":"string"}]' ) ) PARTITIONED BY HOUR CLUSTERED BY channel \""" Druid.Client.SQL.insert(sql) |> Druid.Client.request!(host: "localhost", port: 8082) """ @insert_path "/druid/v2/sql/task" @spec insert(String.t(), list(), Keyword.t()) :: Req.Request.t() def insert(query, params \\ [], opts \\ []) do context = Keyword.get(opts, :context, %{}) body = %{ query: query, parameters: params, context: Map.merge( %{ sqlQueryId: Ecto.UUID.generate(), sqlStringifyArrays: false, skipEmptyBuckets: false, enableWindowing: true }, context ) } Req.new(method: :post, url: @insert_path, json: body) endend