random-slicing
Version:
resizable hashing strategy for large-scale storage
112 lines (107 loc) • 2.53 kB
JavaScript
var test = require('tape')
var rat = require('bigint-rational')
var RSlice = require('../')
var calcMoves = require('./lib/move.js')
var valid = require('./lib/valid.js')
var tmpr0 = [0n,1n]
var tmpr1 = [0n,1n]
test('check move calculation', function (t) {
var prev = new RSlice({
A: {
size: 10,
slices: [[[0n,1n],[1n,7n]],[[87n,364n],[1n,4n]]]
},
B: {
size: 15,
slices: [[[1n,2n],[19n,26n]]]
},
C: {
size: 20,
slices: [
[[5n,28n],[3n,14n]],
[[5n,23n],[87n,364n]],
[[1n,3n],[5n,12n]],
[[5n,6n],[1n,1n]]
]
},
D: {
size: 20,
slices: [
[[1n,7n],[5n,28n]],
[[3n,14n],[5n,23n]],
[[1n,4n],[1n,3n]],
[[5n,12n],[1n,2n]],
[[19n,26n],[5n,6n]]
]
}
})
var cur = new RSlice({
A: {
size: 10,
slices: [[[0n,1n],[2n,17n]]]
},
B: {
size: 15,
slices: [[[1n,2n],[23n,34n]]]
},
C: {
size: 40,
slices: [
[[2n,17n],[1n,4n]],
[[397n,1326n],[5n,12n]],
[[23n,34n],[19n,26n]],
[[5n,6n],[1n,1n]]
]
},
D: {
size: 20,
slices: [
[[1n,4n],[397n,1326n]],
[[5n,12n],[1n,2n]],
[[19n,26n],[5n,6n]]
]
}
})
var moves = calcMoves(prev,cur)
t.deepEqual(moves, [23235n,142324n], 'expected move ratio')
t.end()
})
test('moves', function (t) {
var rs = new RSlice
rs.set({ A: 20, B: 20, C: 20, D: 20 })
var ops = [
{ A: 10 }, // shrink
{ B: 15 }, // shrink
{ C: 40 }, // grow
{ B: 12 }, // shrink
{ D: 17 }, // shrink
{ A: 5 }, // shrink
{ B: 25 } // grow
]
ops.forEach(function (op) {
var prev = new RSlice(rs.getBins())
var prevTotal = 0
var bins = rs.getBins()
Object.keys(bins).forEach(function (key) {
prevTotal += bins[key].size
})
var newTotal = prevTotal
Object.keys(op).forEach(function (key) {
newTotal += op[key] - bins[key].size
})
var expected = [0n,1n]
Object.keys(op).forEach(function (key) {
rat.set(tmpr0, bins[key].size, prevTotal)
rat.set(tmpr1, op[key], newTotal)
rat.subtract(tmpr0, tmpr0, tmpr1)
rat.abs(tmpr0, tmpr0)
rat.add(expected, expected, tmpr0)
})
rat.reduce(expected, expected)
rs.set(op)
var moved = calcMoves(prev, rs)
t.deepEqual(moved, expected, `moved for ${JSON.stringify(op)}`)
t.ifError(valid(rs), `valid after ${JSON.stringify(op)}`)
})
t.end()
})