-
Notifications
You must be signed in to change notification settings - Fork 12
/
stops.php
77 lines (65 loc) · 1.98 KB
/
stops.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<?php
include(__DIR__.'/stops/common.php');
include(__DIR__.'/stops/stops.php');
try {
// Reject invalid input
if(!isset($_GET['query'])) throw new UnexpectedValueException();
if(empty($_GET['query'])) throw new UnexpectedValueException();
if(strlen($_GET['query']) > 50) throw new UnexpectedValueException();
// Initialize a DB connection an a query
$pdo = new PDO('sqlite:stops/stops.db', NULL, NULL, array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
));
$st = $pdo->prepare('SELECT DISTINCT id FROM stop_search WHERE word LIKE ? AND id LIKE \'t%\'');
// Split stop name into words
$words = split_stop_name($_GET['query']);
// Find matching stops (their IDs)
$ids = NULL;
foreach($words as $word) {
if(empty($word)) continue;
// Find stop IDs with names matching the word
$st->execute(array($word.'%'));
$results = $st->fetchAll(PDO::FETCH_COLUMN);
$st->closeCursor();
if(is_array($ids)) {
// Merge results with list for previous words
$ids = array_intersect($ids, $results);
} else {
// First search - initialize results list
$ids = $results;
}
// No results will be found
if(count($ids) == 0) break;
}
// Close a DB connection
unset($st, $pdo);
// No query was executed - return empty list
if(!is_array($ids)) throw new UnexpectedValueException();
// Build a structure for the UI
$stop_list = [];
$query_lower = mb_strtolower($_GET['query'], 'UTF-8');
foreach($ids as $id) {
$stop_list[] = [
'id' => $id,
'name' => $stops[$id],
'type' => 'stop',
'relevance' => similar_text(
$query_lower,
mb_strtolower($stops[$id], 'UTF-8')
)
];
}
// Sort stops by relevance
usort($stop_list, function($a, $b) {
$rel = $b['relevance'] - $a['relevance'];
if($rel == 0) return strcasecmp($a['name'], $b['name']);
return $rel;
});
// Return JSON
echo json_encode($stop_list);
} catch(UnexpectedValueException $e) {
echo '[]';
} catch(Exception $e) {
header('HTTP/1.1 503 Service Unavailable');
echo $e->getMessage();
}