Packages

High performance embedded realtime database combining ETS with TTL for caching, RocksDB for persistent parallel writes, and SQLite for secondary indexing and fast lookups

Current section

Files

Jump to
kdb lib kql.ex
Raw

lib/kql.ex

defmodule Kql do
def to_sql(opts) when is_list(opts) do
{sql, params} =
Enum.reduce(opts, {[], []}, fn item, {acc_sql, acc_params} ->
clause_to_sql(item, acc_sql, acc_params)
end)
sql =
sql
|> Enum.reverse()
|> Enum.join(" ")
params = Enum.reverse(params)
%{sql: sql, params: params}
end
defp clause_to_sql([], acc_sql, acc_params) do
{acc_sql, acc_params}
end
defp clause_to_sql([item | rest], acc_sql, acc_params) do
{acc_sql, acc_params} = clause_to_sql(item, acc_sql, acc_params)
clause_to_sql(rest, acc_sql, acc_params)
end
defp clause_to_sql({key, list}, acc_sql, acc_params) when is_list(list) do
{acc_sql, acc_params} = clause_to_sql(list, acc_sql, acc_params)
{["#{key}" | acc_sql], acc_params}
end
defp clause_to_sql({key, text}, acc_sql, acc_params) when is_binary(text) do
{[text, "#{key}"] ++ acc_sql, acc_params}
end
defp clause_to_sql({key, value}, acc_sql, acc_params) do
{["?", "#{key}"] ++ acc_sql, [value | acc_params]}
end
defp clause_to_sql({key, oper, value}, acc_sql, acc_params) do
{["?", oper, "#{key}"] ++ acc_sql, [value | acc_params]}
end
defp clause_to_sql({key, oper, value, after_value}, acc_sql, acc_params) do
{[after_value, "?", oper, "#{key}"] ++ acc_sql, [value | acc_params]}
end
defp clause_to_sql(key, acc_sql, acc_params) do
{["#{key}" | acc_sql], acc_params}
end
end