hyperlog-index
Version:
forking indexes for hyperlog
57 lines (52 loc) • 1.6 kB
JavaScript
var level = require('level')
var indexer = require('../')
var hyperlog = require('hyperlog')
var sub = require('subleveldown')
var mkdirp = require('mkdirp')
var minimist = require('minimist')
var argv = minimist(process.argv.slice(2), {
default: { d: '/tmp/kv.db' }
})
mkdirp.sync(argv.d)
var hdb = level(argv.d + '/h')
var idb = level(argv.d + '/i')
var log = hyperlog(hdb, { valueEncoding: 'json' })
var db = sub(idb, 'x', { valueEncoding: 'json' })
var dex = indexer({
log: log,
db: sub(idb, 'i'),
map: function (row, next) {
// This method reduces our new state. In this example, db is used for the state.
db.get(row.value.k, function (err, doc) {
if (!doc) doc = {}
row.links.forEach(function (link) {
delete doc[link]
})
doc[row.key] = row.value.v
db.put(row.value.k, doc, next)
})
}
})
if (argv._[0] === 'get') {
dex.ready(function () {
db.get(argv._[1], function (err, values) {
if (err) console.error(err)
else console.log(values)
})
})
} else if (argv._[0] === 'put') {
// Structure `doc` as expected by `map` above
var doc = { k: argv._[1], v: JSON.parse(argv._[2]) }
dex.ready(function () {
db.get(doc.k, function (err, values) {
// Link the new entry to the "parents", from the current index, if any
log.add(Object.keys(values || {}), doc, function (err, node) {
if (err) console.error(err)
})
})
})
} else if (argv._[0] === 'sync') {
var r = log.replicate()
process.stdin.pipe(r).pipe(process.stdout)
r.on('end', function () { process.stdin.pause() })
}