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