コード例 #1
0
ファイル: changedb.js プロジェクト: jcrugzz/atomic-queue
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
  }
}
コード例 #2
0
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 };
    }
});
コード例 #3
0
ファイル: eq.js プロジェクト: mvayngrib/changes-index
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');
        }));
    }
});