mirror of https://codeberg.org/pzp/pzp-db.git
change getDeletablesAndErasables return type
This commit is contained in:
parent
385b34dbd6
commit
0d9ce50cfe
32
lib/index.js
32
lib/index.js
|
@ -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())
|
||||||
|
|
|
@ -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) => {
|
||||||
|
|
Loading…
Reference in New Issue