hyperlog-kdb-index
Version:
n-dimensional kdb tree spatial index for hyperlogs
70 lines (63 loc) • 1.71 kB
JavaScript
var test = require('tape')
var fdstore = require('fd-chunk-store')
var hyperkdb = require('../')
var kdbtree = require('kdb-tree-store')
var memdb = require('memdb')
var path = require('path')
var hyperlog = require('hyperlog')
var log = hyperlog(memdb(), { valueEncoding: 'json' })
var file = path.join(require('os').tmpdir(), 'kdb-tree-' + Math.random())
test('points', function (t) {
var N = 50
t.plan(2 + N)
var kdb = hyperkdb({
log: log,
db: memdb(),
types: [ 'float', 'float' ],
kdbtree: kdbtree,
store: fdstore(256, file),
map: function (row, next) {
if (row.value.type === 'point') {
next(null, [ row.value.lat, row.value.lon ])
}
}
})
var data = []
for (var i = 0; i < N; i++) (function (i) {
var row = {
type: 'point',
lat: 64 + Math.random() * 2,
lon: -147 - Math.random() * 2
}
log.add(null, row, function (err, node) {
t.ifError(err)
data[i] = {
point: [ row.lat, row.lon ],
value: Buffer(node.key, 'hex')
}
})
})(i)
var q = [[64.5,65],[-147.9,-147.2]]
kdb.query(q, function (err, pts) {
t.ifError(err)
var expected = data.filter(function (row) {
return q[0][0] <= row.point[0] && row.point[0] <= q[0][1]
&& q[1][0] <= row.point[1] && row.point[1] <= q[1][1]
}).map(round).sort(cmp)
t.deepEqual(pts.sort(cmp), expected, 'expected points')
})
})
function round (row) {
return {
point: row.point.map(roundf),
value: row.value
}
}
function roundf (x) {
var buf = new Buffer(4)
buf.writeFloatBE(x, 0)
return buf.readFloatBE(0)
}
function cmp (a, b) {
return a.point.join(',') < b.point.join(',') ? -1 : 1
}