Packages
pillar
0.31.0
0.40.0
0.39.0
0.38.0
0.37.0
0.36.0
0.35.0
0.34.1
0.34.0
0.33.1
0.33.0
0.32.0
0.31.0
0.30.0
0.29.1
0.29.0
0.28.0
0.27.0
0.26.1
0.26.0
0.25.1
0.25.0
0.24.0
0.23.3
0.23.2
0.23.1
0.23.0
0.22.0
0.21.0
0.20.0
0.19.0
0.18.2
0.18.1
0.18.0
0.17.3
0.17.2
0.17.1
0.17.0
0.16.2
0.16.1
0.16.0
0.15.0
0.14.0
0.13.1
0.13.0
0.12.0
0.11.0
0.10.0
0.9.1
0.9.0
0.8.1
0.8.0
0.7.0
0.6.0
0.5.1
0.5.0
0.4.0
0.3.2
0.3.1
0.3.0
0.2.1
0.2.0
0.1.0
Elixir client for ClickHouse, a fast open-source Online Analytical Processing (OLAP) database management system.
Current section
Files
Jump to
Current section
Files
lib/pillar/query_builder.ex
defmodule Pillar.QueryBuilder do
@moduledoc false
alias Pillar.TypeConvert.ToClickhouse
alias Pillar.TypeConvert.ToClickhouseJson
def query(query, params) when is_map(params) do
case Enum.empty?(params) do
true ->
query
false ->
original_query = query
prepare_params = Enum.map(params, fn {k, v} -> {"{#{k}}", v} end) |> Enum.into(%{})
String.replace(original_query, Map.keys(prepare_params), fn pattern ->
ToClickhouse.convert(prepare_params[pattern])
end)
end
end
def insert_to_table(table_name, record) when is_map(record) do
converted_value = convert_values_to_clickhouse_for_json_insert(record)
generate_json_insert_query(table_name, List.wrap(converted_value))
end
def insert_to_table(table_name, records) when is_list(records) do
converted_values = Enum.map(records, &convert_values_to_clickhouse_for_json_insert/1)
generate_json_insert_query(table_name, converted_values)
end
defp generate_json_insert_query(table_name, records) do
sql_strings = [
"INSERT INTO",
table_name,
"FORMAT JSONEachRow",
Enum.join(Enum.map(records, &Jason.encode!/1), " ")
]
Enum.join(sql_strings, "\n")
end
defp convert_values_to_clickhouse_for_json_insert(map) do
map
|> Enum.reject(fn {_key, value} -> is_nil(value) end)
|> Enum.map(fn {key, value} ->
{key, ToClickhouseJson.convert(value)}
end)
|> Map.new()
end
end