feat(8.0)!: delete fork/branch/commit/history/versions — superseded by the Db API
The COW version-control surface (fork, branches, checkout, commit,
getHistory/streamHistory, asOfCommit, brain.versions) is gone, along with
its subsystems: src/versioning/, the COW object store (CommitLog,
CommitObject, RefManager, TreeObject), HistoricalStorageAdapter, and the
TypeAwareHNSWIndex path it kept alive. The Db API (now/transact/asOf/
with/persist/restore) is the one versioning model in 8.0.
Survivors and replacements:
- BlobStorage survives (the VFS stores file content through it), relocated
to src/storage/blobStorage.ts with binaryDataCodec.ts; its adapter
interface is now BlobStoreAdapter, slimmed to the consumed surface
(write/read/has/delete/getMetadata + MIME-aware compression policy).
- brain.migrate() backup branches are replaced by persist-before-migrate:
MigrateOptions.backupTo persists a hard-link snapshot of the current
generation before any transform runs; MigrationResult.backupPath reports
it, and brain.restore(path) brings it back wholesale.
- CLI: cow.ts (fork/branch/checkout/history/migrate) is replaced by
snapshot.ts — snapshot <path>, restore <path>, history (tx-log),
generation.
- New public read API: brain.transactionLog({limit}) exposes the reified
tx-log (generation/timestamp/meta, newest first) that backs the CLI
history command; TxLogEntry is exported.
Tests: superseded suites deleted; fork/commit blocks excised from shared
suites; BlobStorage tests relocated + reworked against the slimmed store;
migration tests now prove the backupTo snapshot/restore round trip; new
transactionLog coverage in db-mvcc.
This commit is contained in:
parent
431cd64406
commit
8f93add705
64 changed files with 1444 additions and 16313 deletions
|
|
@ -1,9 +1,8 @@
|
|||
/**
|
||||
* Storage-Level Batch Operations Test Suite v5.12.0
|
||||
*
|
||||
* Comprehensive testing of new storage-level batch APIs:
|
||||
* Comprehensive testing of storage-level batch APIs:
|
||||
* - storage.getNounMetadataBatch() - Batch metadata reads
|
||||
* - storage.readBatchWithInheritance() - COW-aware batch reads
|
||||
* - storage.getVerbsBySourceBatch() - Batch relationship queries
|
||||
* - brain.batchGet() - High-level batch entity retrieval
|
||||
* - PathResolver.getChildren() - VFS batch operations
|
||||
|
|
@ -11,10 +10,8 @@
|
|||
* Coverage:
|
||||
* ✅ Type-aware storage compatibility
|
||||
* ✅ Sharding preservation
|
||||
* ✅ COW (Copy-on-Write) integration
|
||||
* ✅ fork() and branch isolation
|
||||
* ✅ Write-cache coherence
|
||||
* ✅ Performance improvements (N+1 → batched)
|
||||
* ✅ Cloud adapter native batch APIs
|
||||
*/
|
||||
|
||||
import { describe, it, expect, beforeEach, afterEach } from 'vitest'
|
||||
|
|
@ -129,13 +126,13 @@ describe('Storage-Level Batch Operations v5.12.0', () => {
|
|||
})
|
||||
|
||||
describe('storage.getNounMetadataBatch() - Storage Layer', () => {
|
||||
it('should batch fetch noun metadata with type caching', async () => {
|
||||
it('should batch fetch noun metadata across types via ID-first paths', async () => {
|
||||
// Add entities of different types
|
||||
const id1 = await brain.add({ type: 'document', data: 'Doc' })
|
||||
const id2 = await brain.add({ type: 'thing', data: 'Thing' })
|
||||
const id3 = await brain.add({ type: 'person', data: 'Person' })
|
||||
|
||||
// Access storage directly
|
||||
// Access storage directly (8.0 layout: ID-first paths, no type lookup)
|
||||
const storage = brain.storage as any
|
||||
const results = await storage.getNounMetadataBatch([id1, id2, id3])
|
||||
|
||||
|
|
@ -143,32 +140,18 @@ describe('Storage-Level Batch Operations v5.12.0', () => {
|
|||
expect(results.get(id1)?.noun).toBe('document')
|
||||
expect(results.get(id2)?.noun).toBe('thing')
|
||||
expect(results.get(id3)?.noun).toBe('person')
|
||||
|
||||
// Type cache should be populated
|
||||
expect(storage.nounTypeCache.has(id1)).toBe(true)
|
||||
expect(storage.nounTypeCache.get(id1)).toBe('document')
|
||||
})
|
||||
|
||||
it('should handle uncached IDs by trying multiple types', async () => {
|
||||
// Add entity
|
||||
it('should omit missing ids from the result map', async () => {
|
||||
const id = await brain.add({ type: 'document', data: 'Test' })
|
||||
const missing = '00000000-0000-4000-8000-000000000000'
|
||||
|
||||
// Clear type cache to simulate uncached scenario
|
||||
const storage = brain.storage as any
|
||||
storage.nounTypeCache.delete(id)
|
||||
|
||||
// Batch fetch should still work (tries all types)
|
||||
const results = await storage.getNounMetadataBatch([id])
|
||||
const results = await storage.getNounMetadataBatch([id, missing])
|
||||
|
||||
expect(results.size).toBe(1)
|
||||
expect(results.get(id)?.noun).toBe('document')
|
||||
|
||||
// Cache should be repopulated (or may still be empty if metadata doesn't populate it)
|
||||
// This is acceptable as long as the data is retrieved correctly
|
||||
const cachedType = storage.nounTypeCache.get(id)
|
||||
if (cachedType !== undefined) {
|
||||
expect(cachedType).toBe('document')
|
||||
}
|
||||
expect(results.has(missing)).toBe(false)
|
||||
})
|
||||
|
||||
it('should preserve sharding in all paths', async () => {
|
||||
|
|
@ -212,32 +195,7 @@ describe('Storage-Level Batch Operations v5.12.0', () => {
|
|||
})
|
||||
})
|
||||
|
||||
describe('COW Integration - readBatchWithInheritance()', () => {
|
||||
it('should resolve branch paths before reading', async () => {
|
||||
// Add entity on main
|
||||
const id = await brain.add({ type: 'document', data: 'Main branch' })
|
||||
|
||||
// Create fork
|
||||
const fork = await brain.fork('test-branch')
|
||||
|
||||
// Add entity on fork
|
||||
const forkId = await fork.add({ type: 'document', data: 'Fork branch' })
|
||||
|
||||
// Batch get on fork should see fork entity
|
||||
const forkResults = await fork.batchGet([forkId, id])
|
||||
|
||||
expect(forkResults.size).toBe(2)
|
||||
expect(forkResults.get(forkId)?.data).toBe('Fork branch')
|
||||
expect(forkResults.get(id)?.data).toBe('Main branch') // Inherited
|
||||
|
||||
// Batch get on main should NOT see fork entity
|
||||
const mainResults = await brain.batchGet([forkId, id])
|
||||
|
||||
expect(mainResults.size).toBe(1)
|
||||
expect(mainResults.has(forkId)).toBe(false) // Not on main
|
||||
expect(mainResults.get(id)?.data).toBe('Main branch')
|
||||
})
|
||||
|
||||
describe('Write-cache coherence', () => {
|
||||
it('should respect write cache for dirty entities', async () => {
|
||||
// Add entity
|
||||
const id = await brain.add({ type: 'document', data: 'Original' })
|
||||
|
|
@ -250,29 +208,6 @@ describe('Storage-Level Batch Operations v5.12.0', () => {
|
|||
|
||||
expect(results.get(id)?.data).toBe('Updated')
|
||||
})
|
||||
|
||||
it('should inherit from parent commits for missing entities', async () => {
|
||||
// Add entities on main
|
||||
const id1 = await brain.add({ type: 'document', data: 'Main 1' })
|
||||
const id2 = await brain.add({ type: 'document', data: 'Main 2' })
|
||||
|
||||
// Commit
|
||||
await brain.commit('Initial entities')
|
||||
|
||||
// Create fork
|
||||
const fork = await brain.fork('child-branch')
|
||||
|
||||
// Add new entity only on fork
|
||||
const forkId = await fork.add({ type: 'document', data: 'Fork only' })
|
||||
|
||||
// Batch get on fork should inherit main entities
|
||||
const results = await fork.batchGet([id1, id2, forkId])
|
||||
|
||||
expect(results.size).toBe(3)
|
||||
expect(results.get(id1)?.data).toBe('Main 1') // Inherited
|
||||
expect(results.get(id2)?.data).toBe('Main 2') // Inherited
|
||||
expect(results.get(forkId)?.data).toBe('Fork only') // Fork's own
|
||||
})
|
||||
})
|
||||
|
||||
describe('getVerbsBySourceBatch() - Batch Relationship Queries', () => {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue