Skip to content

Commit 5c8f393

Browse files
committed
Levenshtein distance lookup for routes
1 parent b526d96 commit 5c8f393

2 files changed

Lines changed: 106 additions & 61 deletions

File tree

routes/routes.js

Lines changed: 59 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
'use strict';
22

33
var express = require('express'),
4+
async = require('async'),
5+
db = require('../db/stations'),
46
request = require('request'),
57
router = express.Router(),
68
datetime = require('../utils/datetime'),
@@ -11,9 +13,6 @@ var express = require('express'),
1113
/* GET status */
1214
router.get('/', function(req, res, next) {
1315

14-
var from = parseInt(req.query.from) || 0;
15-
var to = parseInt(req.query.to) || 0;
16-
1716
var searchType = 1;
1817
var dateTime = datetime.toCET().format('YYYY-MM-DD HH:mm:ss');
1918

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

2827
var params = {
2928
resultCountBefore : 0,
30-
departureStationId : from,
3129
dateTime : dateTime,
32-
arrivalStationId : to,
3330
searchType : 1,
3431
minTransferTime : 0,
3532
resultCountAfter : 3
3633
};
3734

38-
request.get(new OAuth('RetrieveRoutes', params), function(err, resp, body) {
35+
async.parallel({
36+
37+
from: function(callback) {
38+
39+
if (isFinite(req.query.from))
40+
return callback(null, parseInt(req.query.from));
41+
42+
db.levenLookup(req.query.from, function(err, result) {
43+
params.stationID = result.id;
44+
45+
if (isFinite(result.score))
46+
callback(null, result.id);
47+
else
48+
return res.json(404, new ex.StationNotFoundException());
49+
});
50+
51+
},
52+
53+
to: function(callback) {
54+
55+
if (isFinite(req.query.to))
56+
return callback(null, parseInt(req.query.to));
57+
58+
db.levenLookup(req.query.to, function(err, result) {
59+
params.stationID = result.id;
60+
61+
if (isFinite(result.score))
62+
callback(null, result.id);
63+
else
64+
return res.json(404, new ex.StationNotFoundException());
65+
});
3966

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

44-
maps.routes.route(body, req.locale, function(err, directions) {
45-
if (err)
46-
res.send(resp.statusCode || 500, { error: err });
47-
else
48-
res.json(directions);
49-
});
69+
}, function(err, results) {
70+
71+
if (err)
72+
return res.json(500, err);
5073

74+
params.departureStationId = results.from;
75+
params.arrivalStationId = results.to;
5176

77+
makeRequest(params);
5278
});
5379

80+
function makeRequest(params) {
81+
82+
request.get(new OAuth('RetrieveRoutes', params), function(err, resp, body) {
83+
84+
if (err || resp.statusCode !== 200) {
85+
return res.json(500, new ex.RailtimeException('Could not resolve route'));
86+
}
87+
88+
maps.routes.route(body, req.locale, function(err, directions) {
89+
if (err)
90+
res.send(resp.statusCode || 500, { error: err });
91+
else
92+
res.json(directions);
93+
});
94+
95+
});
96+
97+
}
98+
5499
});
55100

56101
module.exports = router;

routes/stations.js

Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -11,50 +11,6 @@ var express = require('express'),
1111
db = require('../db/stations'),
1212
OAuth = require('../utils/oauth');
1313

14-
function makeRequest(req, res, next, params) {
15-
16-
request.get(new OAuth('RetrieveStationSchedule', params), function(err, resp, body) {
17-
18-
if (err || resp.statusCode !== 200)
19-
return res.send(resp.statusCode || 500, { error: '¯\\_(ツ)_/¯' });
20-
21-
maps.stations.station(body, req.locale, function(err, body) {
22-
23-
if (err)
24-
return res.send(resp.statusCode || 500, { error: err });
25-
26-
var sort, reject;
27-
28-
if (req.params.subset === 'arrivals') {
29-
30-
sort = 'arrival';
31-
reject = function(train) {
32-
return train.arrival === null;
33-
};
34-
35-
} else if (req.params.subset === 'departures') {
36-
37-
sort = 'departure';
38-
reject = function(train) {
39-
return train.departure === null;
40-
};
41-
42-
} else {
43-
sort = 'departure';
44-
reject = utils.noop;
45-
}
46-
47-
body.trains = _.chain(body.trains)
48-
.reject(reject)
49-
.sortBy(sort)
50-
.value();
51-
52-
res.json(body);
53-
});
54-
});
55-
56-
}
57-
5814
/* GET status */
5915
router.get('/:station/:subset(arrivals|departures)?', function(req, res, next) {
6016

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

7329
if (isFinite(req.params.station)) {
7430
params.stationID = req.params.station;
75-
makeRequest(req, res, next, params);
31+
makeRequest(params);
7632
}
7733

78-
else if (isNaN(req.params.station))
34+
else
7935
db.levenLookup(req.params.station, function(err, result) {
8036

8137
params.stationID = result.id;
8238

8339
// no results from lookup returns Infinity
8440
if (isFinite(result.score))
85-
makeRequest(req, res, next, params);
41+
makeRequest(params);
8642
else
8743
return res.json(404, new ex.StationNotFoundException());
8844
});
8945

46+
function makeRequest(params) {
47+
48+
request.get(new OAuth('RetrieveStationSchedule', params), function(err, resp, body) {
49+
50+
if (err || resp.statusCode !== 200)
51+
return res.send(resp.statusCode || 500, { error: '¯\\_(ツ)_/¯' });
52+
53+
maps.stations.station(body, req.locale, function(err, body) {
54+
55+
if (err)
56+
return res.send(resp.statusCode || 500, { error: err });
57+
58+
var sort, reject;
59+
60+
if (req.params.subset === 'arrivals') {
61+
62+
sort = 'arrival';
63+
reject = function(train) {
64+
return train.arrival === null;
65+
};
66+
67+
} else if (req.params.subset === 'departures') {
68+
69+
sort = 'departure';
70+
reject = function(train) {
71+
return train.departure === null;
72+
};
73+
74+
} else {
75+
sort = 'departure';
76+
reject = utils.noop;
77+
}
78+
79+
body.trains = _.chain(body.trains)
80+
.reject(reject)
81+
.sortBy(sort)
82+
.value();
83+
84+
res.json(body);
85+
});
86+
});
87+
88+
}
89+
9090
});
9191

9292
/* GET index */

0 commit comments

Comments
 (0)