mirror of https://codeberg.org/pzp/pzp-goals.git
crossGoalWithTangle when doing getByRec
This commit is contained in:
parent
2c31231a92
commit
90fff89910
48
lib/index.js
48
lib/index.js
|
@ -3,18 +3,22 @@ const Obz = require('obz')
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @typedef {import('ppppp-db/msg-v3').RecPresent} RecPresent
|
* @typedef {import('ppppp-db/msg-v3').RecPresent} RecPresent
|
||||||
|
* @typedef {import('ppppp-db').Tangle} Tangle
|
||||||
*
|
*
|
||||||
|
* @typedef {'none'} GoalNone
|
||||||
* @typedef {'all'} GoalAll
|
* @typedef {'all'} GoalAll
|
||||||
* @typedef {`newest-${number}`} GoalNewest
|
* @typedef {`newest-${number}`} GoalNewest
|
||||||
* @typedef {`oldest-${number}`} GoalOldest
|
* @typedef {`oldest-${number}`} GoalOldest
|
||||||
* @typedef {GoalAll|GoalNewest|GoalOldest} GoalDSL
|
* @typedef {GoalNone|GoalAll|GoalNewest|GoalOldest} GoalDSL
|
||||||
|
*
|
||||||
|
* @typedef {[number, number]} Range
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class Goal {
|
class Goal {
|
||||||
/** @type {string} */
|
/** @type {string} */
|
||||||
#id
|
#id
|
||||||
|
|
||||||
/** @type {'all' | 'newest' | 'oldest'} */
|
/** @type {'none' | 'all' | 'newest' | 'oldest'} */
|
||||||
#type
|
#type
|
||||||
|
|
||||||
/** @type {number} */
|
/** @type {number} */
|
||||||
|
@ -27,6 +31,13 @@ class Goal {
|
||||||
*/
|
*/
|
||||||
constructor(tangleID, goalDSL) {
|
constructor(tangleID, goalDSL) {
|
||||||
this.#id = tangleID
|
this.#id = tangleID
|
||||||
|
|
||||||
|
if (goalDSL === 'none') {
|
||||||
|
this.#type = 'all'
|
||||||
|
this.#count = 0
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if (goalDSL === 'all') {
|
if (goalDSL === 'all') {
|
||||||
this.#type = 'all'
|
this.#type = 'all'
|
||||||
this.#count = Infinity
|
this.#count = Infinity
|
||||||
|
@ -79,7 +90,33 @@ module.exports = {
|
||||||
const goals = new Map()
|
const goals = new Map()
|
||||||
const listen = Obz()
|
const listen = Obz()
|
||||||
|
|
||||||
|
/** @type {Range} */
|
||||||
|
const EMPTY_RANGE = [1, 0]
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @private
|
||||||
|
* @param {Goal} goal
|
||||||
|
* @param {Tangle} tangle
|
||||||
|
* @returns {Range}
|
||||||
|
*/
|
||||||
|
function crossGoalWithTangle(goal, tangle) {
|
||||||
|
const maxDepth = tangle.maxDepth
|
||||||
|
switch (goal.type) {
|
||||||
|
case 'none':
|
||||||
|
return EMPTY_RANGE
|
||||||
|
case 'all':
|
||||||
|
return [0, maxDepth]
|
||||||
|
case 'newest':
|
||||||
|
const start = Math.max(0, maxDepth - goal.count)
|
||||||
|
return [start, maxDepth]
|
||||||
|
case 'oldest':
|
||||||
|
const end = Math.min(maxDepth, goal.count)
|
||||||
|
return [0, end]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @public
|
||||||
* @param {string} tangleID
|
* @param {string} tangleID
|
||||||
* @param {GoalDSL} goalDSL
|
* @param {GoalDSL} goalDSL
|
||||||
* @returns {void}
|
* @returns {void}
|
||||||
|
@ -114,7 +151,12 @@ module.exports = {
|
||||||
for (const tangleID in rec.msg.metadata.tangles) {
|
for (const tangleID in rec.msg.metadata.tangles) {
|
||||||
if (goals.has(tangleID)) {
|
if (goals.has(tangleID)) {
|
||||||
const goal = /** @type {Goal} */ (goals.get(tangleID))
|
const goal = /** @type {Goal} */ (goals.get(tangleID))
|
||||||
arr.push(goal)
|
const tangle = peer.db.getTangle(tangleID)
|
||||||
|
if (tangle) {
|
||||||
|
const [min, max] = crossGoalWithTangle(goal, tangle)
|
||||||
|
const depth = tangle.getDepth(rec.id)
|
||||||
|
if (depth >= 0 && min <= depth && depth <= max) arr.push(goal)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -89,11 +89,17 @@ test('getByRec', async (t) => {
|
||||||
const gottenGoal = alice.goals.getByID(feedID)
|
const gottenGoal = alice.goals.getByID(feedID)
|
||||||
assert.strictEqual(gottenGoal.id, feedID, 'gotten goal id is correct')
|
assert.strictEqual(gottenGoal.id, feedID, 'gotten goal id is correct')
|
||||||
|
|
||||||
const recGoals = alice.goals.getByRec(post1)
|
const recGoals = alice.goals.getByRec(post2)
|
||||||
assert(Array.isArray(recGoals), 'recGoals is an array')
|
assert(Array.isArray(recGoals), 'recGoals is an array')
|
||||||
assert.strictEqual(recGoals.length, 1, 'recGoals has one item')
|
assert.strictEqual(recGoals.length, 1, 'recGoals has one item')
|
||||||
const recGoal = recGoals[0]
|
const recGoal = recGoals[0]
|
||||||
assert.strictEqual(recGoal.id, feedID, 'recGoal id is correct')
|
assert.strictEqual(recGoal.id, feedID, 'recGoal id is correct')
|
||||||
|
|
||||||
|
alice.goals.set(feedID, 'oldest-1')
|
||||||
|
assert('set goal to oldest-1')
|
||||||
|
const recGoals2 = alice.goals.getByRec(post2)
|
||||||
|
assert(Array.isArray(recGoals2), 'recGoals is an array')
|
||||||
|
assert.strictEqual(recGoals2.length, 0, 'recGoals2 has zero items')
|
||||||
|
|
||||||
await p(alice.close)(true)
|
await p(alice.close)(true)
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue