From f4a54f1b37bc8a7b79491a076c5e2af572d11080 Mon Sep 17 00:00:00 2001
From: Jacek Kowalski <Jacek@jacekk.info>
Date: Sun, 03 Feb 2019 00:53:43 +0000
Subject: [PATCH] Improve map performance by using static styles and image renderMode
---
stops/index.php | 86 +++++++++++++++++++++++++++++++++++++++++++
1 files changed, 86 insertions(+), 0 deletions(-)
diff --git a/stops/index.php b/stops/index.php
new file mode 100644
index 0000000..5795afa
--- /dev/null
+++ b/stops/index.php
@@ -0,0 +1,86 @@
+<?php
+include('common.php');
+include('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();
+
+ // Split stop name into words
+ $words = split_stop_name($_GET['query']);
+ $find_ondemand = in_array('nz', $words);
+
+ // Initialize a DB connection and a query
+ $pdo = new PDO('sqlite:stops.db', NULL, NULL, array(
+ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
+ ));
+ $st = $pdo->prepare('SELECT DISTINCT id FROM stop_search WHERE word LIKE ?'.($find_ondemand ? '' : ' AND word != \'nz\'').' ORDER BY id DESC');
+
+ // 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) {
+ similar_text(
+ $query_lower,
+ mb_strtolower($stops[$id], 'UTF-8'),
+ $percent
+ );
+ // -5 due to UTF-8
+ if(substr($stops[$id], -5) == '(nż)' && !$find_ondemand) {
+ $percent /= 2;
+ }
+ $stop_list[] = [
+ 'id' => $id,
+ 'name' => $stops[$id],
+ 'type' => 'stop',
+ 'relevance' => $percent,
+ ];
+ }
+
+ // 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
+ header('Content-Type: application/json');
+ echo json_encode($stop_list);
+} catch(UnexpectedValueException $e) {
+ header('Content-Type: application/json');
+ echo '[]';
+} catch(Exception $e) {
+ header('HTTP/1.1 503 Service Unavailable');
+ echo $e->getMessage();
+}
--
Gitblit v1.9.1