change getDeletablesAndErasables return type

This commit is contained in:
Andre Staltz 2023-09-20 14:47:23 +03:00
parent 385b34dbd6
commit 0d9ce50cfe
No known key found for this signature in database
GPG Key ID: 9EDE23EA7E8A4890
2 changed files with 32 additions and 16 deletions

View File

@ -83,23 +83,39 @@ class DBTangle extends MsgV3.Tangle {
} }
/** /**
* Given a set of msgs (`msgIDs`) in this tangle, find all "deletable" and
* "erasable" msgs that precede that set.
*
* *Deletables* are msgs that precede `msgsIDs` but are not important in any
* validation path toward the root, and thus can be deleted.
*
* *Erasables* are msgs that precede `msgsIDs` and can be erased without
* losing a validation path toward the root.
* @param {Array<string>} msgIDs * @param {Array<string>} msgIDs
* @returns {{ deletables: Set<string>, erasables: Set<string> }}
*/ */
getDeletablesAndErasables(...msgIDs) { getDeletablesAndErasables(...msgIDs) {
const erasableSet = new Set() // Determine erasables
const erasables = new Set()
const minimum = this.getMinimumAmong(msgIDs) const minimum = this.getMinimumAmong(msgIDs)
for (const msgID of minimum) { for (const msgID of minimum) {
const trail = this.shortestPathToRoot(msgID) const trail = this.shortestPathToRoot(msgID)
for (const id of trail) { for (const id of trail) {
erasableSet.add(id) erasables.add(id)
} }
} }
// Determine deletables
const deletables = new Set()
const sorted = this.topoSort() const sorted = this.topoSort()
const deletables = sorted.filter( for (const msgID of sorted) {
(id) => if (erasables.has(msgID)) continue
!erasableSet.has(id) && minimum.some((min) => this.precedes(id, min)) if (minimum.some((min) => this.precedes(msgID, min))) {
) deletables.add(msgID)
return { deletables, erasables: [...erasableSet] } }
}
return { deletables, erasables }
} }
} }
@ -929,7 +945,7 @@ function initDB(peer, config) {
/** /**
* @param {string} tangleID * @param {string} tangleID
* @returns {Tangle} * @returns {DBTangle}
*/ */
function getTangle(tangleID) { function getTangle(tangleID) {
return new DBTangle(tangleID, records()) return new DBTangle(tangleID, records())

View File

@ -204,8 +204,8 @@ test('Tangle.getLipmaaSet', (t) => {
test('Tangle.getDeletablesAndErasables basic', (t) => { test('Tangle.getDeletablesAndErasables basic', (t) => {
const { deletables, erasables } = tangle.getDeletablesAndErasables(reply2) const { deletables, erasables } = tangle.getDeletablesAndErasables(reply2)
assert.deepEqual(deletables, [reply1Hi], 'deletables') assert.deepEqual([...deletables], [reply1Hi], 'deletables')
assert.deepEqual(erasables, [reply1Lo, rootPost], 'erasables') assert.deepEqual([...erasables], [reply1Lo, rootPost], 'erasables')
}) })
test('Tangle.getDeletablesAndErasables with many inputs', (t) => { test('Tangle.getDeletablesAndErasables with many inputs', (t) => {
@ -214,8 +214,8 @@ test('Tangle.getDeletablesAndErasables with many inputs', (t) => {
reply2 reply2
) )
assert.deepEqual(deletables, [reply1Hi], 'deletables') assert.deepEqual([...deletables], [reply1Hi], 'deletables')
assert.deepEqual(erasables, [reply1Lo, rootPost], 'erasables') assert.deepEqual([...erasables], [reply1Lo, rootPost], 'erasables')
}) })
test('Tangle.getDeletablesAndErasables with many inputs again', (t) => { test('Tangle.getDeletablesAndErasables with many inputs again', (t) => {
@ -224,15 +224,15 @@ test('Tangle.getDeletablesAndErasables with many inputs again', (t) => {
reply3Hi reply3Hi
) )
assert.deepEqual(deletables, [reply1Lo, reply1Hi, reply2], 'deletables') assert.deepEqual([...deletables], [reply1Lo, reply1Hi, reply2], 'deletables')
assert.deepEqual(erasables, [rootPost], 'erasables') assert.deepEqual([...erasables], [rootPost], 'erasables')
}) })
test('Tangle.getDeletablesAndErasables with lipmaa', (t) => { test('Tangle.getDeletablesAndErasables with lipmaa', (t) => {
const { deletables, erasables } = tangle.getDeletablesAndErasables(reply3Lo) const { deletables, erasables } = tangle.getDeletablesAndErasables(reply3Lo)
assert.deepEqual(deletables, [reply1Lo, reply1Hi, reply2], 'deletables') assert.deepEqual([...deletables], [reply1Lo, reply1Hi, reply2], 'deletables')
assert.deepEqual(erasables, [rootPost], 'erasables') assert.deepEqual([...erasables], [rootPost], 'erasables')
}) })
test('Tangle.getMinimumAmong', (t) => { test('Tangle.getMinimumAmong', (t) => {