feat: serve QQQ /qqq/v1/search from OpenSearch (record-search provider) #32
Closed
KofTwentyTwo wants to merge 1 commits from
feature/record-search-provider into develop
pull from: feature/record-search-provider
merge into: QRun-IO:develop
QRun-IO:develop
QRun-IO:release/1.1
QRun-IO:main
QRun-IO:qualification/central-actions-20261031
QRun-IO:dependabot/maven/develop/maven-minor-and-patch-752a7e0ec3
QRun-IO:dependabot/github_actions/develop/github-actions-2833be4e3e
QRun-IO:feature/orb-0.8-track
QRun-IO:feature/orb-0.7.18
QRun-IO:feature/orb-0.7.17
QRun-IO:release/0.1.0
QRun-IO:feature/orb-standardize-release-0.1.0
QRun-IO:feature/restore-release-0.1.0-bom
QRun-IO:release/1.0
QRun-IO:release/0.2.0
QRun-IO:feature/orb-standardize-release-1.1
QRun-IO:feature/orb-standardize-release-1.0
QRun-IO:feature/orb-standardize-release-0.2.0
QRun-IO:feature/orb-main-hotfix-standardization
QRun-IO:feature/shared-codeql
QRun-IO:feature/orb-0712-stable-gate
QRun-IO:feature/orb-rc-worker
QRun-IO:feature/orb-0.7.11
QRun-IO:feature/central-ci
QRun-IO:feature/single-node-replicas
QRun-IO:fix/system-session-instance
QRun-IO:dependabot/maven/develop/org.testcontainers-testcontainers-2.0.5
QRun-IO:ci/release-rc-secrets-inherit
QRun-IO:feature/ui-api-1.6
QRun-IO:docs/rc11-release-note-correction
QRun-IO:feature/cluster-caches
QRun-IO:feature/quiet-index-bookkeeping-audits
QRun-IO:fix/help-bundle-version
QRun-IO:feature/health-checks
QRun-IO:feature/help-bundle
QRun-IO:feature/tables-populated-defaults
QRun-IO:feature/typeahead-suggest
QRun-IO:feature/record-search-details
QRun-IO:feature/exclude-classified-fields
QRun-IO:fix/realtime-error-count
QRun-IO:feature/orb-0.6.9
QRun-IO:feature/arch-status-api
QRun-IO:feature/release-rc-automation
QRun-IO:feature/quick-search-data-driven-config
QRun-IO:feature/ga-only-release-tags
QRun-IO:feature/quick-search-snake-table-names
QRun-IO:feature/developer-panel
QRun-IO:chore/qrun-repo-standard
QRun-IO:feature/GH-35-search-admin-tooling
QRun-IO:feature/record-search-provider-signed
QRun-IO:fix/28-insert-display-values
QRun-IO:feature/GH-28-insert-display-values
QRun-IO:feature/prepare-release-0.2.1
No Reviewers
Labels
Clear labels
architecture
bug
dependencies
documentation
duplicate
enhancement
github_actions
good first issue
help wanted
invalid
java
question
release:rc
secuurity
wontfix
Architecture review: coupling, cohesion, UI API
Something isn't working
Improvements or additions to documentation
This issue or pull request already exists
New feature or request
Pull requests that update GitHub Actions code
Good for newcomers
Extra attention is needed
This doesn't seem right
Pull requests that update java code
Further information is requested
Merging this develop PR cuts the next release candidate
This will not be worked on
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: QRun-IO/qbit-quick-search#32
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Adds
QuickSearchRecordSearchProvider, an implementation of QQQ core'sRecordSearchProviderInterface. With it,RecordSearchAction/POST /qqq/v1/search(the Next UI global search) is served from the Quick Search index for the tables this QBit indexes. This closes audit finding F-11 / decision D1.What it does
quickSearchIndex, and record search is not in backoff. The runtime caches the enabled flag._msearchrequest with one top-N search per table. Each search uses the same query, AND semantics and field weights asQuickSearchAction. It fetches onlyrecordId, up tomin(100, 4 x limitPerTable)ids per table, in relevance order. Core then re-reads the ids by primary key, so permissions, record locks and labels stay with core, and stale ids drop out.recordSearchTimeoutMillis(default 2500) caps the wall-clock time. On timeout the request is cancelled and an OpenSearch server-sidetimeoutalso applies. Any failure throws, and core then falls back to its LIKE search. A failure also starts a 30 s backoff (QuickSearchRuntime.markRecordSearchFailed) during which no tables are claimed. This way a down cluster does not add a timeout to every search.QuickSearchQBitConfig.withServeCoreRecordSearch(Boolean)defaults to true.postProduceActionsregisters the provider unless the host already registered a different one; in that case it keeps the host's provider and logs a warning.searchFields: every indexed table that has none gets its searchable fields that core accepts (visible STRING/TEXT/HTML/INTEGER/LONG, never hidden or PASSWORD). It skips tables on variant backends and tables that are not in the instance yet. App-providedsearchFieldsare never replaced.1.1.0-SNAPSHOT. Updated README (new "Core search" section and config rows),docs/MIGRATION-1.1.md, CHANGELOG[1.1.0], CLAUDE/AGENTS and TODO.Tests
QuickSearchRecordSearchProviderTest(10 tests):QExceptionafter 300 msRecordSearchActionend to end with a mock client: re-read, order, stale id,limitPerTable, unclaimed tableQuickSearchQBitProducerTest(+6 tests):searchFieldskept, idempotent registrationQuickSearchQBitConfigValidationTest: coversrecordSearchTimeoutMillis.RecordSearchProviderIntegrationTest(Testcontainers OpenSearch, 5 tests):searchFieldslimitPerTableCI=true ./mvnw verifygave BUILD SUCCESS. 369 unit tests and 24 integration tests passed, and the JaCoCo gate was met.For consuming apps (Website-Backend, qqq-all)
searchFields.QInstancebefore producing the QBit. Otherwise those tables get nosearchFields, and core search will not offer them.searchFieldsitself, they are kept.withServeCoreRecordSearch(false).withRecordSearchTimeoutMillis(...).🤖 Generated with Claude Code
Superseded by a re-signed PR pinned to the released QQQ 4.1.0-RC.2 (see the PR referencing #32). Closing.
🤖 Generated with Claude Code
Pull request closed