feat: v1 clean-room rewrite of Quick Search QBit #2

Merged
KofTwentyTwo merged 15 commits from feature/v1-clean-room-rewrite into develop 2026-03-29 12:26:41 +00:00
KofTwentyTwo commented 2026-03-29 12:24:25 +00:00 (Migrated from github.com)

Summary

Complete clean-room rewrite of qbit-quick-search for a production-ready 1.0.0 release.

  • 26 production classes, 21 test classes, 174 tests passing
  • Real-time indexing via post-insert/update/delete customizers through IndexEventPublisher strategy interface
  • Basepull safety net for missed records during downtime
  • OpenSearch client with explicit mappings, edge-ngram analyzer, batched operations, proper lifecycle
  • QuickSearchAction with pagination, relevance scoring, and highlight snippets
  • Per-field boosting via @QuickSearchField(weight=N)
  • Extensible IndexEventPublisher interface (default: synchronous, swap in RabbitMQ/Kafka)
  • Standard QBit SDLC setup (AGPL v3, checkstyle, CONTRIBUTING, SECURITY, CODE_OF_CONDUCT)
  • README rewritten following qbit-crm pattern

Key Architectural Decisions

  • IndexEventPublisher strategy pattern decouples write path from indexing
  • Singleton OpenSearch client with proper close() (no more per-operation client creation)
  • Lazy QuickSearchIndex row creation (first basepull/reindex run, not during produce)
  • QuickSearchQBitContext static holder for client/publisher (trade-off for QCodeReference)
  • Batched source queries with configurable sourceBatchSize (no more full-table OOM)

Test Plan

  • 174 unit tests passing (mvn test)
  • mvn verify green (JaCoCo 70% instruction / 90% class)
  • Integration test with Testcontainers (skips gracefully without Docker)
  • Manual verification with a real QQQ application
## Summary Complete clean-room rewrite of qbit-quick-search for a production-ready 1.0.0 release. - **26 production classes, 21 test classes, 174 tests passing** - Real-time indexing via post-insert/update/delete customizers through `IndexEventPublisher` strategy interface - Basepull safety net for missed records during downtime - OpenSearch client with explicit mappings, edge-ngram analyzer, batched operations, proper lifecycle - `QuickSearchAction` with pagination, relevance scoring, and highlight snippets - Per-field boosting via `@QuickSearchField(weight=N)` - Extensible `IndexEventPublisher` interface (default: synchronous, swap in RabbitMQ/Kafka) - Standard QBit SDLC setup (AGPL v3, checkstyle, CONTRIBUTING, SECURITY, CODE_OF_CONDUCT) - README rewritten following qbit-crm pattern ## Key Architectural Decisions - `IndexEventPublisher` strategy pattern decouples write path from indexing - Singleton OpenSearch client with proper `close()` (no more per-operation client creation) - Lazy `QuickSearchIndex` row creation (first basepull/reindex run, not during produce) - `QuickSearchQBitContext` static holder for client/publisher (trade-off for QCodeReference) - Batched source queries with configurable `sourceBatchSize` (no more full-table OOM) ## Test Plan - [x] 174 unit tests passing (`mvn test`) - [x] `mvn verify` green (JaCoCo 70% instruction / 90% class) - [x] Integration test with Testcontainers (skips gracefully without Docker) - [ ] Manual verification with a real QQQ application
Sign in to join this conversation.