Skip to main content

CHANGELOG.md

# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

While the version is in the `0.x` range, any release MAY contain breaking
changes; the minor version is bumped for each one. See
[CONTRIBUTING.md](CONTRIBUTING.md) for the full policy.

## [Unreleased]

## [0.1.0-beta.2]

### Changed

- Renamed the package and module namespace from `Quarry` to `Decant`
  (`quarry` → `decant`). No API or behavior change.

### Added

- `:on_blank` option controlling what a blank/no-token term resolves to: `:all`
  (default, `dynamic(true)`) or `:none` (`dynamic(false)`, match nothing).

## [0.1.0-beta.1]

### Added

- `Decant.dynamic/2` — compile a tokenized, multi-field search string into a
  composable `Ecto.Query.dynamic/2` built over named bindings.
- Two axes of boolean logic: `:token_logic` (`:and` default) across words and
  `:field_logic` (`:or` default) across columns.
- Match modes `:contains` (default), `:prefix`, `:suffix`, `:exact`, settable
  call-wide via `:match` or per-field.
- `:case` toggle between `ILIKE` (`:insensitive`, default) and `LIKE`
  (`:sensitive`).
- Automatic `LIKE` wildcard escaping (`%`, `_`, `\`) so user input matches
  literally; disable with `escape: false`.
- `:cast` field option wrapping a column in `CAST(? AS TEXT)` for searching
  non-text columns.
- `Decant.Tokenizer` with configurable `:pattern`, `:trim`, `:drop_empty`,
  `:downcase`, and a `:max_tokens` backstop.
- Empty / blank / `nil` terms return `dynamic(true)` for branch-free callers.