Comparing version 1.1.1 to 2.0.0
101
index.js
@@ -14,6 +14,11 @@ 'use strict' | ||
module.exports = function (ipfs, BUCKET_SIZE) { | ||
var Iterator = function (over, filter, reverse) { | ||
var stack = [{obj: over, idx: reverse ? -1 : 0}] | ||
var fullfilter = makefilter(filter) | ||
var Iterator = function (over, opts) { | ||
if (!opts) opts = {} | ||
var reverse = opts.reverse ? true : false | ||
var fullfilter = makefilter(opts.filter) | ||
var offset = opts.offset || 0 | ||
var stack = [{obj: over}] | ||
return { | ||
@@ -23,6 +28,18 @@ pushcount: 0, | ||
var self = this | ||
// get element from top of stack | ||
if (!stack[0].idx) { | ||
if (offset) { | ||
var idxRest = stack[0].obj.offset(offset) | ||
stack[0].idx = idxRest[0] | ||
offset = idxRest[1] | ||
} else { | ||
stack[0].idx = reverse ? -1 : 0 | ||
} | ||
} | ||
stack[0].obj.get(stack[0].idx, fullfilter, function (err, element, status) { | ||
if (err) return cb(err) | ||
if (status === EOF) { | ||
// console.log('pop') | ||
stack.shift() | ||
@@ -34,9 +51,12 @@ // toplevel eof? | ||
} else if (status === SKIP) { | ||
// console.log('skip') | ||
reverse ? stack[0].idx-- : stack[0].idx++ | ||
self.next(cb) | ||
} else if (typeof element.get === 'function') { | ||
// console.log('get') | ||
self.pushcount++ | ||
stack.unshift({obj: element, idx: reverse ? -1 : 0}) | ||
stack.unshift({obj: element}) | ||
self.next(cb) | ||
} else { // leaf | ||
// console.log('leaf') | ||
reverse ? stack[0].idx-- : stack[0].idx++ | ||
@@ -98,4 +118,8 @@ cb(null, element) | ||
}, | ||
offset: function (ofs) { | ||
return [0, ofs] | ||
}, | ||
get: function (idx, filter, cb) { | ||
var self = this | ||
if (idx === 0 || idx === -1) { | ||
@@ -148,2 +172,5 @@ if (!subsetMatches(self.filters, filter.blooms)) { | ||
}, | ||
offset: function (ofs) { | ||
return [ofs, 0] | ||
}, | ||
filter: function () { | ||
@@ -163,5 +190,7 @@ var filter = {} | ||
get: function (idx, filter, cb) { | ||
if (idx < 0) { | ||
idx += this.elements.length | ||
} | ||
var el = this.elements[idx] | ||
@@ -176,8 +205,5 @@ if (typeof el === 'undefined') return cb(null, null, EOF) | ||
}, | ||
iterator: function (filter) { | ||
return new Iterator(this, filter) | ||
iterator: function (opts) { | ||
return new Iterator(this, opts) | ||
}, | ||
reverseIterator: function (filter) { | ||
return new Iterator(this, filter, true) | ||
}, | ||
persist: function (cb) { | ||
@@ -226,2 +252,10 @@ var self = this | ||
}, | ||
offset: function (ofs) { | ||
var idx = 0 | ||
while (this.refs[(idx + 1)] && this.refs[idx].count <= ofs) { | ||
ofs -= this.refs[idx].count | ||
idx++ | ||
} | ||
return [idx, ofs] | ||
}, | ||
get: function (idx, filter, cb) { | ||
@@ -238,8 +272,5 @@ if (idx < 0) { | ||
}, | ||
iterator: function (filter) { | ||
return new Iterator(this, filter) | ||
iterator: function (opts) { | ||
return new Iterator(this, opts) | ||
}, | ||
reverseIterator: function (filter) { | ||
return new Iterator(this, filter, true) | ||
}, | ||
persist: function (cb) { | ||
@@ -317,2 +348,35 @@ var self = this | ||
}, | ||
offset: function (ofs) { | ||
// console.log('finger ofs') | ||
// console.log(ofs) | ||
// if (ofs < 0) { | ||
// ofs += this.count | ||
// } | ||
// console.log(this.count) | ||
// console.log(ofs) | ||
var idx = 0 | ||
if (this.head.count < ofs) { | ||
ofs -= this.head.count | ||
idx++ | ||
} else { | ||
return [idx, ofs] | ||
} | ||
if (this.rest.count < ofs) { | ||
ofs -= this.rest.count | ||
idx++ | ||
} else { | ||
return [idx, ofs] | ||
} | ||
if (this.tail.count < ofs) { | ||
ofs -= this.tail.count | ||
idx++ | ||
} | ||
return [idx, ofs] | ||
}, | ||
get: function (idx, filter, cb) { | ||
@@ -324,8 +388,5 @@ if (idx === 0 || idx === -3) return cb(null, head) | ||
}, | ||
iterator: function (filter) { | ||
return new Iterator(this, filter) | ||
iterator: function (opts) { | ||
return new Iterator(this, opts) | ||
}, | ||
reverseIterator: function (filter) { | ||
return new Iterator(this, filter, true) | ||
}, | ||
persist: function (cb) { | ||
@@ -332,0 +393,0 @@ var self = this |
{ | ||
"name": "aolog", | ||
"version": "1.1.1", | ||
"version": "2.0.0", | ||
"description": "Append only log", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
'use strict' | ||
var assert = require('assert') | ||
var BUCKET_SIZE = 16 | ||
var BUCKET_SIZE = 2 | ||
var ipfs = require('ipfs-api')() | ||
@@ -126,3 +126,3 @@ var aolog = require('../index.js')(ipfs, BUCKET_SIZE) | ||
var SIZE = BUCKET_SIZE * 8 | ||
var SIZE = BUCKET_SIZE + 1 | ||
@@ -213,2 +213,55 @@ var log | ||
}) | ||
var SIZE = BUCKET_SIZE * 64 | ||
var log | ||
var reference = [] | ||
before(function (done) { | ||
add_many(aolog.empty(), SIZE, | ||
function (i) { | ||
reference.push(i) | ||
return i | ||
}, | ||
function (err, res) { | ||
if (err) throw err | ||
log = res | ||
done() | ||
}) | ||
}) | ||
// helper | ||
function range (from, to) { | ||
var arr = [] | ||
while (from != to) { | ||
arr.push(from++) | ||
} | ||
return arr | ||
} | ||
it('should take all from all offsets', function (done) { | ||
var count = 0 | ||
_.map(range(0, SIZE), function (ofs) { | ||
var iter = log.iterator({offset: ofs}) | ||
count++ | ||
iter.all(function (err, array) { | ||
if (err) throw err | ||
assert.deepEqual(array, reference.slice(ofs)) | ||
if (!--count) done() | ||
}) | ||
}) | ||
}) | ||
it('should take 1 from all offsets', function (done) { | ||
var count = 0 | ||
_.map(range(0, SIZE), function (ofs) { | ||
var iter = log.iterator({offset: ofs}) | ||
iter.next(function (err, res) { | ||
if (err) throw err | ||
assert.deepEqual(res, reference[ofs]) | ||
if (++count === SIZE) done() | ||
}) | ||
}) | ||
}) | ||
}) | ||
@@ -218,3 +271,3 @@ | ||
var log | ||
var SIZE = BUCKET_SIZE | ||
var SIZE = BUCKET_SIZE * 5 | ||
var expected = [] | ||
@@ -237,4 +290,4 @@ | ||
before(function (done) { | ||
var iter = log.reverseIterator() | ||
it('should have gotten the right elements', function (done) { | ||
var iter = log.iterator({reverse: true}) | ||
async.forever(function (next) { | ||
@@ -248,10 +301,8 @@ iter.next(function (err, value, status) { | ||
}) | ||
}, function () { done() }) | ||
}, function () { | ||
assert.deepEqual(expected, result) | ||
done() | ||
}) | ||
}) | ||
it('should have gotten the right elements', function () { | ||
assert.deepEqual(expected, result) | ||
}) | ||
var nr = Math.floor(SIZE/3) | ||
@@ -261,3 +312,3 @@ var resultPart = [] | ||
before(function (done) { | ||
var iter = log.reverseIterator() | ||
var iter = log.iterator({reverse: true}) | ||
@@ -278,3 +329,3 @@ iter.take(nr, function (err, array) { | ||
before(function (done) { | ||
var iter = log.reverseIterator() | ||
var iter = log.iterator({reverse: true}) | ||
@@ -295,3 +346,3 @@ iter.take(SIZE * 2, function (err, array) { | ||
before(function (done) { | ||
var iter = log.reverseIterator() | ||
var iter = log.iterator({reverse: true}) | ||
@@ -358,3 +409,3 @@ iter.all(function (err, array) { | ||
before(function (done) { | ||
var iter = log.iterator({msg: 'buzz'}) | ||
var iter = log.iterator({filter: {msg: 'buzz'}}) | ||
async.forever(function (next) { | ||
@@ -365,2 +416,3 @@ iter.next(function (err, value, status) { | ||
count++ | ||
if (!value.msg.match('buzz')) { | ||
@@ -406,3 +458,3 @@ throw 'no buzz!' | ||
before(function (done) { | ||
var iter = log.iterator({is: 'needle'}) | ||
var iter = log.iterator({filter: {is: 'needle'}}) | ||
@@ -522,3 +574,3 @@ async.forever(function (next) { | ||
var SIZE = 10000 | ||
var SIZE = 1000 | ||
@@ -529,3 +581,3 @@ var log | ||
before(function (done) { | ||
this.timeout(10000) | ||
this.timeout(20000) | ||
add_many(aolog.empty(), SIZE, function (i) { return { is: "i = " + i } }, | ||
@@ -540,3 +592,3 @@ function (err, res) { | ||
before(function (done) { | ||
this.timeout(10000) | ||
this.timeout(20000) | ||
log.persist(function (err, res) { | ||
@@ -543,0 +595,0 @@ if (err) throw err |
Sorry, the diff of this file is too big to display
757128
21747