UNPKG

p2p-db-osm

Version:

API for p2p-db adding OpenStreetMap data types and querying.

78 lines (68 loc) 1.87 kB
var LevelIndex = require('hyperdb-index-level') var collect = require('collect-stream') var sub = require('subleveldown') var through = require('through2') var utils = require('./utils') function createIndex (hdb, ldb) { ldb = sub(ldb, 'cs') var idx = LevelIndex(hdb, ldb, onNode) // TODO: this needs to erase non-head refs! otherwise you'll get back // non-head referrers! function onNode (node, next) { var id = idFromKey(node.key) // console.log('REFS INDEX :: node', id, node.value) var version = utils.nodeToVersion(hdb, node) var elm = node.value var ops = [] if (elm.type === 'way' && elm.refs) { ops = elm.refs.map(function (refId) { return { type: 'put', key: refId + '!' + version, value: id } }) } else if (elm.type === 'relation' && elm.members) { ops = elm.members.map(function (member) { return { type: 'put', key: member.id + '!' + version, value: id } }) } if (elm.changeset) { ops.push({ type: 'put', key: elm.changeset + '!' + version, value: id }) } // console.log('ldb.batch', ops) if (ops.length) ldb.batch(ops, next) else next() } idx.getReferersById = function (id, cb) { this.ready(function () { var rs = ldb.createReadStream({ gte: id + '!', lte: id + '~' }) var t = through.obj(function (row, enc, next) { next(null, { id: row.value, version: row.key.split('!')[1] }) }) collect(rs.pipe(t), {encoding: 'object'}, cb) }) } // idx.getReferersByVersion = function (version, cb) { // } return idx } // HyperDbKey -> Id function idFromKey (key) { return key.substring(key.lastIndexOf('/') + 1) } module.exports = createIndex