<?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 ?'); 
 | 
     
 | 
    // 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(); 
 | 
} 
 |