defmodule Ecto.Query.Timescaledb do
@moduledoc """
Provides functions in [TimescaleDB](https://www.timescale.com/) extended SQL for `Ecto.Query`
"""
@doc """
Stands for AS
## Examples
import Ecto.Query
import Ecto.Query.Timescaledb
from(s in Stat,
select: as(sum(s.avg), avg),
order_by: [desc: fragment("avg")]
)
"""
defmacro as(a, b) do
quote do
fragment(unquote("? AS " <> Macro.to_string(b)), unquote(a))
end
end
@doc """
mixfix version of as function
"""
defmacro a ~> b do
quote do: as(unquote(a), unquote(b))
end
@doc """
[time_bucket](https://docs.timescale.com/api/latest/hyperfunctions/time_bucket/) extension in timescaledb
## Examples
import Ecto.Query
import Ecto.Query.Timescaledb
from(s in Stat,
select: [time_bucket("7 days", time, bucket), sum(s.avg)],
group_by: fragment("bucket"),
order_by: [desc: fragment("bucket")]
)
"""
defmacro time_bucket(bucket_width, ts, name) do
quote do
fragment(
unquote("time_bucket(?, " <> Macro.to_string(ts) <> ") " <> Macro.to_string(name)),
unquote(bucket_width)
)
end
end
@doc """
[time_bucket_ng](https://docs.timescale.com/api/latest/hyperfunctions/time_bucket_ng/) extension in timescaledb
"""
defmacro time_bucket_ng(bucket_width, ts) do
quote do
fragment(
unquote("timescaledb_experimental.time_bucket_ng(?, " <> Macro.to_string(ts) <> ")"),
unquote(bucket_width)
)
end
end
@doc """
[histogram](https://docs.timescale.com/api/latest/hyperfunctions/histogram/)
## Examples
import Ecto.Query
import Ecto.Query.Timescaledb
from(r in Readings,
select: [r.device_id, histogram(r.battery_level, 20, 60, 5)],
group_by: r.device_id,
limit: 10
)
"""
defmacro histogram(value, min, max, nbuckets) do
quote do
fragment(
"histogram(?, ?, ?, ?)",
unquote(value),
unquote(min),
unquote(max),
unquote(nbuckets)
)
end
end
end