From 51c598ddaca615ed3fea08f50d343de6a6d43053 Mon Sep 17 00:00:00 2001 From: Young Hahn Date: Thu, 5 Dec 2013 15:00:17 -0500 Subject: [PATCH] Add support for geocoder api (carmen dev). --- lib/mbtiles.js | 80 ++++++++++++++++++++++++ lib/schema.sql | 9 ++- test/fixtures/geocoder_data.mbtiles | Bin 0 -> 1114112 bytes test/geocoder.test.js | 92 ++++++++++++++++++++++++++++ 4 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/geocoder_data.mbtiles create mode 100644 test/geocoder.test.js diff --git a/lib/mbtiles.js b/lib/mbtiles.js index 959fae1..4312ef2 100644 --- a/lib/mbtiles.js +++ b/lib/mbtiles.js @@ -56,6 +56,7 @@ function MBTiles(uri, callback) { if (err) return callback(err); mbtiles._stat = stat; mbtiles.open = true; + mbtiles.emit('open', err); callback(null, mbtiles); }); }); @@ -562,3 +563,82 @@ MBTiles.prototype.putInfo = function(data, callback) { }); }; +// Implements carmen#getGeocoderData method. +MBTiles.prototype.getGeocoderData = function(type, shard, callback) { + return this._db.get('SELECT data FROM geocoder_data WHERE type = ? AND shard = ?', type, shard, function(err, row) { + if (err) return callback(err); + if (!row) return callback(); + zlib.inflate(row.data, callback); + }); +}; + +// Implements carmen#putGeocoderData method. +MBTiles.prototype.putGeocoderData = function(type, shard, data, callback) { + var source = this; + zlib.deflate(data, function(err, zdata) { + if (err) return callback(err); + source.write('geocoder_data', type + '.' + shard, { type:type, shard: shard, data: zdata }, callback); + }); +}; + +// Implements carmen#getIndexableDocs method. +MBTiles.prototype.getIndexableDocs = function(pointer, callback) { + pointer = pointer || {}; + pointer.limit = pointer.limit || 10000; + pointer.offset = pointer.offset || 0; + pointer.nogrids = 'nogrids' in pointer ? pointer.nogrids : false; + + // Converts MBTiles native TMS coords to ZXY. + function tms2zxy(zxys) { + return zxys.split(',').map(function(tms) { + var zxy = tms.split('/').map(function(v) { return parseInt(v, 10); }); + zxy[2] = (1 << zxy[0]) - 1 - zxy[2]; + return zxy.join('/'); + }); + } + + // If 'carmen' option is passed in initial pointer, retrieve indexables from + // carmen table. This option can be used to access the previously indexed + // documents from an MBTiles database without having to know what search + // field was used in the past (see comment below). + if (pointer.table === 'carmen') { + return this._db.all('SELECT c.id AS id, c.text AS text, c.zxy, k.key_json FROM carmen c JOIN keymap k ON c.id = k.key_name LIMIT ? OFFSET ?', pointer.limit, pointer.offset, function(err, rows) { + if (err) return callback(err); + var docs = rows.map(function(row) { + var doc = JSON.parse(row.key_json); + doc._id = row.id; + doc._text = row.text; + if (row.zxy) doc._zxy = tms2zxy(row.zxy); + return doc; + }); + pointer.offset += pointer.limit; + return callback(null, docs, pointer); + }.bind(this)); + } + + // By default the keymap table contains all indexable documents. + this.getInfo(function(err, info) { + if (err) return callback(err); + var sql, args; + if (pointer.nogrids) { + sql = "SELECT key_name, key_json FROM keymap LIMIT ? OFFSET ?;"; + args = [pointer.limit, pointer.offset]; + } else { + sql = "SELECT k.key_name AS id, k.key_json, GROUP_CONCAT(zoom_level||'/'||tile_column ||'/'||tile_row,',') AS zxy FROM keymap k JOIN grid_key g ON k.key_name = g.key_name JOIN map m ON g.grid_id = m.grid_id WHERE m.zoom_level=? GROUP BY k.key_name LIMIT ? OFFSET ?;"; + args = [info.maxzoom, pointer.limit, pointer.offset]; + } + this._db.all(sql, args, function(err, rows) { + if (err) return callback(err); + var docs = rows.map(function(row) { + var doc = JSON.parse(row.key_json); + doc._id = row.id; + doc._text = doc.search || doc.name || ''; + if (row.zxy) doc._zxy = tms2zxy(row.zxy); + return doc; + }); + pointer.offset += pointer.limit; + return callback(null, docs, pointer); + }.bind(this)); + }.bind(this)); +}; + diff --git a/lib/schema.sql b/lib/schema.sql index de6e22d..787f093 100644 --- a/lib/schema.sql +++ b/lib/schema.sql @@ -35,6 +35,11 @@ CREATE TABLE IF NOT EXISTS metadata ( value text ); +CREATE TABLE IF NOT EXISTS geocoder_data ( + type TEXT, + shard INTEGER, + data BLOB +); CREATE UNIQUE INDEX IF NOT EXISTS map_index ON map (zoom_level, tile_column, tile_row); CREATE UNIQUE INDEX IF NOT EXISTS grid_key_lookup ON grid_key (grid_id, key_name); @@ -42,7 +47,9 @@ CREATE UNIQUE INDEX IF NOT EXISTS keymap_lookup ON keymap (key_name); CREATE UNIQUE INDEX IF NOT EXISTS grid_utfgrid_lookup ON grid_utfgrid (grid_id); CREATE UNIQUE INDEX IF NOT EXISTS images_id ON images (tile_id); CREATE UNIQUE INDEX IF NOT EXISTS name ON metadata (name); - +CREATE INDEX IF NOT EXISTS map_grid_id ON map (grid_id); +CREATE INDEX IF NOT EXISTS geocoder_type_index ON geocoder_data (type); +CREATE UNIQUE INDEX IF NOT EXISTS geocoder_shard_index ON geocoder_data (type, shard); CREATE VIEW IF NOT EXISTS tiles AS SELECT diff --git a/test/fixtures/geocoder_data.mbtiles b/test/fixtures/geocoder_data.mbtiles new file mode 100644 index 0000000000000000000000000000000000000000..366fa8e9a44f3d1e5a706b5b4ca35ec377282224 GIT binary patch literal 1114112 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 SY65X}6C)x@1I77uqW&Kacu?5@ literal 0 HcmV?d00001 diff --git a/test/geocoder.test.js b/test/geocoder.test.js new file mode 100644 index 0000000..09669cf --- /dev/null +++ b/test/geocoder.test.js @@ -0,0 +1,92 @@ +var fs = require('fs'); +var assert = require('assert'); +var util = require('util'); +var MBTiles = require('..'); + +describe('geocoder (carmen) API', function() { + +var expected = { + bounds: '-141.005548666451,41.6690855919108,-52.615930948992,83.1161164353916', + lat: 56.8354595949484, + lon: -110.424643384994, + name: 'Canada', + population: 33487208, + search: 'Canada, CA' +}; + +var tmp = '/tmp/mbtiles-test-' + (+new Date).toString(16); +var index; +var from; +var to; + +before(function() { + try { fs.mkdirSync(tmp); } catch(err) { throw err; } +}); +before(function(done) { + index = new MBTiles(__dirname + '/fixtures/geocoder_data.mbtiles', done); +}); +before(function(done) { + from = new MBTiles(__dirname + '/fixtures/plain_4.mbtiles', done); +}); +before(function(done) { + to = new MBTiles(tmp + '/indexed.mbtiles', done); +}); + +after(function(done) { + this.timeout(5000); + index.close(function(err) { + if (err) throw err; + from.close(function(err) { + if (err) throw err; + to.close(function(err) { + if (err) throw err; + try { fs.unlinkSync(tmp + '/indexed.mbtiles'); } catch(err) { throw err; } + try { fs.rmdirSync(tmp); } catch(err) { throw err; } + done(); + }); + }); + }); +}); + +it('getGeocoderData', function(done) { + index.getGeocoderData('term', 0, function(err, buffer) { + assert.ifError(err); + assert.equal(3891, buffer.length); + done(); + }); +}); + +it('putGeocoderData', function(done) { + this.timeout(5000); + to.startWriting(function(err) { + assert.ifError(err); + to.putGeocoderData('term', 0, new Buffer('asdf'), function(err) { + assert.ifError(err); + to.stopWriting(function(err) { + assert.ifError(err); + to.getGeocoderData('term', 0, function(err, buffer) { + assert.ifError(err); + assert.deepEqual('asdf', buffer.toString()); + done(); + }); + }); + }); + }); +}); + +it('getIndexableDocs', function(done) { + from.getIndexableDocs({ limit: 10 }, function(err, docs, pointer) { + assert.ifError(err); + assert.equal(docs.length, 10); + assert.deepEqual(pointer, { limit: 10, offset: 10, nogrids: false }); + from.getIndexableDocs(pointer, function(err, docs, pointer) { + assert.ifError(err); + assert.equal(docs.length, 10); + assert.deepEqual(pointer, { limit: 10, offset: 20, nogrids: false }); + done(); + }); + }); +}); + +}); +