Packages
Elixir client for ClickHouse, a fast open-source Online Analytical Processing (OLAP) database management system. Forked from https://github.com/balance-platform/pillar to support CH25+
Current section
Files
Jump to
Current section
Files
lib/pillar/query_builder.ex
defmodule Pillar.QueryBuilder do
@moduledoc false
alias Pillar.TypeConvert.{ToClickhouse, 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, records, db_version \\ nil, query_options \\ %{})
def insert_to_table(table_name, record, db_version, query_options) when is_map(record) do
converted_value =
convert_values_to_clickhouse_for_json_insert(record, db_version, query_options)
generate_json_insert_query(table_name, List.wrap(converted_value))
end
def insert_to_table(table_name, records, db_version, query_options) when is_list(records) do
converted_values =
Enum.map(
records,
&convert_values_to_clickhouse_for_json_insert(&1, db_version, query_options)
)
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, db_version, query_options) do
map
|> Enum.reject(fn {_key, value} -> is_nil(value) end)
|> Map.new(fn {key, value} ->
{key, ToClickhouseJson.convert(value, db_version, query_options)}
end)
end
end