Current section
Files
Jump to
Current section
Files
lib/selecto/adapter_sql.ex
defmodule Selecto.AdapterSQL do
@moduledoc false
import Selecto.Builder.Sql.Helpers, only: [single_wrap: 1]
alias Selecto.AdapterSupport
def adapter(selecto_or_adapter)
def adapter(%{adapter: adapter}) when not is_nil(adapter), do: adapter
def adapter(%{}), do: AdapterSupport.default_adapter()
def adapter(nil), do: AdapterSupport.default_adapter()
def adapter(adapter) when is_atom(adapter), do: adapter
def adapter(_other), do: AdapterSupport.default_adapter()
def format_datetime(selecto, expression, format) do
adapter = adapter(selecto)
if AdapterSupport.callback_available?(adapter, :format_datetime, 2) do
adapter.format_datetime(expression, format)
else
["to_char(", expression, ", ", single_wrap(format), ")"]
end
end
def rollup_sql(selecto, grouped_clauses) do
adapter = adapter(selecto)
cond do
not AdapterSupport.supports_feature?(adapter, :rollup) ->
grouped_clauses
AdapterSupport.callback_available?(adapter, :rollup_sql, 1) ->
adapter.rollup_sql(grouped_clauses)
AdapterSupport.supports_feature?(adapter, :rollup_with_rollup) ->
[grouped_clauses, " with rollup"]
true ->
["rollup( ", grouped_clauses, " )"]
end
end
def rollup_literal_order(selecto, index) when is_integer(index) do
adapter = adapter(selecto)
cond do
AdapterSupport.callback_available?(adapter, :rollup_literal_order, 1) ->
adapter.rollup_literal_order(index)
AdapterSupport.supports_feature?(adapter, :native_null_ordering) ->
[Integer.to_string(index), " asc nulls first"]
true ->
[Integer.to_string(index), " asc"]
end
end
def rollup_sort_fix(selecto) do
adapter = adapter(selecto)
connection = Map.get(selecto, :connection, Map.get(selecto, :postgrex_opts))
if AdapterSupport.callback_available?(adapter, :rollup_sort_fix, 1) do
adapter.rollup_sort_fix(connection)
else
false
end
end
def native_null_ordering?(selecto) do
AdapterSupport.supports_feature?(adapter(selecto), :native_null_ordering)
end
def requires_order_for_pagination?(selecto) do
AdapterSupport.supports_feature?(adapter(selecto), :requires_order_for_pagination)
end
def offset_fetch_pagination?(selecto) do
AdapterSupport.supports_feature?(adapter(selecto), :offset_fetch_pagination)
end
def array_any_comparison?(selecto) do
AdapterSupport.supports_feature?(adapter(selecto), :array_any_comparison)
end
end