# `QuackDB.Ecto`
[🔗](https://github.com/elixir-vibe/quackdb/blob/main/lib/quack_db/ecto.ex#L2)

Convenience imports for Ecto-based QuackDB query modules.

Use this in modules that build DuckDB analytical, spatial, series, or
full-text search Ecto queries and want the standard Ecto query DSL together with
QuackDB's Ecto helper macros:

    defmodule MyApp.Analytics do
      use QuackDB.Ecto

      def category_scores do
        from event in "events",
          group_by: event.category,
          select: %{
            category: event.category,
            median_score: median(event.score),
            fts_score: search_score("fts_main_events", event.id, ^"duckdb")
          }
      end
    end

The macro imports:

- `Ecto.Query`.
- `QuackDB.Ecto.Analytics`.
- `QuackDB.Ecto.Spatial`.
- `QuackDB.Ecto.FTS`.
- `QuackDB.Ecto.Regex`.
- `QuackDB.Ecto.Text`.
- `QuackDB.Ecto.List`.
- `QuackDB.Ecto.Map`.
- `QuackDB.Ecto.Struct`.
- `QuackDB.Ecto.Series`.
- `QuackDB.Ecto.Snapshot`.
- `QuackDB.Ecto.Variant`.
- `QuackDB.Ecto.Star`.
- `QuackDB.Ecto.WindowFrames`.

`QuackDB.Ecto.Conditionals.case_when/1` is also imported for multi-branch
DuckDB `CASE WHEN` expressions using Elixir clause syntax.

Imports can be disabled individually. When spatial and text helpers are both
enabled, shared `contains/2` dispatches obvious text calls to DuckDB
`contains` and spatial helper calls to `ST_Contains`. Ambiguous calls raise;
use `contains_text/2` or `st_contains/2` when intent is not obvious.

    use QuackDB.Ecto, spatial: false
    use QuackDB.Ecto, full_text_search: false
    use QuackDB.Ecto, analytics: false
    use QuackDB.Ecto, regex: false
    use QuackDB.Ecto, text: false
    use QuackDB.Ecto, list: false
    use QuackDB.Ecto, map: false
    use QuackDB.Ecto, struct: false
    use QuackDB.Ecto, series: false
    use QuackDB.Ecto, snapshot: false
    use QuackDB.Ecto, star: false
    use QuackDB.Ecto, variant: false
    use QuackDB.Ecto, window_frames: false
    use QuackDB.Ecto, query: false

# `column_sequence_name`

```elixir
@spec column_sequence_name(
  module()
  | atom()
  | String.t()
  | {atom() | String.t(), atom() | String.t()}
  | {atom() | String.t(), module()},
  atom() | String.t()
) :: String.t()
```

Returns the sequence name QuackDB migrations use for a serial table column.

    QuackDB.Ecto.column_sequence_name("fragments", :id)
    #=> "fragments_id_seq"

    QuackDB.Ecto.column_sequence_name({"main", "fragments"}, :id)
    #=> "main_fragments_id_seq"

Schema modules and `{source, schema}` tuples use Ecto field-source metadata:

    QuackDB.Ecto.column_sequence_name(FragmentRecord, :id)
    QuackDB.Ecto.column_sequence_name({"tenant_fragments", FragmentRecord}, :id)

---

*Consult [api-reference.md](api-reference.md) for complete listing*
