feat: serve QQQ /qqq/v1/search from OpenSearch (record-search provider) #34

Merged
KofTwentyTwo merged 1 commits from feature/record-search-provider-signed into develop 2026-10-11 18:52:14 +00:00
KofTwentyTwo commented 2026-10-11 18:48:16 +00:00 (Migrated from github.com)

Supersedes #32. Same change, but:

  • pinned to the released QQQ 4.1.0-RC.2 (the first release carrying RecordSearchProviderInterface) instead of 4.1.0-SNAPSHOT; README, CHANGELOG, MIGRATION-1.1, AGENTS/CLAUDE and TODO updated to match
  • based on current develop (includes #33)
  • re-signed as a verified commit (the #32 commit was authored with an unverified email)

What it does

Implements QQQ core's record-search provider SPI so POST /qqq/v1/search (Next UI global search) is served from the Quick Search index for indexed, enabled tables. The provider returns record ids only; core re-reads them by primary key through QueryAction, so table permissions, record security locks and labels stay core's responsibility. One _msearch per call (typed query DSL, no string-built queries), bounded by recordSearchTimeoutMillis, with a short backoff after a failure during which core falls back to its own LIKE search. Opt-out via serveCoreRecordSearch.

Review

Reviewed: provider, OpenSearch client searchRecordIdsPerTable, producer registration, unit + Testcontainers integration tests. No blocking findings.

🤖 Generated with Claude Code

Supersedes #32. Same change, but: - pinned to the **released QQQ 4.1.0-RC.2** (the first release carrying `RecordSearchProviderInterface`) instead of `4.1.0-SNAPSHOT`; README, CHANGELOG, MIGRATION-1.1, AGENTS/CLAUDE and TODO updated to match - based on current `develop` (includes #33) - re-signed as a verified commit (the #32 commit was authored with an unverified email) ## What it does Implements QQQ core's record-search provider SPI so `POST /qqq/v1/search` (Next UI global search) is served from the Quick Search index for indexed, enabled tables. The provider returns record ids only; core re-reads them by primary key through `QueryAction`, so table permissions, record security locks and labels stay core's responsibility. One `_msearch` per call (typed query DSL, no string-built queries), bounded by `recordSearchTimeoutMillis`, with a short backoff after a failure during which core falls back to its own LIKE search. Opt-out via `serveCoreRecordSearch`. ## Review Reviewed: provider, OpenSearch client `searchRecordIdsPerTable`, producer registration, unit + Testcontainers integration tests. No blocking findings. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign in to join this conversation.