module.exports = function (opts) { var feed = changes(sublevel(opts.db, 'feed')) var db = changesdown(sublevel(opts.db, 'db', opts), feed, opts) return { feed: feed, db: db } }
test('exists multi batch', function (t) { t.plan(expected.length + 4); var up = level(name('main.db'), { valueEncoding: 'json' }); var feed = changes(sublevel(up, 'feed')); var db = changesdown(sublevel(up, 'db'), feed, { valueEncoding: 'json' }); var indexes = chi({ ixdb: level(name('index.db'), { valueEncoding: 'json' }), chdb: db, feed: feed }); var count = 0; indexes.add(function (row, cb) { t.deepEqual(relevant(row), expected.shift()); if (row.type === 'put') { count += row.exists ? 0 : 1; } else if (row.type === 'del') { count -= row.exists ? 1 : 0; } cb(null, { 'whatever': row.value }); }); var batches = [ [ { type: 'put', key: 'a', value: 123 }, { type: 'put', key: 'b', value: 555 } ], [ { type: 'put', key: 'a', value: 444 }, { type: 'put', key: 'c', value: 1000 } ], [ { type: 'del', key: 'b' } ] ]; (function next () { if (batches.length === 0) return; db.batch(batches.shift(), function (err) { t.ifError(err); next(); }); })(); indexes.on('change', function (ch) { if (ch.change === 3) { t.equal(count, 2); } }); function relevant (x) { if (x.type === 'del') { return { type: x.type, key: x.key, exists: x.exists }; } return { type: x.type, key: x.key, value: x.value, exists: x.exists }; } });
test('eq', function (t) { t.plan(3); var up = level(name('main.db'), { valueEncoding: 'json' }); var feed = changes(sublevel(up, 'feed')); var db = changesdown(sublevel(up, 'db'), feed, { valueEncoding: 'json' }); var indexes = chi({ ixdb: level(name('index.db'), { valueEncoding: 'json' }), chdb: db, feed: feed }); indexes.add(function (row, cb) { if (/^user!/.test(row.key)) { cb(null, { 'user.name': row.value.name, 'user.space': row.value.hackerspace }); } else cb() }); db.batch([ { type: 'put', key: 'user!1', value: { name: 'substack', hackerspace: 'sudoroom' } }, { type: 'put', key: 'user!2', value: { name: 'mk30', hackerspace: 'sudoroom' } }, { type: 'put', key: 'user!3', value: { name: 'mitch', hackerspace: 'noisebridge' } }, { type: 'put', key: 'ignore!me', value: {} } ], ready); function ready (err) { t.ifError(err); indexes.createReadStream('user.name', { eq: 'mitch' }) .pipe(collect(function (rows) { t.deepEqual(rows, [ { key: 'user!3', value: { name: 'mitch', hackerspace: 'noisebridge' }, index: 'mitch' } ], 'user.name eq mitch'); })); indexes.createReadStream('user.space', { eq: 'sudoroom' }) .pipe(collect(function (rows) { t.deepEqual(rows, [ { key: 'user!1', value: { name: 'substack', hackerspace: 'sudoroom' }, index: 'sudoroom' }, { key: 'user!2', value: { name: 'mk30', hackerspace: 'sudoroom' }, index: 'sudoroom' }, ], 'user.space eq sudoroom'); })); } });