Skip to content

Render the built-in filter clause from a template table. - #4

Merged
gustavofreze merged 3 commits into
mainfrom
feat/starts-with-operator
Jul 31, 2026
Merged

Render the built-in filter clause from a template table.#4
gustavofreze merged 3 commits into
mainfrom
feat/starts-with-operator

Conversation

@gustavofreze

Copy link
Copy Markdown
Member

Please follow the contributing guidelines.

Summary

What this pull request does.

Related issue

Closes #...

Checklist

  • Tests added or updated.
  • Documentation updated when applicable.
  • composer review passes.
  • composer tests passes.

Each operator carried its own match arm, so the cyclomatic complexity of
the function grew with every operator and had already reached the ceiling
the linter enforces. The arms only ever differed by the SQL template, so
a lookup keyed by the operator token expresses the same mapping and keeps
the complexity flat.
The operator renders as an anchored LIKE so a B-tree index on the column
stays usable, and every wildcard inside the value is escaped before
binding, so a search for a literal percent sign cannot expand into a
scan. There is no unanchored counterpart by design, since it cannot use
the index and degrades the listing into a table scan as the data grows.

The escape character is an exclamation mark rather than the customary
backslash. A backslash needs one spelling under the default MySQL mode
and another under NO_BACKSLASH_ESCAPES, where the usual form fails with
Incorrect arguments to ESCAPE, so no single literal is valid in both.
Case and accent insensitivity come from the column collation instead, so
the rendered predicate carries no vendor-specific COLLATE.
@gustavofreze
gustavofreze merged commit 583d2f8 into main Jul 31, 2026
7 checks passed
@gustavofreze
gustavofreze deleted the feat/starts-with-operator branch July 31, 2026 15:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant