This audit tracks public API added after 0.3.0 and records the accepted naming decisions for 0.4.0. No open naming decisions remain for this release.
Ecto analytical helpers
QuackDB.Ecto.Analytics added or expanded helpers for analytical DuckDB expressions:
- Query profiling:
summarize/2,3,4andsummarize!/2,3,4. - Conditional expressions:
QuackDB.Ecto.Conditionals.case_when/1. - Date/time: atom-aware
date_part/2,date_trunc/2,time_bucket/2,3origins and offsets. - JSON:
json_extract/2,json_extract_string/2,json_exists/2,json_contains/2, plus Ecto access lowering. - Aggregates:
list/1,2,string_agg/2,3,arg_max/2,3,arg_min/2,3. - Statistical/analytical helpers:
median/1,quantile_cont/2,quantile_disc/2,corr/2,stddev/1,variance/1,stddev_pop/1,var_pop/1,var_samp/1,covar_pop/2,covar_samp/2,regr_slope/2,regr_intercept/2,regr_count/2,regr_r2/2,regr_sxx/2,regr_sxy/2,regr_syy/2,skewness/1,kurtosis/1,kurtosis_pop/1,sem/1,entropy/1,mad/1. - Numeric precision/weighted helpers:
favg/1,fsum/1,product/1,weighted_avg/2,geometric_mean/1. - Approximate helpers:
approx_count_distinct/1,approx_quantile/2,approx_top_k/2,reservoir_quantile/2,3. - Boolean/bit helpers:
bool_and/1,bool_or/1,band/1,bor/1,bxor/1,bitstring_agg/1,3. - Histograms:
histogram/1,histogram_exact/2,equi_width_bins/3,4.
Accepted naming decisions before 0.4.0:
- Keep
band/1,bor/1, andbxor/1for aggregate bitwise operations to match ElixirBitwisenaming rather than raw DuckDBbit_and,bit_or, andbit_xor. - Keep
list/1,2as the DuckDB-native aggregate name. Do not reintroduceduckdb_list/1. - Keep conditional aggregates expressed through Ecto
filter/2; do not addcount_if/countifhelpers.
Ecto text, regex, spatial, and predicates
QuackDB.Ecto.Regexexposes DuckDBregexp_*helpers and accepts compatible literal~rpatterns.QuackDB.Ecto.Textexposes common string predicates and splitting helpers:contains/2,contains_text/2,starts_with/2,ends_with/2,prefix/2,suffix/2,split_part/3,string_split/2, andstring_split_regex/2,3.QuackDB.Ecto.Spatial.st_contains/2is an explicit spatial escape hatch for sharedcontains/2use.- The hidden predicates module is imported by
use QuackDB.Ectoonly to dispatch sharedcontains/2.
Accepted naming decisions before 0.4.0:
- Keep
contains_text/2as the explicit text escape hatch for ambiguous sharedcontains/2calls. - Keep
st_contains/2as the explicit spatial escape hatch alongside direct spatial imports. - Keep ambiguous shared
contains/2calls raising instead of defaulting to spatial. - Keep the predicates module hidden;
contains/2dispatch is an implementation detail ofuse QuackDB.Ecto.
Window frames
QuackDB.Ecto.WindowFrames provides rows_between/2, range_between/2, and groups_between/2. They expand to fragment(...) and are intended for Ecto releases that include macro-expanded window frame support. Until QuackDB depends on such a release, examples should continue to show literal frame fragments.
Accepted naming decisions before 0.4.0:
- Keep the module name
QuackDB.Ecto.WindowFrames. - Keep tuple bounds such as
{:preceding, 6}and{:following, 1}plus atoms:current_row,:unbounded_preceding, and:unbounded_following. This keeps bounds compile-time data and avoids extra helper macros for each bound.
Direct SQL, sources, and append APIs
QuackDB.Analytics.summarize/1renders direct DuckDBSUMMARIZESQL for table names and raw query tuples.- Source helpers added
QuackDB.Source.sample/2andQuackDB.Source.histogram_values/3. - Append helpers added
QuackDB.insert_stream/4,insert_stream!/4,insert_table/4, andinsert_table!/4. - Explicit
{:map, key_type, value_type}append columns accept ordinary Elixir maps. Plain Elixir maps without an explicit MAP column spec continue to infer as DuckDBSTRUCTvalues.
Maintainer tooling
- The
quackdb.functions.snapshotMix task writes a checked-in DuckDB function catalog snapshot underpriv/duckdb_functions/current.exs. - The snapshot stores normalized QuackDB type specs for overload auditing, but package compilation must not depend on a live DuckDB server.
Pre-release checks
Before tagging 0.4.0:
- Re-read this file and decide whether open naming review items should change.
- Run
mix ci. - Run the full gated integration suite against DuckDB Quack.
- Run
mix docs. - Run
mix hex.build --unpackand inspect package contents.