Skip to content

Commit

Permalink
Levenshtein distance lookup for routes
Browse files Browse the repository at this point in the history
  • Loading branch information
gillesdemey committed Dec 21, 2014
1 parent b526d96 commit 5c8f393
Show file tree
Hide file tree
Showing 2 changed files with 106 additions and 61 deletions.
73 changes: 59 additions & 14 deletions routes/routes.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
'use strict';

var express = require('express'),
async = require('async'),
db = require('../db/stations'),
request = require('request'),
router = express.Router(),
datetime = require('../utils/datetime'),
Expand All @@ -11,9 +13,6 @@ var express = require('express'),
/* GET status */
router.get('/', function(req, res, next) {

var from = parseInt(req.query.from) || 0;
var to = parseInt(req.query.to) || 0;

var searchType = 1;
var dateTime = datetime.toCET().format('YYYY-MM-DD HH:mm:ss');

Expand All @@ -27,30 +26,76 @@ router.get('/', function(req, res, next) {

var params = {
resultCountBefore : 0,
departureStationId : from,
dateTime : dateTime,
arrivalStationId : to,
searchType : 1,
minTransferTime : 0,
resultCountAfter : 3
};

request.get(new OAuth('RetrieveRoutes', params), function(err, resp, body) {
async.parallel({

from: function(callback) {

if (isFinite(req.query.from))
return callback(null, parseInt(req.query.from));

db.levenLookup(req.query.from, function(err, result) {
params.stationID = result.id;

if (isFinite(result.score))
callback(null, result.id);
else
return res.json(404, new ex.StationNotFoundException());
});

},

to: function(callback) {

if (isFinite(req.query.to))
return callback(null, parseInt(req.query.to));

db.levenLookup(req.query.to, function(err, result) {
params.stationID = result.id;

if (isFinite(result.score))
callback(null, result.id);
else
return res.json(404, new ex.StationNotFoundException());
});

if (err || resp.statusCode !== 200) {
return res.json(500, new ex.RailtimeException('Could not resolve route'));
}

maps.routes.route(body, req.locale, function(err, directions) {
if (err)
res.send(resp.statusCode || 500, { error: err });
else
res.json(directions);
});
}, function(err, results) {

if (err)
return res.json(500, err);

params.departureStationId = results.from;
params.arrivalStationId = results.to;

makeRequest(params);
});

function makeRequest(params) {

request.get(new OAuth('RetrieveRoutes', params), function(err, resp, body) {

if (err || resp.statusCode !== 200) {
return res.json(500, new ex.RailtimeException('Could not resolve route'));
}

maps.routes.route(body, req.locale, function(err, directions) {
if (err)
res.send(resp.statusCode || 500, { error: err });
else
res.json(directions);
});

});

}

});

module.exports = router;
94 changes: 47 additions & 47 deletions routes/stations.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,50 +11,6 @@ var express = require('express'),
db = require('../db/stations'),
OAuth = require('../utils/oauth');

function makeRequest(req, res, next, params) {

request.get(new OAuth('RetrieveStationSchedule', params), function(err, resp, body) {

if (err || resp.statusCode !== 200)
return res.send(resp.statusCode || 500, { error: '¯\\_(ツ)_/¯' });

maps.stations.station(body, req.locale, function(err, body) {

if (err)
return res.send(resp.statusCode || 500, { error: err });

var sort, reject;

if (req.params.subset === 'arrivals') {

sort = 'arrival';
reject = function(train) {
return train.arrival === null;
};

} else if (req.params.subset === 'departures') {

sort = 'departure';
reject = function(train) {
return train.departure === null;
};

} else {
sort = 'departure';
reject = utils.noop;
}

body.trains = _.chain(body.trains)
.reject(reject)
.sortBy(sort)
.value();

res.json(body);
});
});

}

/* GET status */
router.get('/:station/:subset(arrivals|departures)?', function(req, res, next) {

Expand All @@ -72,21 +28,65 @@ router.get('/:station/:subset(arrivals|departures)?', function(req, res, next) {

if (isFinite(req.params.station)) {
params.stationID = req.params.station;
makeRequest(req, res, next, params);
makeRequest(params);
}

else if (isNaN(req.params.station))
else
db.levenLookup(req.params.station, function(err, result) {

params.stationID = result.id;

// no results from lookup returns Infinity
if (isFinite(result.score))
makeRequest(req, res, next, params);
makeRequest(params);
else
return res.json(404, new ex.StationNotFoundException());
});

function makeRequest(params) {

request.get(new OAuth('RetrieveStationSchedule', params), function(err, resp, body) {

if (err || resp.statusCode !== 200)
return res.send(resp.statusCode || 500, { error: '¯\\_(ツ)_/¯' });

maps.stations.station(body, req.locale, function(err, body) {

if (err)
return res.send(resp.statusCode || 500, { error: err });

var sort, reject;

if (req.params.subset === 'arrivals') {

sort = 'arrival';
reject = function(train) {
return train.arrival === null;
};

} else if (req.params.subset === 'departures') {

sort = 'departure';
reject = function(train) {
return train.departure === null;
};

} else {
sort = 'departure';
reject = utils.noop;
}

body.trains = _.chain(body.trains)
.reject(reject)
.sortBy(sort)
.value();

res.json(body);
});
});

}

});

/* GET index */
Expand Down

0 comments on commit 5c8f393

Please sign in to comment.