conexus 6.3.3__tar.gz → 6.3.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {conexus-6.3.3 → conexus-6.3.4}/PKG-INFO +1 -1
- {conexus-6.3.3 → conexus-6.3.4}/mcpb/pyproject.toml +2 -2
- {conexus-6.3.3 → conexus-6.3.4}/pyproject.toml +1 -1
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/CatalogRepository.java +168 -36
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/CatalogHandler.java +81 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/CatalogRepositoryTest.java +95 -0
- conexus-6.3.4/service/src/test/java/dev/nexus/service/http/CatalogHandlerUpdateManyDeleteManyTest.java +232 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/factory.py +102 -9
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/http_catalog_client.py +86 -1
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/catalog.py +11 -2
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/catalog_cmds/maintenance.py +14 -4
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/catalog_cmds/remediation.py +12 -4
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/binary_install.py +1 -1
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/http_aspect_queue.py +1 -1
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/http_centroid_store.py +1 -1
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/http_document_aspects_store.py +1 -1
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/http_document_highlights_store.py +1 -1
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/http_memory_store.py +1 -1
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/http_plan_library.py +1 -1
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/http_taxonomy_store.py +1 -1
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/http_telemetry_store.py +1 -1
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/http_token_store.py +1 -1
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/indexer.py +82 -7
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/mcp_infra.py +65 -5
- {conexus-6.3.3 → conexus-6.3.4}/.beads/README.md +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/.gitignore +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/LICENSE +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/README.md +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/conexus/README.md +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/conexus/agents/_shared/README.md +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/conexus/daemon/com.nexus.service.plist +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/conexus/daemon/com.nexus.t2.plist +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/conexus/daemon/com.nexus.t3.plist +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/conexus/daemon/nexus-service.service +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/conexus/daemon/nexus-t2.service +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/conexus/daemon/nexus-t3.service +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/conexus/hooks/scripts/routing/README.md +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/abstract-themes.yml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/analyze-default.yml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/citation-traversal.yml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/debug-default.yml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/document-default.yml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/find-by-author.yml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/hybrid-factual-lookup.yml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/plan-author-default.yml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/plan-inspect-default.yml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/plan-inspect-dimensions.yml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/plan-promote-propose.yml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/research-default.yml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/review-default.yml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/traverse-then-generate.yml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/type-scoped-search.yml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/dimensions.yml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/purposes.yml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/data/calibration/rdr-109/README.md +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/docs/README.md +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/docs/migration/README.md +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/docs/rdr/README.md +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/dt/scripts/Index Current Group in nx.applescript +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/dt/scripts/Index Selection in nx (Knowledge).applescript +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/dt/scripts/Index Selection in nx.applescript +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/mcpb/src/server.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/scripts/cron/README.md +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/scripts/launchd/README.md +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/scripts/rdr152-sandbox/README.md +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/scripts/spikes/s04-build/src/main/java/dev/nexus/spike/s04/Main.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/scripts/spikes/s04-build/src/main/resources/META-INF/native-image/reachability-metadata.json +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/scripts/spikes/s04-build/src/main/resources/db/changelog/db.changelog-master.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/scripts/spikes/s04-build/src/main/resources/logback.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/README.md +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/Main.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/NexusService.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/AspectRepository.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/ChashRepository.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/CollectionRegistry.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/DeadlockRetry.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/MemoryRepository.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/MigrationJobRepository.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/PgSession.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/PlanRepository.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/PoolerModeCheck.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/SchemaMigrator.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/ScratchRepository.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/SessionPrincipal.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/TaxonomyRepository.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/TelemetryRepository.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/TenantConstants.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/TenantScope.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/TokenCache.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/TokenHashing.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/TokenStore.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/AspectHandler.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/AuthFilter.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/ChashHandler.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/HealthHandler.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/HttpUtil.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/MemoryHandler.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/MigrationHandler.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/PlanHandler.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/RequestContext.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/ScratchHandler.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/SessionTokenHandler.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/TaxonomyHandler.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/TelemetryHandler.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/TokenAdminHandler.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/VectorHandler.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/VersionHandler.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/WhoamiHandler.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/jooq/binding/Vector.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/jooq/binding/VectorBinding.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/nativeimage/JooqRecordReflectionFeature.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/resolver/ChromaSchemeHandler.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/resolver/ChunkTextFetcher.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/resolver/HttpsSchemeHandler.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/resolver/ResolveResult.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/resolver/UnknownSchemeException.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/resolver/UriSchemeHandler.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/resolver/UriSchemeResolverRegistry.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/Bge768Embedder.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/CceEmbedder.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/ChromaQuotaValidator.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/ChromaRestClient.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/DimTables.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/EgressProxy.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/EmbedResult.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/Embedder.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/EmbedderRouter.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/EmbeddingModelUnavailableException.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/LocalChromaServer.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/OnnxEmbedder.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/PgVectorRepository.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/TaxonomyCentroidRepository.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/VectorRepository.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/VoyageEmbedder.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/META-INF/native-image/native-image.properties +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/META-INF/native-image/reflect-config.json +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/META-INF/native-image/resource-config.json +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/META-INF/native-image/traced/reachability-metadata.json +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/META-INF/nexus/release.properties +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/aspects-001-baseline.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/aspects-002-next-retry-at.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/catalog-001-baseline.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/catalog-002-hygiene.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/catalog-003-soft-delete.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/catalog-004-manifest-functions.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/catalog-005-collection-vector-stats.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/catalog-006-combined-query-functions.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/catalog-007-graph-hop-functions.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/catalog-008-combined-query-extensions.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/catalog-009-read-shape-views.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/catalog-011-collection-health-stale-age.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/chash-001-baseline.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/db.changelog-master.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/fk-001-catalog-cross-store.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/fk-002-collection-registry.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/fk-002-validate.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/fk-003-collection-registry-extra.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/fk-003-validate.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/grants-nexus-svc.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/memory-001-baseline.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/migration-001-baseline.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/perf-001-rename-collection-indexes.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/plans-001-baseline.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/role-001-nexus-svc.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/service-tokens-001-baseline.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/service-tokens-002-single-root-index.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/t1-001-baseline.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/taxonomy-001-baseline.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/taxonomy-002-centroids.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/taxonomy-003-doc-count-trigger.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/taxonomy-004-dedup-root-topics.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/telemetry-001-baseline.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/updated-at-001-triggers.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/vectors-001-baseline.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/vectors-002-trgm-index.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/logback.xml +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/AspectOperatorQueryTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/AspectRepositoryTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/AuthFilterTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/Bge768ParityTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/Bge768ServiceEmbedIntegrationTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/BridgeAddressFieldsTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/CatalogDeleteCollectionCascadeTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/CatalogDocumentCascadeTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/CatalogHandlerDeleteTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/CatalogHandlerRenameTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/CatalogRenameCollectionTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/CatalogSchemaLiquibaseTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/ChashRepositoryTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/ChashVectorConcurrencyTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/ChunksRlsBehavioralTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/CollectionRegistryFkExtraTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/CollectionRegistryFkTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/CollectionVectorStatsTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/CombinedQueryParityIntegrationTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/CombinedQueryParityTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/DualRunHarnessIntegrationTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/EmbedParityTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/EmbeddingModeFailLoudTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/ForeignKeyConstraintTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/GraphHopParityIntegrationTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/GraphHopParityTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/HybridParityIntegrationTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/HybridSelectiveGateTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/ManifestFunctionsTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/MemoryHandlerTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/MemoryRepositoryTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/MemorySchemaLiquibaseTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/PgBouncerTenantIsolationTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/PgContainerHelper.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/PgVectorCombinedQueryContractTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/PgVectorEmbedSkipGcRaceTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/PgVectorHybridSearchContractTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/PgVectorRepositoryContractTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/PgVectorServingContractTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/PgVectorUpsertDeadlockTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/PlanHandlerTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/PlanRepositoryTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/PlansSchemaLiquibaseTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/ReadShapeViewsTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/ReferenceOnlyChunkUpsertTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/SchemaMigratorIntegrationTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/ScratchHandlerTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/ScratchRepositoryTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/ScratchSchemaLiquibaseTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/ServiceBindHostTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/ServiceIntegrationTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/ServiceTokenSchemaLiquibaseTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/SessionTokenHandlerTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/SoftDeleteTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/TaxonomyCentroidHandlerTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/TaxonomyCentroidRepositoryTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/TaxonomyCentroidSchemaLiquibaseTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/TaxonomyPersistHandlerTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/TaxonomyRepositoryTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/TaxonomySchemaLiquibaseTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/TelemetryRepositoryTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/TelemetrySchemaLiquibaseTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/TenantPoolingIsolationTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/TokenAdminHandlerTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/TokenBoundaryAdversarialTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/UpdatedAtTriggerTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/VectorHandlerEmbeddingModeTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/VectorHandlerTokenUsageTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/VectorHybridHttpTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/VectorIntegrationTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/db/CatalogTsOrNullTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/db/CollectionRegistryTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/db/DeadlockRetryTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/db/PoolerModeCheckTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/db/RawSqlGateTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/db/TenantScopeAdmissionTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/db/TenantScopeGucAllowlistTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/http/AspectHandlerEnqueueErrorTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/http/CatalogHandlerImportEmptyBodyTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/http/CatalogHandlerManifestFkTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/http/MigrationHandlerIngestCloudTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/http/TaxonomyHandlerAssignFkTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/http/VersionHandlerReleaseVersionTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/jooq/binding/VectorRoundTripTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/nativeimage/JooqRecordReflectionFeatureTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/resolver/ChromaSchemeHandlerTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/resolver/HttpsSchemeHandlerTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/resolver/UriSchemeResolverRegistryTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/vectors/Bge768EmbedderMathTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/vectors/EgressProxyTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/vectors/EmbedderRouterBge768Test.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/vectors/EmbedderRouterVoyageOnlyTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/vectors/PgVectorEmbedSkipIntegrationTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/vectors/PgVectorEmbedSkipTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/vectors/PgVectorRepositoryWherePredicateTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/vectors/ReferenceOnlySqlShapeTest.java +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/service/src/test/resources/bge768/parity_reference.json +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/sn/README.md +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/sn/hooks/scripts/routing/README.md +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/__init__.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/_git_hooks_meta.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/_locking.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/_mineru_pid.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/_session_end_launcher.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/aspect_extractor.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/aspect_promotion.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/aspect_readers.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/aspect_worker.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/bib_enricher.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/bib_enricher_openalex.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/bib_extractor.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/AGENTS.md +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/__init__.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/auto_linker.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/catalog.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/catalog_backup.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/catalog_db.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/catalog_docs.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/catalog_git.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/catalog_links.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/catalog_owners.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/catalog_protocol.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/catalog_spans.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/catalog_sync.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/catalog_writes.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/collection_name.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/collections_owner_backfill.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/consolidation.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/dedupe.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/dt_link_generator.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/event_log.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/events.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/link_generator.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/manifest_backfill.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/orphan_backfill.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/projector.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/store_hook.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/synthesizer.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/tumbler.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/types.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/write_priority.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/checkpoint.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/chunk_batcher.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/chunk_identity.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/chunker.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/classifier.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/cli.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/code_indexer.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/collection_audit.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/collection_health.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/collection_rename.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/__init__.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/_helpers.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/_migration_prompt.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/_provision.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/aspects.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/catalog_cmds/__init__.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/catalog_cmds/backfill.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/catalog_cmds/backups.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/catalog_cmds/collections.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/catalog_cmds/doctor.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/catalog_cmds/integrity.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/catalog_cmds/links.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/catalog_cmds/migration.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/catalog_cmds/orphan_backfill.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/catalog_cmds/owners.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/catalog_cmds/report.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/collection.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/command_context.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/config_cmd.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/console.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/context_cmd.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/daemon.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/doc.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/doctor.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/dt.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/enrich.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/guided_upgrade_cmd.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/hook.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/hooks.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/index.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/init.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/memory.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/migrate_cmd.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/migration_cmd.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/mineru.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/plan.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/rdr.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/scratch.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/search_cmd.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/service_cmd.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/storage_cmd.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/store.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/t3.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/taxonomy_cmd.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/tenant_cmd.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/tier_status.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/uninstall.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/upgrade.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/config.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/__init__.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/app.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/config.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/routes/__init__.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/routes/activity.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/routes/campaigns.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/routes/health.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/routes/partials.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/static/alpine.min.js +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/static/console.css +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/static/htmx.min.js +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/static/pico.min.css +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/templates/activity/_detail.html +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/templates/activity/_stream.html +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/templates/activity/index.html +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/templates/base.html +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/templates/campaigns/detail.html +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/templates/campaigns/index.html +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/templates/health/_cards.html +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/templates/health/index.html +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/watchers.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/context.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/corpus.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/cross_encoder.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/AGENTS.md +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/T2_DAEMON_WIP.md +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/__init__.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/aspect_worker_daemon.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/binary_lifecycle.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/catalog_write_shim.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/discovery.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/installer.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/service_registry.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/spin_guard.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/storage_service_daemon.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/t1_lease.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/t2_client.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/t2_daemon.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/t3_daemon.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/AGENTS.md +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/__init__.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/chroma_quotas.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/collection_purge.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/embed_migrate.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/http_scratch_store.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/http_vector_client.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/local_ef.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/managed_endpoint.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/migrations.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/pg_bundle.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/pg_provision.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/service_bge_model.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/service_endpoint.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/storage_mode.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t1.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/__init__.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/_raw_handle_guard.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/_tuning.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/aspect_extraction_queue.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/aspects_etl.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/catalog.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/catalog_etl.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/catalog_taxonomy.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/chash_etl.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/chash_index.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/document_aspects.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/document_highlights.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/http_chash_index.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/memory_etl.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/memory_store.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/plan_etl.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/plan_library.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/taxonomy_compute.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/taxonomy_etl.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/telemetry.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/telemetry_etl.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t3.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t3_reidentify.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/devonthink.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/doc/__init__.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/doc/_common.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/doc/citations.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/doc/ref_scanner.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/doc/render.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/doc/resolvers.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/doc/resolvers_corpus.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/doc/tokens.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/doc_indexer.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/doctor_search.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/dropped_writes.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/dt_writeback.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/errors.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/exporter.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/filters.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/formatters.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/frecency.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/glossary.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/health.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/hook_registry.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/hooks.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/index_context.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/indexer_utils.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/languages.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/logging_setup.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/mcp/AGENTS.md +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/mcp/__init__.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/mcp/_first_run.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/mcp/_t1_state.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/mcp/catalog.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/mcp/core.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/mcp/devonthink.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/mcp/plan_cache_registry.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/mcp_client/__init__.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/mcp_client/core.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/mcp_client/devonthink.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/mcp_server.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/md_chunker.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/merge_candidates.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/metadata_schema.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/__init__.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/banner.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/chroma_read.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/detection.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/driver.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/etl_registry.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/guided_upgrade.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/manifest_check.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/migration_report.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/orchestrator.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/pregate.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/quiesce.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/route_coverage.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/sequencer.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/state.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/validation.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/vector_etl.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/verify_fill.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/name_canaries.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/operators/aspect_sql.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/operators/dispatch.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/pdeathsig.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/pdf_chunker.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/pdf_extractor.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/phase_review_sentinel.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/pipeline_buffer.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/pipeline_stages.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/plans/__init__.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/plans/bundle.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/plans/loader.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/plans/match.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/plans/matcher.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/plans/promote.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/plans/purposes.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/plans/repair.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/plans/runner.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/plans/schema.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/plans/scope.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/plans/seed_loader.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/plans/session_cache.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/prose_indexer.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/registry.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/repo_identity.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/repos.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/retry.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/ripgrep_cache.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/routing_stats.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/salience.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/scoring.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/search_clusterer.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/search_engine.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/session.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/stage_timers.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/storage_boundary_lint.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/taxonomy.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/taxonomy_backfill.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/ttl.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/types.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/util/__init__.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/src/nexus/util/process_group.py +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/tests/cc-validation/README.md +0 -0
- {conexus-6.3.3 → conexus-6.3.4}/tests/e2e/t2-migration-sqlite/README.md +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: conexus
|
|
3
|
-
Version: 6.3.
|
|
3
|
+
Version: 6.3.4
|
|
4
4
|
Summary: Self-hosted semantic search and knowledge management for LLM-driven development
|
|
5
5
|
Project-URL: Homepage, https://github.com/Hellblazer/nexus
|
|
6
6
|
Project-URL: Repository, https://github.com/Hellblazer/nexus
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "conexus-mcpb"
|
|
3
|
-
version = "6.3.
|
|
3
|
+
version = "6.3.4"
|
|
4
4
|
description = "Conexus packaged as Claude Desktop .mcpb (Desktop Extension)"
|
|
5
5
|
requires-python = ">=3.12"
|
|
6
6
|
dependencies = [
|
|
@@ -10,7 +10,7 @@ dependencies = [
|
|
|
10
10
|
# while collections are indexed at 768/1024-dim, so every T3 search hits a
|
|
11
11
|
# dimension mismatch and returns zero results. The .mcpb cannot run the
|
|
12
12
|
# interactive `nx init` embedder choice, so it must pin [local] explicitly.
|
|
13
|
-
"conexus[local]>=6.3.
|
|
13
|
+
"conexus[local]>=6.3.4",
|
|
14
14
|
]
|
|
15
15
|
|
|
16
16
|
[tool.uv]
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "conexus"
|
|
7
|
-
version = "6.3.
|
|
7
|
+
version = "6.3.4"
|
|
8
8
|
description = "Self-hosted semantic search and knowledge management for LLM-driven development"
|
|
9
9
|
readme = { file = "README.md", content-type = "text/markdown" }
|
|
10
10
|
requires-python = ">=3.12,<3.14"
|
{conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/CatalogRepository.java
RENAMED
|
@@ -36,6 +36,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
36
36
|
import org.jooq.Condition;
|
|
37
37
|
import org.jooq.DSLContext;
|
|
38
38
|
import org.jooq.Field;
|
|
39
|
+
import org.jooq.Query;
|
|
39
40
|
import org.jooq.SelectField;
|
|
40
41
|
import org.jooq.Table;
|
|
41
42
|
import org.jooq.UpdateSetMoreStep;
|
|
@@ -669,6 +670,108 @@ public final class CatalogRepository {
|
|
|
669
670
|
|
|
670
671
|
public int updateDocument(String tenant, String tumbler, Map<String, Object> fields) {
|
|
671
672
|
if (fields.isEmpty()) return 0;
|
|
673
|
+
return tenantScope.withTenant(tenant, ctx -> {
|
|
674
|
+
Query query = buildUpdateDocumentQuery(ctx, tenant, tumbler, fields);
|
|
675
|
+
return query == null ? 0 : query.execute();
|
|
676
|
+
});
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
/**
|
|
680
|
+
* Batch-update mutable document fields for N documents in ONE round trip
|
|
681
|
+
* (nexus-xedhp, duoak.11 follow-up to the register_many fix above).
|
|
682
|
+
*
|
|
683
|
+
* <p>{@code writer.update()} per changed doc was the WAN-round-trip sink:
|
|
684
|
+
* a HEAD bump (any new git commit) flips every indexed doc's stored
|
|
685
|
+
* {@code head_hash} to "changed", forcing the indexer's catalog hook
|
|
686
|
+
* through one serial {@code POST /update} per file — 175.5s / 1718 files
|
|
687
|
+
* (~102ms/file) on this repo's own shakeout. Each entry in *updates*
|
|
688
|
+
* carries the same shape as {@link #updateDocument}'s {@code fields} map
|
|
689
|
+
* plus a {@code "tumbler"} key identifying the row.
|
|
690
|
+
*
|
|
691
|
+
* <p>Executed as ONE {@code ctx.batch(...)} — i.e. one JDBC
|
|
692
|
+
* {@code Statement.addBatch()}/{@code executeBatch()} round trip to
|
|
693
|
+
* Postgres, not N sequential {@code execute()} calls. This is standard
|
|
694
|
+
* JDBC batching, the same mechanism used for heterogeneous-shape batch
|
|
695
|
+
* writes throughout the JDBC ecosystem; jOOQ's {@code batch(Query...)}
|
|
696
|
+
* groups identical-SQL queries into one {@code PreparedStatement} batch
|
|
697
|
+
* and any remaining distinct-SQL queries into one {@code Statement}
|
|
698
|
+
* batch, flushing everything via a single {@code executeBatch()} — never
|
|
699
|
+
* a per-query round trip. (An attempt at a single hand-built
|
|
700
|
+
* multi-row {@code UPDATE ... FROM (VALUES ...)} statement was tried
|
|
701
|
+
* here first and reverted: jOOQ's typed {@code DSL.values(RowN...)} API
|
|
702
|
+
* requires uniform per-column types across all rows, which this
|
|
703
|
+
* whitelist's heterogeneous optional fields can't satisfy without
|
|
704
|
+
* fighting Postgres's NULL-parameter type-inference rules; the raw-SQL
|
|
705
|
+
* {@code DSL.table("(VALUES {0})", ...)} template compiles but its
|
|
706
|
+
* `.field(...)` accessors don't resolve column metadata at all — this
|
|
707
|
+
* specific failure (a {@code NullPointerException} on the returned
|
|
708
|
+
* field) was reproduced against the real Postgres testcontainer suite
|
|
709
|
+
* below. The tests below verify functional correctness, per-entry
|
|
710
|
+
* failure isolation, and idempotency — NOT round-trip count or
|
|
711
|
+
* statement count; the "one JDBC round trip" claim for {@code
|
|
712
|
+
* ctx.batch(...)} on heterogeneous SQL is drawn from jOOQ's documented
|
|
713
|
+
* {@code batch(Query...)} behavior, not independently measured here.)
|
|
714
|
+
*
|
|
715
|
+
* <p>Per-doc failure isolation mirrors {@code register_many}: a single
|
|
716
|
+
* malformed entry (missing tumbler, non-updatable column) is excluded
|
|
717
|
+
* from the batch and marked {@code -1} in the result rather than
|
|
718
|
+
* aborting the whole call — the caller's existing per-file try/except
|
|
719
|
+
* ghost-class-isolation contract depends on partial-batch survivability.
|
|
720
|
+
*
|
|
721
|
+
* @return per-index update counts aligned 1:1 with the input list:
|
|
722
|
+
* {@code 1} updated, {@code 0} not found/tombstoned/no-op,
|
|
723
|
+
* {@code -1} malformed entry (build-time rejection, never sent).
|
|
724
|
+
*/
|
|
725
|
+
public List<Integer> updateDocumentsMany(String tenant, List<Map<String, Object>> updates) {
|
|
726
|
+
if (updates.isEmpty()) return List.of();
|
|
727
|
+
return tenantScope.withTenant(tenant, ctx -> {
|
|
728
|
+
Integer[] resultSlots = new Integer[updates.size()];
|
|
729
|
+
var queries = new ArrayList<Query>();
|
|
730
|
+
var queryIndexes = new ArrayList<Integer>(); // index into `updates` for each entry in `queries`
|
|
731
|
+
|
|
732
|
+
for (int i = 0; i < updates.size(); i++) {
|
|
733
|
+
var upd = updates.get(i);
|
|
734
|
+
Object tumblerObj = upd.get("tumbler");
|
|
735
|
+
if (!(tumblerObj instanceof String tumbler) || tumbler.isBlank()) {
|
|
736
|
+
resultSlots[i] = -1;
|
|
737
|
+
continue;
|
|
738
|
+
}
|
|
739
|
+
Map<String, Object> fields = new LinkedHashMap<>(upd);
|
|
740
|
+
fields.remove("tumbler");
|
|
741
|
+
Query query;
|
|
742
|
+
try {
|
|
743
|
+
query = buildUpdateDocumentQuery(ctx, tenant, tumbler, fields);
|
|
744
|
+
} catch (IllegalArgumentException e) {
|
|
745
|
+
resultSlots[i] = -1;
|
|
746
|
+
continue;
|
|
747
|
+
}
|
|
748
|
+
if (query == null) {
|
|
749
|
+
resultSlots[i] = 0;
|
|
750
|
+
continue;
|
|
751
|
+
}
|
|
752
|
+
queryIndexes.add(i);
|
|
753
|
+
queries.add(query);
|
|
754
|
+
}
|
|
755
|
+
if (!queries.isEmpty()) {
|
|
756
|
+
int[] batchResults = ctx.batch(queries).execute();
|
|
757
|
+
for (int q = 0; q < queryIndexes.size(); q++) {
|
|
758
|
+
resultSlots[queryIndexes.get(q)] = batchResults[q];
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
return java.util.Arrays.asList(resultSlots);
|
|
762
|
+
});
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
/**
|
|
766
|
+
* Shared SET-clause builder for {@link #updateDocument} and
|
|
767
|
+
* {@link #updateDocumentsMany} — same column whitelist, same
|
|
768
|
+
* {@code deleted_at}-strip, same {@code meta} jsonb-merge semantics.
|
|
769
|
+
* Returns {@code null} when *fields* yields no settable column (mirrors
|
|
770
|
+
* {@code updateDocument}'s 0-row short-circuit).
|
|
771
|
+
*/
|
|
772
|
+
private Query buildUpdateDocumentQuery(
|
|
773
|
+
DSLContext ctx, String tenant, String tumbler, Map<String, Object> fields
|
|
774
|
+
) {
|
|
672
775
|
for (String key : fields.keySet()) {
|
|
673
776
|
// deleted_at keeps its documented silent-strip contract (callers must use
|
|
674
777
|
// trash/restore); every OTHER unknown key is a caller error — fail loud.
|
|
@@ -678,43 +781,40 @@ public final class CatalogRepository {
|
|
|
678
781
|
+ "' (allowed: " + UPDATABLE_DOC_COLUMNS + ")");
|
|
679
782
|
}
|
|
680
783
|
}
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
continue;
|
|
706
|
-
}
|
|
707
|
-
@SuppressWarnings("unchecked")
|
|
708
|
-
Field<Object> f = (Field<Object>) DSL.field(DSL.name("catalog_documents", e.getKey()));
|
|
709
|
-
more = (more == null) ? step.set(f, e.getValue()) : more.set(f, e.getValue());
|
|
784
|
+
var step = ctx.update(CATALOG_DOCUMENTS);
|
|
785
|
+
UpdateSetMoreStep<?> more = null;
|
|
786
|
+
for (var e : fields.entrySet()) {
|
|
787
|
+
if (e.getValue() == null) continue;
|
|
788
|
+
// Strip deleted_at — must not be settable via updateDocument
|
|
789
|
+
if ("deleted_at".equals(e.getKey())) continue;
|
|
790
|
+
// metadata is a jsonb column: callers pass it as an object (or JSON
|
|
791
|
+
// string) under "meta"/"metadata". A bare set() of a Map fails with
|
|
792
|
+
// "LinkedHashMap is not supported in dialect POSTGRES"; JSON-encode and
|
|
793
|
+
// bind as jsonb, mirroring upsertDocument (RDR-168 nexus-njrcn.7).
|
|
794
|
+
// nexus-ke45f: MERGE, not replace — local Catalog.update() does
|
|
795
|
+
// dict.update (add/overwrite keys, never remove), and every
|
|
796
|
+
// writer.update(meta=...) caller (enrich write-back, catalog
|
|
797
|
+
// hook, dt stamp, remediation) is written against that
|
|
798
|
+
// contract; the bare SET silently dropped pre-existing keys
|
|
799
|
+
// in service mode. jsonb_concat == the || operator.
|
|
800
|
+
if ("meta".equals(e.getKey()) || "metadata".equals(e.getKey())) {
|
|
801
|
+
Field<String> merged = DSL.function("jsonb_concat", String.class,
|
|
802
|
+
DSL.coalesce(F_DOC_META, jsonbVal("{}")),
|
|
803
|
+
jsonbVal(jsonOrNull(e.getValue())));
|
|
804
|
+
more = (more == null)
|
|
805
|
+
? step.set(F_DOC_META, merged)
|
|
806
|
+
: more.set(F_DOC_META, merged);
|
|
807
|
+
continue;
|
|
710
808
|
}
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
809
|
+
@SuppressWarnings("unchecked")
|
|
810
|
+
Field<Object> f = (Field<Object>) DSL.field(DSL.name("catalog_documents", e.getKey()));
|
|
811
|
+
more = (more == null) ? step.set(f, e.getValue()) : more.set(f, e.getValue());
|
|
812
|
+
}
|
|
813
|
+
if (more == null) return null;
|
|
814
|
+
// AND deleted_at IS NULL: refuse to update tombstoned documents
|
|
815
|
+
return more.where(CATALOG_DOCUMENTS.TENANT_ID.eq(tenant)
|
|
816
|
+
.and(CATALOG_DOCUMENTS.TUMBLER.eq(tumbler))
|
|
817
|
+
.and(CATALOG_DOCUMENTS.DELETED_AT.isNull()));
|
|
718
818
|
}
|
|
719
819
|
|
|
720
820
|
/**
|
|
@@ -734,6 +834,38 @@ public final class CatalogRepository {
|
|
|
734
834
|
);
|
|
735
835
|
}
|
|
736
836
|
|
|
837
|
+
/**
|
|
838
|
+
* Batch-tombstone N documents in ONE round trip (nexus-xedhp follow-up:
|
|
839
|
+
* completes the update_many/register_many/delete_many batch trio).
|
|
840
|
+
*
|
|
841
|
+
* <p>Unlike {@link #updateDocumentsMany}, every row shares the identical
|
|
842
|
+
* {@code SET deleted_at = NOW()} — no per-row heterogeneous values, so a
|
|
843
|
+
* plain {@code WHERE tumbler = ANY(?)} multi-row match is both simplest
|
|
844
|
+
* and a genuine single SQL statement (no VALUES-table / batch-API
|
|
845
|
+
* ambiguity to navigate). {@code RETURNING tumbler} identifies exactly
|
|
846
|
+
* which of the input tumblers were actually tombstoned (already-deleted
|
|
847
|
+
* or non-existent tumblers are silently excluded, same as the single-doc
|
|
848
|
+
* {@link #deleteDocument}'s idempotent 0-return).
|
|
849
|
+
*
|
|
850
|
+
* @return the SET of tumblers that were tombstoned by this call (a
|
|
851
|
+
* subset of *tumblers*; order not significant — callers map
|
|
852
|
+
* membership, not position, unlike updateDocumentsMany's
|
|
853
|
+
* positional contract, since there's only one outcome shape
|
|
854
|
+
* here: deleted or not).
|
|
855
|
+
*/
|
|
856
|
+
public Set<String> deleteDocumentsMany(String tenant, List<String> tumblers) {
|
|
857
|
+
if (tumblers.isEmpty()) return Set.of();
|
|
858
|
+
return tenantScope.withTenant(tenant, ctx ->
|
|
859
|
+
new java.util.HashSet<>(ctx.update(CATALOG_DOCUMENTS)
|
|
860
|
+
.set(CATALOG_DOCUMENTS.DELETED_AT, DSL.currentOffsetDateTime())
|
|
861
|
+
.where(CATALOG_DOCUMENTS.TUMBLER.in(tumblers)
|
|
862
|
+
.and(CATALOG_DOCUMENTS.TENANT_ID.eq(tenant))
|
|
863
|
+
.and(CATALOG_DOCUMENTS.DELETED_AT.isNull()))
|
|
864
|
+
.returning(CATALOG_DOCUMENTS.TUMBLER)
|
|
865
|
+
.fetch(CATALOG_DOCUMENTS.TUMBLER))
|
|
866
|
+
);
|
|
867
|
+
}
|
|
868
|
+
|
|
737
869
|
/**
|
|
738
870
|
* FTS search over title/author/corpus/file_path using OR'd tsquery.
|
|
739
871
|
* Optionally filter by content_type. Returns up to limit results.
|
{conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/CatalogHandler.java
RENAMED
|
@@ -33,6 +33,8 @@ import java.util.*;
|
|
|
33
33
|
* GET /v1/catalog/list list documents (paginated)
|
|
34
34
|
* GET /v1/catalog/search FTS search
|
|
35
35
|
* POST /v1/catalog/update update document fields
|
|
36
|
+
* POST /v1/catalog/update_many batch-update fields for N documents (nexus-xedhp)
|
|
37
|
+
* POST /v1/catalog/delete_many batch-tombstone N documents (nexus-xedhp)
|
|
36
38
|
* DELETE /v1/catalog/delete delete document by tumbler
|
|
37
39
|
* POST /v1/catalog/link upsert link
|
|
38
40
|
* POST /v1/catalog/unlink delete link
|
|
@@ -118,7 +120,9 @@ public final class CatalogHandler implements HttpHandler {
|
|
|
118
120
|
case "/list" -> handleList(exchange, tenant, method);
|
|
119
121
|
case "/search" -> handleSearch(exchange, tenant, method);
|
|
120
122
|
case "/update" -> handleUpdate(exchange, tenant, method);
|
|
123
|
+
case "/update_many" -> handleUpdateMany(exchange, tenant, method);
|
|
121
124
|
case "/delete" -> handleDelete(exchange, tenant, method);
|
|
125
|
+
case "/delete_many" -> handleDeleteMany(exchange, tenant, method);
|
|
122
126
|
case "/resolve" -> handleResolve(exchange, tenant, method);
|
|
123
127
|
case "/stats" -> handleStats(exchange, tenant, method);
|
|
124
128
|
|
|
@@ -313,6 +317,83 @@ public final class CatalogHandler implements HttpHandler {
|
|
|
313
317
|
HttpUtil.send(exchange, 200, "{\"updated\":" + updated + "}");
|
|
314
318
|
}
|
|
315
319
|
|
|
320
|
+
/**
|
|
321
|
+
* POST /v1/catalog/update_many — batch-update N documents' mutable fields
|
|
322
|
+
* in ONE round trip (nexus-xedhp, duoak.11 follow-up).
|
|
323
|
+
*
|
|
324
|
+
* <p>Body: {"updates": [{"tumbler": "1.1.3", "head_hash": "...", ...}, ...]}
|
|
325
|
+
* Response: {"updated": [1, 1, 0, ...]} (per-entry update count, aligned
|
|
326
|
+
* 1:1 with the input — 0 means not found / tombstoned / no-op; a
|
|
327
|
+
* non-updatable-column entry is -1 (marked, not dropped) — the entry's
|
|
328
|
+
* OWN column-whitelist violation does NOT abort the rest of the batch,
|
|
329
|
+
* mirroring register_many's per-doc failure isolation. A malformed
|
|
330
|
+
* *shape* (non-list body, non-object element) is a client bug, not a
|
|
331
|
+
* per-doc data problem, and 400s rather than silently shrinking the
|
|
332
|
+
* response array — mirrors handleManifestWriteMany's review #2 fix.
|
|
333
|
+
*
|
|
334
|
+
* <p>Capped at {@value #MAX_BATCH_DOC_IDS} rows, same bind-limit rationale
|
|
335
|
+
* as register_many.
|
|
336
|
+
*/
|
|
337
|
+
@SuppressWarnings("unchecked")
|
|
338
|
+
private void handleUpdateMany(HttpExchange exchange, String tenant, String method) throws IOException {
|
|
339
|
+
if (!"POST".equals(method)) { HttpUtil.send(exchange, 405, "{\"error\":\"method not allowed\"}"); return; }
|
|
340
|
+
Map<String, Object> body = readBody(exchange);
|
|
341
|
+
Object raw = body.get("updates");
|
|
342
|
+
if (!(raw instanceof List<?> l)) {
|
|
343
|
+
HttpUtil.send(exchange, 400, "{\"error\":\"'updates' must be a list\"}"); return;
|
|
344
|
+
}
|
|
345
|
+
if (l.stream().anyMatch(o -> !(o instanceof Map))) {
|
|
346
|
+
HttpUtil.send(exchange, 400, "{\"error\":\"every 'updates' element must be an object\"}"); return;
|
|
347
|
+
}
|
|
348
|
+
List<Map<String, Object>> updates = l.stream().map(o -> (Map<String, Object>) o).toList();
|
|
349
|
+
if (updates.size() > MAX_BATCH_DOC_IDS) {
|
|
350
|
+
HttpUtil.send(exchange, 400, "{\"error\":\"too many updates (max "
|
|
351
|
+
+ MAX_BATCH_DOC_IDS + ")\"}"); return;
|
|
352
|
+
}
|
|
353
|
+
var counts = repo.updateDocumentsMany(tenant, updates);
|
|
354
|
+
HttpUtil.send(exchange, 200, MAPPER.writeValueAsString(Map.of("updated", counts)));
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* POST /v1/catalog/delete_many — batch-tombstone N documents in ONE
|
|
359
|
+
* round trip (nexus-xedhp: completes the update_many/register_many/
|
|
360
|
+
* delete_many batch trio).
|
|
361
|
+
*
|
|
362
|
+
* <p>Body: {"tumblers": ["1.1.3", "1.1.4", ...]}
|
|
363
|
+
* Response: {"deleted": ["1.1.3", ...]} (the subset of input tumblers
|
|
364
|
+
* that were actually tombstoned — already-deleted or non-existent
|
|
365
|
+
* tumblers are silently excluded, same idempotent semantics as the
|
|
366
|
+
* single-doc DELETE). NOT positionally aligned with the input (unlike
|
|
367
|
+
* update_many) — a duplicate or already-deleted tumbler collapses to
|
|
368
|
+
* one membership check; callers needing per-position outcomes should
|
|
369
|
+
* not assume this response mirrors input order/length.
|
|
370
|
+
*
|
|
371
|
+
* <p>A malformed *shape* (non-list body, non-string element) 400s
|
|
372
|
+
* rather than silently shrinking the input — mirrors
|
|
373
|
+
* handleManifestWriteMany's review #2 fix and handleUpdateMany above.
|
|
374
|
+
*
|
|
375
|
+
* <p>Capped at {@value #MAX_BATCH_DOC_IDS} rows, same bind-limit
|
|
376
|
+
* rationale as register_many / update_many.
|
|
377
|
+
*/
|
|
378
|
+
private void handleDeleteMany(HttpExchange exchange, String tenant, String method) throws IOException {
|
|
379
|
+
if (!"POST".equals(method)) { HttpUtil.send(exchange, 405, "{\"error\":\"method not allowed\"}"); return; }
|
|
380
|
+
Map<String, Object> body = readBody(exchange);
|
|
381
|
+
Object raw = body.get("tumblers");
|
|
382
|
+
if (!(raw instanceof List<?> l)) {
|
|
383
|
+
HttpUtil.send(exchange, 400, "{\"error\":\"'tumblers' must be a list\"}"); return;
|
|
384
|
+
}
|
|
385
|
+
if (l.stream().anyMatch(o -> !(o instanceof String))) {
|
|
386
|
+
HttpUtil.send(exchange, 400, "{\"error\":\"every 'tumblers' element must be a string\"}"); return;
|
|
387
|
+
}
|
|
388
|
+
List<String> tumblers = l.stream().map(o -> (String) o).toList();
|
|
389
|
+
if (tumblers.size() > MAX_BATCH_DOC_IDS) {
|
|
390
|
+
HttpUtil.send(exchange, 400, "{\"error\":\"too many tumblers (max "
|
|
391
|
+
+ MAX_BATCH_DOC_IDS + ")\"}"); return;
|
|
392
|
+
}
|
|
393
|
+
var deleted = repo.deleteDocumentsMany(tenant, tumblers);
|
|
394
|
+
HttpUtil.send(exchange, 200, MAPPER.writeValueAsString(Map.of("deleted", deleted)));
|
|
395
|
+
}
|
|
396
|
+
|
|
316
397
|
/** DELETE /v1/catalog/delete?tumbler=X */
|
|
317
398
|
private void handleDelete(HttpExchange exchange, String tenant, String method) throws IOException {
|
|
318
399
|
if (!"DELETE".equals(method) && !"POST".equals(method)) {
|
{conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/CatalogRepositoryTest.java
RENAMED
|
@@ -370,6 +370,101 @@ class CatalogRepositoryTest {
|
|
|
370
370
|
assertThat(repo.getDocument(TENANT_A, "2.9").get("title")).isEqualTo("Still Guarded");
|
|
371
371
|
}
|
|
372
372
|
|
|
373
|
+
@Test @Order(135)
|
|
374
|
+
void document_updateDocumentsMany_batchesHeterogeneousUpdatesInOneRoundTrip() {
|
|
375
|
+
// nexus-xedhp: replaces N serial writer.update() calls with one
|
|
376
|
+
// updateDocumentsMany() batch — each entry may set DIFFERENT fields
|
|
377
|
+
// (mirrors the indexer catalog hook's real per-file payload shape:
|
|
378
|
+
// head_hash is repo-wide but physical_collection/meta/source_mtime
|
|
379
|
+
// vary per file).
|
|
380
|
+
repo.upsertDocument(TENANT_A, Map.of(
|
|
381
|
+
"tumbler", "2.20", "title", "Many A", "content_type", "code",
|
|
382
|
+
"corpus", "code", "physical_collection", "code__nexus__v1"));
|
|
383
|
+
repo.upsertDocument(TENANT_A, Map.of(
|
|
384
|
+
"tumbler", "2.21", "title", "Many B", "content_type", "docs",
|
|
385
|
+
"corpus", "docs", "physical_collection", "docs__nexus__v1",
|
|
386
|
+
"metadata", Map.of("content_hash", "keepme")));
|
|
387
|
+
|
|
388
|
+
List<Integer> results = repo.updateDocumentsMany(TENANT_A, List.of(
|
|
389
|
+
Map.of("tumbler", "2.20", "head_hash", "abc123", "source_mtime", 111.0),
|
|
390
|
+
Map.of("tumbler", "2.21", "head_hash", "abc123",
|
|
391
|
+
"meta", Map.of("bib_checked", true))
|
|
392
|
+
));
|
|
393
|
+
assertThat(results).containsExactly(1, 1);
|
|
394
|
+
|
|
395
|
+
var doc20 = repo.getDocument(TENANT_A, "2.20");
|
|
396
|
+
assertThat(doc20.get("head_hash")).isEqualTo("abc123");
|
|
397
|
+
|
|
398
|
+
var doc21 = repo.getDocument(TENANT_A, "2.21");
|
|
399
|
+
assertThat(doc21.get("head_hash")).isEqualTo("abc123");
|
|
400
|
+
@SuppressWarnings("unchecked")
|
|
401
|
+
Map<String, Object> meta21 = (Map<String, Object>) doc21.get("metadata");
|
|
402
|
+
assertThat(meta21.get("content_hash")).as("meta merge semantics preserved in batch path").isEqualTo("keepme");
|
|
403
|
+
assertThat(meta21.get("bib_checked")).isEqualTo(true);
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
@Test @Order(136)
|
|
407
|
+
void document_updateDocumentsMany_isolatesPerEntryFailures() {
|
|
408
|
+
// A malformed entry (missing tumbler, non-updatable column) must not
|
|
409
|
+
// abort the rest of the batch — mirrors register_many's per-doc
|
|
410
|
+
// failure isolation, which the indexer's catalog hook depends on.
|
|
411
|
+
repo.upsertDocument(TENANT_A, Map.of(
|
|
412
|
+
"tumbler", "2.22", "title", "Survivor", "content_type", "code",
|
|
413
|
+
"corpus", "code"));
|
|
414
|
+
|
|
415
|
+
List<Integer> results = repo.updateDocumentsMany(TENANT_A, java.util.Arrays.asList(
|
|
416
|
+
Map.of("no_tumbler_key", "x"),
|
|
417
|
+
Map.of("tumbler", "2.22", "head_hash", "def456"),
|
|
418
|
+
Map.of("tumbler", "2.999-does-not-exist", "head_hash", "def456"),
|
|
419
|
+
Map.of("tumbler", "2.22", "no_such_column", "y")
|
|
420
|
+
));
|
|
421
|
+
assertThat(results).containsExactly(-1, 1, 0, -1);
|
|
422
|
+
|
|
423
|
+
var doc = repo.getDocument(TENANT_A, "2.22");
|
|
424
|
+
assertThat(doc.get("head_hash")).isEqualTo("def456");
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
@Test @Order(137)
|
|
428
|
+
void document_updateDocumentsMany_emptyListReturnsEmpty() {
|
|
429
|
+
assertThat(repo.updateDocumentsMany(TENANT_A, List.of())).isEmpty();
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
@Test @Order(138)
|
|
433
|
+
void document_deleteDocumentsMany_tombstonesInOneRoundTrip() {
|
|
434
|
+
// nexus-xedhp: completes the update_many/register_many/delete_many
|
|
435
|
+
// batch trio — replaces N serial writer.delete_document() calls.
|
|
436
|
+
repo.upsertDocument(TENANT_A, Map.of(
|
|
437
|
+
"tumbler", "2.30", "title", "Del A", "content_type", "code", "corpus", "code"));
|
|
438
|
+
repo.upsertDocument(TENANT_A, Map.of(
|
|
439
|
+
"tumbler", "2.31", "title", "Del B", "content_type", "code", "corpus", "code"));
|
|
440
|
+
repo.upsertDocument(TENANT_A, Map.of(
|
|
441
|
+
"tumbler", "2.32", "title", "Survivor", "content_type", "code", "corpus", "code"));
|
|
442
|
+
|
|
443
|
+
Set<String> deleted = repo.deleteDocumentsMany(
|
|
444
|
+
TENANT_A, List.of("2.30", "2.31", "2.999-does-not-exist"));
|
|
445
|
+
|
|
446
|
+
assertThat(deleted).containsExactlyInAnyOrder("2.30", "2.31");
|
|
447
|
+
assertThat(repo.getDocument(TENANT_A, "2.30")).isNull();
|
|
448
|
+
assertThat(repo.getDocument(TENANT_A, "2.31")).isNull();
|
|
449
|
+
assertThat(repo.getDocument(TENANT_A, "2.32")).isNotNull();
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
@Test @Order(139)
|
|
453
|
+
void document_deleteDocumentsMany_idempotentOnAlreadyTombstoned() {
|
|
454
|
+
repo.upsertDocument(TENANT_A, Map.of(
|
|
455
|
+
"tumbler", "2.33", "title", "Once", "content_type", "code", "corpus", "code"));
|
|
456
|
+
repo.deleteDocument(TENANT_A, "2.33");
|
|
457
|
+
|
|
458
|
+
Set<String> deleted = repo.deleteDocumentsMany(TENANT_A, List.of("2.33"));
|
|
459
|
+
|
|
460
|
+
assertThat(deleted).as("already-tombstoned tumbler is not re-reported as deleted").isEmpty();
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
@Test @Order(140)
|
|
464
|
+
void document_deleteDocumentsMany_emptyListReturnsEmpty() {
|
|
465
|
+
assertThat(repo.deleteDocumentsMany(TENANT_A, List.of())).isEmpty();
|
|
466
|
+
}
|
|
467
|
+
|
|
373
468
|
@Test @Order(14)
|
|
374
469
|
void document_delete() {
|
|
375
470
|
repo.upsertDocument(TENANT_A, Map.of(
|