Packages

ClickHouse driver for Elixir which uses ODBC driver for connection.

Current section

Files

Jump to
clickhousex_odbc lib clickhousex query.ex
Raw

lib/clickhousex/query.ex

defmodule Clickhousex.Query do
@moduledoc """
Query struct returned from a successfully prepared query.
"""
@type t :: %__MODULE__{
name: iodata,
statement: iodata,
columns: [String.t] | nil
}
defstruct [:name, :statement, :columns]
end
defimpl DBConnection.Query, for: Clickhousex.Query do
#require IEx
def parse(query, opts) do
query
end
def describe(query, opts) do
query
end
# @spec encode(query :: Clickhousex.Query.t(), params :: [Clickhousex.Type.param()], opts :: Keyword.t()) ::
# [Clickhousex.Type.param()]
def encode(query, params, opts) do
# Enum.map(params, &(Clickhousex.Type.encode(&1, opts)))
params
end
# @spec decode(query :: Clickhousex.Query.t(), result :: Clickhousex.Result.t(), opts :: Keyword.t()) ::
# Clickhousex.Result.t()
# def decode(_query, %Clickhousex.Result{rows: rows} = result, opts) when not is_nil(rows) do
# Map.put(result, :rows, Enum.map(rows, fn row -> Enum.map(row, &(Clickhousex.Type.decode(&1, opts))) end))
# end
def decode(_query, result, _opts) do
case result.command do
:selected ->
rows = result.rows
new_rows = Enum.map(rows, fn el ->
list1 = Tuple.to_list(el)
Enum.map(list1, fn el1 ->
cond do
is_list(el1) ->
to_string(el1)
true ->
el1
end
end)
end)
Map.put(result, :rows, new_rows)
_ ->
result
end
end
end
defimpl String.Chars, for: Clickhousex.Query do
def to_string(%Clickhousex.Query{statement: statement}) do
IO.iodata_to_binary(statement)
end
end