Projekt

Obecné

Profil

« Předchozí | Další » 

Revize bad470c9

Přidáno uživatelem horkym před téměř 7 roky(ů)

refs #7029: Vytvoreni testu na zpracovani zaznamu o doprave

Vytvoreni testu na komplikovanou cast cronu (zpracovani konkretnich zaznamu o doprave). Ostatni casti cronu otestovany zkousenim aplikace.

Zobrazit rozdíly:

cron_test/READ_ME.TXT
1
Vime, ze stazeni souboru, extrahovani a odstraneni jde (otestovany ruzne varianty, detaily do logu).
2
To same komunikace s databazi, pocatecni inicializaci databaze (vlozeni typu vozidel), apod.
3
Jedine, cim si nejsme jisti je zpracovani zaznamu (jedna se o velke mnozstvi dat a o slozity algoritmus zpracovani).
4
Ukolem tohoto testovani je tedy zjistit, jestli se zaznamy o doprave spravne zpracovavaji.
cron_test/cron.php
1
<?php
2

  
3
require_once "dao/dao.php";
4
require_once "db/db-web.php";
5
require_once "parser.php";
6
require_once "process_traffic_matrix.php";
7

  
8
function cron() {
9
    // Nacteni dat z testovacich souboru.
10
    cron_procedure(new DateTime("20180605"));
11
}
12

  
13
// Funkce, ktera je volana bud cron() nebo year_cron() a ktera stahne data pro dany den.
14
function cron_procedure($date) {
15
    // Kvuli timeoutu.
16
    set_time_limit(0);
17
    
18
    // Objekt pro logovani.
19
    $logs = new Logging();
20
    
21
    // Vytvoreni objektu pro komunikaci s DB.
22
    $dbh = new DB_WEB($logs);
23
    $DAO = new DAO();
24
    $DAO->setDB($dbh);
25
    
26
    if ($date != NULL && $DAO->controlTrafficData($date->format("Y-m-d"))) {
27
        $logs->log(Logging::INFO, "Data k vybranemu dni (".$date->format("d.m.Y").") jeste v databazi nejsou.");
28
        $parser = new Parser($logs);
29
        $parser->doWork($date->format("Ymd"));
30
        
31
        $traffic = $parser->getTraffic();
32
        $trafficOneDay = $parser->getTrafficOneDay();
33
        $locations = $parser->getLocations();
34
        
35
        $DAO->insertVehicles(); // Pokud nejsou typy vozidel v tabulce - pridat.
36
        
37
        // Pridat udaje o novych zarizenich.
38
        foreach ($locations as $l) {
39
            $DAO->insertLocationData($l);
40
        }
41
        
42
        // Pridat zaznamy z vybraneho dne.
43
        $insertDate = array();
44
        $insertRTT = array();
45
        $insertRT = array();
46
        $insertOneDay = array();
47
        process_traffic_matrix($parser, $traffic, $trafficOneDay, $DAO->findFirstId("datum"), $DAO->findFirstId("zaznam_cas"), $DAO->findFirstId("zaznam"), $DAO->findFirstId("zaznam_prum_den"), $insertDate, $insertRTT, $insertRT, $insertOneDay, $date->format("Y-m-d"));
48
        $DAO->insertTrafficData($insertDate, $insertRTT, $insertRT, $insertOneDay);
49
    } else if ($date != NULL) {
50
        // Data pro vybrany den uz v databazi jsou.
51
        $logs->log(Logging::WARNING, "Pro vybrany den (".$date->format("d.m.Y").") jiz data v databazi jsou.");
52
    }
53
}
54

  
55
?>
cron_test/dao/dao.php
1
<?php
2

  
3
require_once "db/db-web.php";
4
require_once "location.php";
5

  
6
class DAO {
7
  
8
    protected $dbh;
9
  
10
    public function setDB($dbh) {
11
        $this->dbh = $dbh;
12
    }
13
    
14
    public function insertVehicles() {
15
        $query = "SELECT COUNT(*) AS total FROM vozidlo";
16
        $stmt = $this->dbh->executeQuery($query);
17
        
18
        if ($stmt->fetchAssoc()["total"] < 1) {
19
            // Pokud v tabulce s vozidly neni zadny zaznam, pridat vsechny moznosti.
20
            $query = "INSERT INTO vozidlo (id, nazev) VALUES ";
21
            $query .= "('0', 'Neznámé vozidlo'), ";
22
            $query .= "('1', 'Motocykl'), ";
23
            $query .= "('2', 'Auto'), ";
24
            $query .= "('3', 'Auto s přívěsem'), ";
25
            $query .= "('4', 'Dodávka'), ";
26
            $query .= "('5', 'Dodávka s přívěsem'), ";
27
            $query .= "('6', 'Lehký nákladní automobil'), ";
28
            $query .= "('7', 'Lehký nákladní automobil s přívěsem'), ";
29
            $query .= "('8', 'Nákladní automobil'), ";
30
            $query .= "('9', 'Nákladní automobil s přívěsem'), ";
31
            $query .= "('10', 'Autobus');";
32
            $stmt = $this->dbh->executeQuery($query);
33
        }
34
    }
35
    
36
    public function controlTrafficData($dateStr) {
37
        $dateTo = new DateTime($dateStr);
38
        $dateTo->modify("+1 day");
39
        $query = "SELECT COUNT(*) AS total FROM datum WHERE od >= '$dateStr' AND od < '".$dateTo->format('Y-m-d')."';";
40
        $stmt = $this->dbh->executeQuery($query);
41
        return $stmt->fetchAssoc()["total"] < 1;
42
    }
43
    
44
    public function insertTrafficData($insertDate, $insertRTT, $insertRT, $insertOneDay) {
45
        for ($i = 0; $i < 4; $i++) {
46
            $query = "";
47
            $values = "";
48
            $counter = 0;
49
            $array = NULL;
50
            
51
            if ($i == 0) {
52
                $query = "INSERT INTO datum VALUES ";
53
                $array = &$insertDate;
54
            } else if ($i == 1) {
55
                $query = "INSERT INTO zaznam_cas VALUES ";
56
                $array = &$insertRTT;
57
            } else if ($i == 2) {
58
                $query = "INSERT INTO zaznam VALUES ";
59
                $array = &$insertRT;
60
            } else {
61
                $query = "INSERT INTO zaznam_prum_den VALUES ";
62
                $array = &$insertOneDay;
63
            }
64
            
65
            for ($j = 0; $j < count($array); $j++) {
66
                $values .= $array[$j].", ";
67
                $counter++;
68
                if ($counter == 1000 || $j == (count($array) - 1)) {
69
                    $query_ = $query.substr($values, 0, strlen($values) - 2).";";
70
                    $stmt = $this->dbh->executeQuery($query_);
71
                    
72
                    $values = "";
73
                    $counter = 0;
74
                }
75
            }
76
        }
77
    }
78
    
79
    public function insertLocationData($location) {
80
        
81
        // --- Kontrola, zda je mesto v tabulce, pripadne jeho pridani. ---
82
        
83
        $townId = $this->conditionalInsertion($location, "mesto", -1);
84
        
85
        // --- Kontrola, zda je ulice v tabulce, pripadne jeji pridani. ---
86
        
87
        $streetId = $this->conditionalInsertion($location, "ulice", $townId);
88
        
89
        // --- Kontrola, zda je zarizeni v tabulce, pripadne jeho pridani. ---
90
        
91
        $query = "SELECT * FROM zarizeni WHERE id='".$location->device."';";
92
        $stmt = $this->dbh->executeQuery($query);
93
        
94
        if (!($stmt->fetchAssoc())) {
95
            // Zarizeni se v tabulce jeste nenachazi.
96
            $query = "INSERT INTO zarizeni VALUES ('".$location->device."', '".$location->name."', '0', '$streetId');";
97
            $stmt = $this->dbh->executeQuery($query);
98
        }
99
        
100
    }
101
    
102
    // Pro mesta a ulice.
103
    private function conditionalInsertion($location, $table, $townId) {
104
        $query = "SELECT id FROM $table WHERE nazev=";
105
        if ($townId < 0) {
106
            // Hledame mesto.
107
            $query .= "'".$location->town."';";
108
        } else {
109
            // Hledame ulici (s odkazem na konkretni mesto - ruzna mesta mohou mit shodny nazev nejake ulice).
110
            $query .= "'".$location->street."' AND mesto_id='$townId';";
111
        }
112
        $stmt = $this->dbh->executeQuery($query);
113
        
114
        $id = -1;
115
        if ($row = $stmt->fetchAssoc()) {
116
            // Zaznam uz je v tabulce.
117
            $id = $row["id"];
118
        } else {
119
            // Zaznam se v tabulce jeste nenachazi - nalezeni id pro novy zaznam.
120
            $id = $this->findFirstId($table);
121
            
122
            $query = "INSERT INTO $table VALUES ";
123
            if ($townId < 0) {
124
                $query .= "('$id', '".$location->town."');";
125
            } else {
126
                // Jestlize ulice v DB jeste neexistuje, nastavit geolokaci (nema smysl zem. sirku a delku zjistovat driv - nejedna se o dulezite informace pro CRON).
127
                $location->setGeolocation();
128
                $query .= "('$id', '".$location->street."', '$townId', '".$location->lat."', '".$location->lng."');";
129
            }
130
            
131
            // Vlozeni zaznamu do tabulky.
132
            $stmt = $this->dbh->executeQuery($query);
133
        }
134
        
135
        return $id;
136
    }
137
    
138
    public function findFirstId($table) {
139
        $query = "SELECT id FROM $table ORDER BY id DESC LIMIT 1;";
140
        $stmt = $this->dbh->executeQuery($query);
141
        
142
        $id = -1;
143
        if ($row = $stmt->fetchAssoc()) {
144
            // V tabulce je vice zaznamu.
145
            $id = $row["id"] + 1;
146
        } else {
147
            // Tabulka je prazdna.
148
            $id = 1;
149
        }
150
        
151
        return $id;
152
    }
153
    
154
}
155

  
156
?>
cron_test/data/READ_ME.TXT
1
// Obsah souboru "test_Ymd_doprava.csv"
2
idDetektor - z tohoto udaje "10<ID_ZARIZENI>10<SMER>" bereme oznaceni zarizeni (detektoru) a smer, ve kterem snima (1 = ve smeru, 2 = v proti smeru).
3
DatumCas - datum a cas zaznamu.
4
Intenzita - NEPOTREBNE, NAHRAZENO PISMENEM "X".
5
IntenzitaN - NEPOTREBNE, NAHRAZENO PISMENEM "X".
6
Obsazenost - NEPOTREBNE, NAHRAZENO PISMENEM "X".
7
Rychlost - namerena rychlost (musi se brat v potaz i zaznamy s rychlosti 0.0 = rychlost nesla urcit).
8
Stav - jestli je zarizeni funkcni (=1) nebo nefunkcni (<0). V aktualni verzi se s timto udajem nepracuje (pokud nam zarizeni da rozumny udaj, je nam jedno, jestli je funkcni nebo ne - do budoucna by chtelo opravit udaj v DB).
9
TypVozidla - NEPOTREBNE, NAHRAZENO PISMENEM "X".
10
Trvani100 - NEPOTREBNE, NAHRAZENO PISMENEM "X".
11
RychlostHistorie - NEPOTREBNE, NAHRAZENO PISMENEM "X".
12
TypVozidla10 - konkretni typ vozidla (s obecnym oznacenim, 4 skupiny, nepracujeme).
13

  
14

  
15

  
16
// Obsah souboru "test_Ymd_lokace.csv"
17
Name - popis ulice (napr. z jakeho smeru zarizeni snima).
18
Town - nazev mesta.
19
Street - nazev ulice.
20
IdDevice - KP<ID_ZARIZENI>, bereme oznaceni detektoru.
21
idArea - NEPOTREBNE, NAHRAZENO PISMENEM "X".
22

  
23

  
24

  
25
Jednotlive sloupce v obou souborech jsou oddeleny svislitkem.
cron_test/data/test_20180605_doprava.csv
1
10056102|"2018-06-05 00:00:00.123"|X|X|X|17.000|0|X|X|X|8
2
10056102|"2018-06-05 00:00:01.546"|X|X|X|12.000|0|X|X|X|0
3
10056102|"2018-06-05 00:00:02.849"|X|X|X|68.000|0|X|X|X|2
4
10056102|"2018-06-05 00:00:03.048"|X|X|X|168.92|0|X|X|X|2
5
10056102|"2018-06-05 00:00:10.000"|X|X|X|94.557|0|X|X|X|2
6
10056102|"2018-06-05 00:00:12.804"|X|X|X|34.000|0|X|X|X|8
7
10056102|"2018-06-05 00:00:13.040"|X|X|X|00.000|0|X|X|X|2
8
10056102|"2018-06-05 00:00:14.144"|X|X|X|00.000|0|X|X|X|3
9
10056102|"2018-06-05 00:00:15.597"|X|X|X|16.000|0|X|X|X|1
10
10056102|"2018-06-05 00:14:59.999"|X|X|X|19.050|0|X|X|X|4
11
10056102|"2018-06-05 00:15:00.000"|X|X|X|25.150|0|X|X|X|2
12
10056101|"2018-06-05 00:15:52.324"|X|X|X|65.400|0|X|X|X|2
13
10055101|"2018-06-05 00:00:00.123"|X|X|X|17.000|0|X|X|X|2
14
10055101|"2018-06-05 00:00:01.546"|X|X|X|12.000|0|X|X|X|0
15
10055101|"2018-06-05 00:00:02.849"|X|X|X|68.000|0|X|X|X|8
16
10055101|"2018-06-05 00:00:03.048"|X|X|X|168.92|0|X|X|X|8
17
10055101|"2018-06-05 00:00:10.000"|X|X|X|94.557|0|X|X|X|8
18
10055101|"2018-06-05 00:00:12.804"|X|X|X|34.000|0|X|X|X|2
19
10055101|"2018-06-05 00:00:13.040"|X|X|X|00.000|0|X|X|X|8
20
10055101|"2018-06-05 00:00:14.144"|X|X|X|00.000|0|X|X|X|3
21
10055101|"2018-06-05 00:00:15.597"|X|X|X|16.000|0|X|X|X|1
22
10055101|"2018-06-05 00:14:59.999"|X|X|X|19.050|0|X|X|X|4
23
10055101|"2018-06-05 00:15:00.000"|X|X|X|25.150|0|X|X|X|8
24
10056101|"2018-06-05 00:25:46.059"|X|X|X|65.789|0|X|X|X|6
cron_test/data/test_20180605_lokace.csv
1
"Česká Kubice, směr od Německa"|"Česká Kubice"|"Česká Kubice"|"KP055"|X
2
"Česká Kubice, směr od Babylonu"|"Česká Kubice"|"Česká Kubice"|"KP056"|X
cron_test/db/db-exception.php
1
<?php
2

  
3
require_once "/../logging.php";
4

  
5
class DB_Exception extends Exception {
6
    
7
    public function __construct($logs = NULL, $message = false, $code = false) {
8
        if (!$message) {
9
            $this->message = mysql_error();
10
        } 
11
        if (!$code) {
12
            $this->code = mysql_errno();
13
        }
14
        if ($logs != NULL) {
15
            $logs->log(Logging::ERROR, $this->__toString());
16
        }
17
    }
18
    
19
}
20

  
21
?>
cron_test/db/db-pdo.php
1
<?php
2

  
3
require_once "db-exception.php";
4

  
5
class DB_PDO {
6
  
7
    protected $user;
8
    protected $pass;
9
    protected $dbhost;
10
    protected $dbname;
11
    protected $dbh;
12
    
13
    protected $logs;
14
  
15
    public function __construct($user, $pass, $dbhost, $dbname) {
16
        $this->user = $user;
17
        $this->pass = $pass;
18
        $this->dbhost = $dbhost;
19
        $this->dbname = $dbname;
20
    }
21
  
22
    protected function connect() {
23
        $this->dbh = new PDO("mysql:host=".$this->dbhost.";dbname=".$this->dbname.";charset=utf8", $this->user, $this->pass);
24
        if (!$this->dbh) {
25
            throw new DB_Exception($this->logs);
26
        }
27
    }
28
  
29
    public function executeQuery($query) {
30
        if (!$this->dbh) {
31
            $this->connect();
32
        }
33
        $ret = $this->dbh->query($query);
34
        if (!$ret) {
35
            throw new DB_Exception($this->logs);
36
        } else {
37
            $stmt = new DB_PDOStatement($this->dbh, $query, $this->logs);
38
            $stmt->result = $ret;
39
            $stmt->number = $ret->rowCount();
40
            return $stmt;
41
        }
42
    }
43
      
44
}
45

  
46
class DB_PDOStatement {
47
    
48
    public $result;
49
    public $query;
50
    public $number;
51
    protected $dbh;
52
    
53
    private $logs;
54
  
55
    public function __construct($dbh, $query, $logs) {
56
        $this->query = $query;
57
        $this->dbh = $dbh;
58
        $this->logs = $logs;
59
        if (!$dbh) {
60
            throw new DB_Exception($this->logs, "Spojení s databází se nezdařilo!");
61
        }
62
    }
63
  
64
    public function fetchAssoc() {
65
        if (!$this->result) {
66
            throw new DB_Exception($this->logs, "Dotaz nebyl vykonán!");
67
        }
68
        return $this->result->fetch(PDO::FETCH_ASSOC);
69
    }
70
    
71
}
72

  
73
?>
cron_test/db/db-web.php
1
<?php
2

  
3
require_once "db-pdo.php";
4

  
5
class DB_WEB extends DB_PDO {
6
  
7
    protected $user = "root";
8
    protected $pass = "";
9
    protected $dbhost = "localhost";
10
    protected $dbname = "prujezd_vozidel";
11
    
12
    protected $logs = NULL;
13
  
14
    public function __construct($logs) {
15
        $this->logs = $logs;
16
    }
17
     
18
}
19

  
20
?>
cron_test/empty_database.sql
1
-- phpMyAdmin SQL Dump
2
-- version 3.5.2.2
3
-- http://www.phpmyadmin.net
4
--
5
-- Počítač: 127.0.0.1
6
-- Vygenerováno: Čtv 07. čen 2018, 00:14
7
-- Verze MySQL: 5.5.27-log
8
-- Verze PHP: 5.4.6
9

  
10
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
11
SET time_zone = "+00:00";
12

  
13

  
14
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
15
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
16
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
17
/*!40101 SET NAMES utf8 */;
18

  
19
--
20
-- Databáze: `prujezd_vozidel`
21
--
22
CREATE DATABASE `prujezd_vozidel` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
23
USE `prujezd_vozidel`;
24

  
25
-- --------------------------------------------------------
26

  
27
--
28
-- Struktura tabulky `datum`
29
--
30

  
31
CREATE TABLE IF NOT EXISTS `datum` (
32
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
33
  `od` datetime NOT NULL,
34
  `do` datetime NOT NULL,
35
  PRIMARY KEY (`id`)
36
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
37

  
38
-- --------------------------------------------------------
39

  
40
--
41
-- Struktura tabulky `mesto`
42
--
43

  
44
CREATE TABLE IF NOT EXISTS `mesto` (
45
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
46
  `nazev` varchar(100) NOT NULL,
47
  PRIMARY KEY (`id`)
48
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
49

  
50
-- --------------------------------------------------------
51

  
52
--
53
-- Struktura tabulky `ulice`
54
--
55

  
56
CREATE TABLE IF NOT EXISTS `ulice` (
57
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
58
  `nazev` varchar(255) NOT NULL,
59
  `mesto_id` bigint(20) NOT NULL,
60
  `zem_sirka` double NOT NULL DEFAULT '-1' COMMENT 'Zemepisna sirka podle GOOGLE.',
61
  `zem_delka` double NOT NULL DEFAULT '-1' COMMENT 'Zemepisna delka podle GOOGLE.',
62
  PRIMARY KEY (`id`),
63
  KEY `fk_ulice_mesto_idx` (`mesto_id`)
64
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
65

  
66
-- --------------------------------------------------------
67

  
68
--
69
-- Struktura tabulky `vozidlo`
70
--
71

  
72
CREATE TABLE IF NOT EXISTS `vozidlo` (
73
  `id` bigint(20) NOT NULL COMMENT 'Odpovídá číslu skupiny vozidla (TypVozidla10 v csv souboru s daty). Hodnoty 0-10.',
74
  `nazev` varchar(45) NOT NULL,
75
  PRIMARY KEY (`id`)
76
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
77

  
78
-- --------------------------------------------------------
79

  
80
--
81
-- Struktura tabulky `zarizeni`
82
--
83

  
84
CREATE TABLE IF NOT EXISTS `zarizeni` (
85
  `id` varchar(20) NOT NULL COMMENT 'Odpovídá idDevice v location.csv.',
86
  `smer_popis` varchar(255) NOT NULL COMMENT 'Odpovídá Name v locations.csv.',
87
  `stav` int(11) NOT NULL,
88
  `ulice_id` bigint(20) NOT NULL,
89
  PRIMARY KEY (`id`),
90
  KEY `fk_zarizeni_ulice1_idx` (`ulice_id`)
91
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
92

  
93
-- --------------------------------------------------------
94

  
95
--
96
-- Struktura tabulky `zaznam`
97
--
98

  
99
CREATE TABLE IF NOT EXISTS `zaznam` (
100
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
101
  `vozidla_pocet` int(11) NOT NULL,
102
  `rychlost_prumer` double NOT NULL,
103
  `vozidla_id` bigint(20) NOT NULL,
104
  `zaznam_cas_id` bigint(20) NOT NULL,
105
  PRIMARY KEY (`id`),
106
  KEY `fk_zaznam_vozidla1_idx` (`vozidla_id`),
107
  KEY `fk_zaznam_zaznam_cas1_idx` (`zaznam_cas_id`)
108
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
109

  
110
-- --------------------------------------------------------
111

  
112
--
113
-- Struktura tabulky `zaznam_cas`
114
--
115

  
116
CREATE TABLE IF NOT EXISTS `zaznam_cas` (
117
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
118
  `smer` int(11) NOT NULL COMMENT '1 nebo 2 viz struktura idDetektor v csv souboru s daty.',
119
  `zarizeni_id` varchar(20) NOT NULL,
120
  `datum_id` bigint(20) NOT NULL,
121
  PRIMARY KEY (`id`),
122
  KEY `fk_zaznam_cas_zarizeni1_idx` (`zarizeni_id`),
123
  KEY `datum_id` (`datum_id`)
124
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
125

  
126
-- --------------------------------------------------------
127

  
128
--
129
-- Struktura tabulky `zaznam_prum_den`
130
--
131

  
132
CREATE TABLE IF NOT EXISTS `zaznam_prum_den` (
133
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
134
  `vozidla_pocet` int(11) NOT NULL,
135
  `rychlost_prumer` double NOT NULL,
136
  `smer` int(11) NOT NULL,
137
  `zarizeni_id` varchar(20) NOT NULL,
138
  `vozidla_id` bigint(20) NOT NULL,
139
  `datum_id` bigint(20) NOT NULL,
140
  PRIMARY KEY (`id`),
141
  KEY `zarizeni_id` (`zarizeni_id`),
142
  KEY `vozidla_id` (`vozidla_id`),
143
  KEY `datum_id` (`datum_id`)
144
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
145

  
146
--
147
-- Omezení pro exportované tabulky
148
--
149

  
150
--
151
-- Omezení pro tabulku `ulice`
152
--
153
ALTER TABLE `ulice`
154
  ADD CONSTRAINT `fk_ulice_mesto` FOREIGN KEY (`mesto_id`) REFERENCES `mesto` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;
155

  
156
--
157
-- Omezení pro tabulku `zarizeni`
158
--
159
ALTER TABLE `zarizeni`
160
  ADD CONSTRAINT `fk_zarizeni_ulice1` FOREIGN KEY (`ulice_id`) REFERENCES `ulice` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;
161

  
162
--
163
-- Omezení pro tabulku `zaznam`
164
--
165
ALTER TABLE `zaznam`
166
  ADD CONSTRAINT `fk_zaznam_vozidla1` FOREIGN KEY (`vozidla_id`) REFERENCES `vozidlo` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
167
  ADD CONSTRAINT `fk_zaznam_zaznam_cas1` FOREIGN KEY (`zaznam_cas_id`) REFERENCES `zaznam_cas` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;
168

  
169
--
170
-- Omezení pro tabulku `zaznam_cas`
171
--
172
ALTER TABLE `zaznam_cas`
173
  ADD CONSTRAINT `zaznam_cas_ibfk_1` FOREIGN KEY (`datum_id`) REFERENCES `datum` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
174
  ADD CONSTRAINT `fk_zaznam_cas_zarizeni1` FOREIGN KEY (`zarizeni_id`) REFERENCES `zarizeni` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;
175

  
176
--
177
-- Omezení pro tabulku `zaznam_prum_den`
178
--
179
ALTER TABLE `zaznam_prum_den`
180
  ADD CONSTRAINT `zaznam_prum_den_ibfk_3` FOREIGN KEY (`datum_id`) REFERENCES `datum` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
181
  ADD CONSTRAINT `zaznam_prum_den_ibfk_1` FOREIGN KEY (`zarizeni_id`) REFERENCES `zarizeni` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
182
  ADD CONSTRAINT `zaznam_prum_den_ibfk_2` FOREIGN KEY (`vozidla_id`) REFERENCES `vozidlo` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;
183

  
184
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
185
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
186
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
cron_test/index.php
1
<?php
2

  
3
require_once "cron.php";
4
require_once "logging.php";
5

  
6
echo "<h1>Zkouška cronu</h1>";
7
echo "<p>Spouštím script:</p>";
8

  
9
cron();
10

  
11
echo "<p>KONEC</p>";
12

  
13
?>
cron_test/location.php
1
<?php
2

  
3
class Location {
4

  
5
    // Pouzivane atributy.
6
    public $name;
7
    public $town;
8
    public $street;
9
    public $device;
10
    
11
    // Nepouzivane.
12
    // public $area;
13
    
14
    // --- ZEMEPISNA SIRKA A DELKA A UDAJE POTREBNE K JEJICH ZJISTENI. ---
15
    
16
    private $key;
17
    private $locality;
18
    private $region;
19
    
20
    public $lat;
21
    public $lng;
22
    
23
    public function __construct($data) {
24
        $this->name = $data[0];
25
        $this->town = $data[1];
26
        $this->street = $data[2];
27
        $this->device = substr($data[3], 2);
28
        // $this->area = $data[4];
29
        
30
        $this->key = "AIzaSyCSx7hyAzQiG5uocJTeZgf1Z3lpDy4kpEk";
31
        $this->locality = "Plzeňský kraj";
32
        $this->region = "cz";
33
        $this->lat = -1;
34
        $this->lng = -1;
35
    }
36
    
37
    // V pripade problemu, se ziskanim souboru protokolem HTTPS, v php.ini odkomentovat "extension=php_openssl.dll".
38
    public function setGeolocation() {
39
        $address = $this->town;
40
        if ($this->town != $this->street) {
41
            $address .= " ".$this->street;
42
        }
43
        $address .= " ".$this->locality;
44
        $address = str_replace(" ", "+", $address); // Nemusi byt, jen pro jistotu.
45
        
46
        $json = file_get_contents("https://maps.google.com/maps/api/geocode/json?address=$address&sensor=false&region=".$this->region."&key=".$this->key);
47
        $json = json_decode($json, TRUE);
48
        if ($json["status"] == "OK") {
49
            $this->lat = $json["results"]["0"]["geometry"]["location"]["lat"];
50
            $this->lng = $json["results"]["0"]["geometry"]["location"]["lng"];
51
        } else {
52
            $this->lat = -1;
53
            $this->lng = -1;
54
        }
55
    }
56
    
57
}
58

  
59
?>
cron_test/log/cron.txt
1
07.06.2018 00:16:03.043
2
--- INFO ---
3
Data k vybranemu dni (05.06.2018) jeste v databazi nejsou.
4

  
5
07.06.2018 00:16:03.070
6
--- INFO ---
7
ZACATEK PROCEDURY pro den 05.06.2018.
8

  
9
07.06.2018 00:16:03.077
10
--- INFO ---
11
Zpracovavani zaznamu o doprave.
12

  
13
07.06.2018 00:16:03.086
14
--- INFO ---
15
Zpracovavani zaznamu o lokacich.
16

  
17
07.06.2018 00:16:03.172
18
--- INFO ---
19
KONEC PROCEDURY.
20

  
21
07.06.2018 00:28:23.291
22
--- INFO ---
23
Data k vybranemu dni (05.06.2018) jeste v databazi nejsou.
24

  
25
07.06.2018 00:28:23.306
26
--- INFO ---
27
ZACATEK PROCEDURY pro den 05.06.2018.
28

  
29
07.06.2018 00:28:23.317
30
--- INFO ---
31
Zpracovavani zaznamu o doprave.
32

  
33
07.06.2018 00:28:23.398
34
--- INFO ---
35
Zpracovavani zaznamu o lokacich.
36

  
37
07.06.2018 00:28:23.409
38
--- INFO ---
39
KONEC PROCEDURY.
40

  
41
07.06.2018 00:35:30.813
42
--- INFO ---
43
Data k vybranemu dni (05.06.2018) jeste v databazi nejsou.
44

  
45
07.06.2018 00:35:30.829
46
--- INFO ---
47
ZACATEK PROCEDURY pro den 05.06.2018.
48

  
49
07.06.2018 00:35:30.838
50
--- INFO ---
51
Zpracovavani zaznamu o doprave.
52

  
53
07.06.2018 00:35:30.851
54
--- INFO ---
55
Zpracovavani zaznamu o lokacich.
56

  
57
07.06.2018 00:35:30.861
58
--- INFO ---
59
KONEC PROCEDURY.
60

  
cron_test/logging.php
1
<?php
2

  
3
class Logging {
4
    
5
    // Zpravy jsou pouze informativni.
6
    const INFO = 0;
7
    // Jedna se o mene zavazne stavy - treba data pro dany den jeste neexistuji.
8
    const WARNING = 1;
9
    // Doslo k padu cele procedury - napr. nepovedlo se vytvorit slozku pro extrahovana data.
10
    const ERROR = 2;
11
    
12
    // Soubor, do ktereho se budou zaznamy vkladat (defaultne ve slozce log).
13
    private $log_file;
14
    
15
    public function __construct() {
16
        $this->log_file = "log/cron.txt";
17
    }
18
    
19
    public function log($type, $message) {
20
        $type_str = "";
21
        switch ($type) {
22
            case self::INFO: $type_str = "INFO"; break;
23
            case self::WARNING: $type_str = "WARNING"; break;
24
            default: $type_str = "ERROR"; break;
25
        }
26
        
27
        $micro_date = microtime();
28
        $date_array = explode(" ", $micro_date);
29
        $date = sprintf("%s.%03d", date("d.m.Y H:i:s", $date_array[1]), (int) ($date_array[0] * 1000));
30
        
31
        file_put_contents($this->log_file, "$date\r\n--- $type_str ---\r\n$message\r\n\r\n", FILE_APPEND);
32
    }
33
    
34
}
35

  
36
?>
cron_test/parser.php
1
<?php
2

  
3
require_once "traffic.php";
4
require_once "location.php";
5
require_once "logging.php";
6

  
7
class Parser {
8
    
9
    // Pro data o doprave - na kolik intervalu se ma rozdelit den (96 = 4 * 24 => intervaly po ctvrt hodine).
10
    public $HOW_MANY_INTERVALS = 96;
11
    
12
    // Pro data o doprave - jak dlouho v milisekundach trva jeden interval.
13
    public $intervalMilli;
14
    
15
    // Pole informaci o lokacich.
16
    private $locations;
17
    
18
    // Pole informaci o doprave - peti-rozmerne pole s nasledujici strukturou:
19
    // Zaklad tvori pole zarizeni. Pro kazde zarizeni je pak pole pro casove intervaly.
20
    // Kazdy casovy interval ma pole o dvou prvcich (dva smery). Pro kazdy smer je vytvoreno pole o jedenacti
21
    // prvcich (jedenact typu vozidel). Pro kazde vozidlo je vytvoreno pole o dvou prvcich (pocet vozidel, suma rychlosti).
22
    private $traffic;
23
    
24
    // Skoro to same jako $traffic, akorat bez rozmeru pro casove intervaly.
25
    private $trafficOneDay;
26
    
27
    // Objekt pro logovani do souboru cron.txt ve slozce log.
28
    private $logs;
29
    
30
    public function __construct($logs) {
31
        // Pro lokace se data predzpracovavat nemusi.
32
        $this->locations = array();
33
        
34
        // Naopak u zaznamu je prilis zbytecnych informaci - k predzpracovani dojit musi.
35
        $this->intervalMilli = (int) (24 * 3600000 / $this->HOW_MANY_INTERVALS);
36
        $this->traffic = array();
37
        $this->trafficOneDay = array();
38
        
39
        $this->logs = $logs;
40
    }
41
    
42
    public function doWork($date) {
43
        // Stazeni archivu pri stestovani neresime.
44
        // Pouze zapis do logu a zavolani zpracovani obou souboru.
45
        $this->logs->log(Logging::INFO, "ZACATEK PROCEDURY pro den ".DateTime::createFromFormat("Ymd", $date)->format("d.m.Y").".");
46
        $this->logs->log(Logging::INFO, "Zpracovavani zaznamu o doprave.");
47
        $this->parse("data/test_".$date."_doprava.csv", TRUE);
48
        $this->logs->log(Logging::INFO, "Zpracovavani zaznamu o lokacich.");
49
        $this->parse("data/test_".$date."_lokace.csv", FALSE);
50
        $this->logs->log(Logging::INFO, "KONEC PROCEDURY.");
51
    }
52
    
53
    private function parse($fileName, $traffic) {
54
        if (($file = fopen($fileName, "r"))) {
55
            while (($row = fgetcsv($file, 1000, "|"))) {
56
                if ($traffic) {
57
                    $this->saveVehicleInfo(new Traffic($row));
58
                } else {
59
                    $this->locations[] = new Location($row);
60
                }
61
            }
62
            fclose($file);
63
        }
64
    }
65
    
66
    private function saveVehicleInfo($t) {
67
        // Kontrola, jestli je pro dane zarizeni vytvorene pole casu.
68
        if (!isSet($this->traffic[$t->device])) {
69
            // Vytvorit prvni dva rozmery pole pro dopravni data s rozdelenim na casove intervaly.
70
            $this->traffic[$t->device] = array();
71
            for ($i = 0; $i < $this->HOW_MANY_INTERVALS; $i++) {
72
                $this->traffic[$t->device][$i] = NULL;
73
            }
74
            
75
            // U pole s prumery za cely den rovnou vytvorit vsechny rozmery.
76
            $this->trafficOneDay[$t->device] = array();
77
            for ($i = 0; $i < 2; $i++) {
78
                $this->trafficOneDay[$t->device][$i] = array();
79
                for ($j = 0; $j < 11; $j++) {
80
                    $this->trafficOneDay[$t->device][$i][$j] = array(0, 0, 0); // Pocet danych vozidel, suma jejich rychlosti a pocet vozidel u kterych nesla stanovit rychlost.
81
                }
82
            }
83
            
84
        }
85
        
86
        // Zjisteni, do jakeho casoveho intervalu patri zaznam.
87
        list($date, $time) = explode(" ", $t->dateTime->format("Y-m-d H:i:s.u"), 2);
88
        list($hours, $minutes, $seconds) = explode(":", $time, 3);
89
        $interval = (int) (($hours * 3600000 + $minutes * 60000 + $seconds * 1000) / $this->intervalMilli);
90
        
91
        // Kontrola, jestli je pro dany casovy interval vytvorene pole pro smery.
92
        if ($this->traffic[$t->device][$interval] == NULL) {
93
            $this->traffic[$t->device][$interval] = array();
94
            for ($i = 0; $i < 2; $i++) {
95
                $this->traffic[$t->device][$interval][$i] = array();
96
                for ($j = 0; $j < 11; $j++) {
97
                    $this->traffic[$t->device][$interval][$i][$j] = array(0, 0, 0); // Pocet danych vozidel, suma jejich rychlosti a pocet vozidel u kterych nesla stanovit rychlost.
98
                }
99
            }
100
        }
101
        
102
        // Ulozeni dulezitych informaci o danem zaznamu do pole s casovymi intervaly a i do pole se zaznamy za cely den.
103
        if ($t->speed < 1) {
104
            $this->traffic[$t->device][$interval][$t->direction][$t->type10][2]++;
105
            $this->trafficOneDay[$t->device][$t->direction][$t->type10][2]++;
106
        } else {
107
            $this->traffic[$t->device][$interval][$t->direction][$t->type10][0]++;
108
            $this->traffic[$t->device][$interval][$t->direction][$t->type10][1] += $t->speed;
109
            $this->trafficOneDay[$t->device][$t->direction][$t->type10][0]++;
110
            $this->trafficOneDay[$t->device][$t->direction][$t->type10][1] += $t->speed;
111
        }
112
    }
113
    
114
    public function getTraffic() {
115
        return $this->traffic;
116
    }
117
    
118
    public function getTrafficOneDay() {
119
        return $this->trafficOneDay;
120
    }
121
    
122
    public function getLocations() {
123
        return $this->locations;
124
    }
125
    
126
}
127

  
128
?>
cron_test/process_traffic_matrix.php
1
<?php
2

  
3
function process_traffic_matrix($parser, $traffic, $trafficOneDay, $idDateTable, $idRecordTimeTable, $idRecordTable, $idRecordOneDayTable, &$insertDate, &$insertRTT, &$insertRT, &$insertOneDay, $date) {
4
    $times = array();
5
    
6
    // Rekonstrukce casovych intervalu.
7
    for ($i = 0; $i < $parser->HOW_MANY_INTERVALS; $i++) {
8
        $times[$i] = array();
9
        $times[$i][0] = new DateTime($date);
10
        $times[$i][1] = new DateTime($date);
11
        
12
        $fromSec = (int) (($i * $parser->intervalMilli) / 1000);
13
        $toSec = (int) (($i + 1) * $parser->intervalMilli / 1000);
14
        
15
        $fromHours = (int) ($fromSec / 3600);
16
        $fromMinutes = (int) (($fromSec - $fromHours * 3600) / 60);
17
        $fromSeconds = (int) ($fromSec - $fromHours * 3600 - $fromMinutes * 60);
18
        
19
        $toHours = (int) ($toSec / 3600);
20
        $toMinutes = (int) (($toSec - $toHours * 3600) / 60);
21
        $toSeconds = (int) ($toSec - $toHours * 3600 - $toMinutes * 60);
22
        
23
        $times[$i][0]->setTime($fromHours, $fromMinutes, $fromSeconds);
24
        $times[$i][1]->setTime($toHours, $toMinutes, $toSeconds);
25
    }
26
    
27
    // Priprava dat pro naplneni tabulek zaznam a zaznam_cas.
28
    foreach ($traffic as $device => $timeIntervals) {
29
        for ($t = 0; $t < $parser->HOW_MANY_INTERVALS; $t++) {
30
            if ($timeIntervals[$t] != NULL) {
31
                for ($d = 0; $d < 2; $d++) {
32
                    $dataExists = FALSE;
33
                    
34
                    for ($v = 0; $v < 11; $v++) {
35
                        $count_ = $timeIntervals[$t][$d][$v][0] + $timeIntervals[$t][$d][$v][2];
36
                        if ($count_ > 0) {
37
                            $dataExists = TRUE;
38
                            $speed_ = -1.0;
39
                            
40
                            if ($timeIntervals[$t][$d][$v][0] > 0) {
41
                                $speed_ = $timeIntervals[$t][$d][$v][1] / (double) $timeIntervals[$t][$d][$v][0];
42
                            }
43
                            
44
                            $insertRT[] = "('".$idRecordTable++."', '$count_', '$speed_', '$v', '$idRecordTimeTable')";
45
                        }
46
                    }
47
                    
48
                    if ($dataExists) {
49
                        $insertRTT[] = "('".$idRecordTimeTable++."', '".($d + 1)."', '$device', '".($idDateTable + $t)."')";
50
                    }
51
                }
52
            }
53
        }
54
    }
55
    
56
    // Priprava dat pro naplneni tabulky datum. Budou vlozeny veskere casove intervaly. Je nemozne, aby neexistovalo alespon jedno zarizeni,
57
    // ktere v dany casovy interval detekuje alespon jeden dopravni prostredek. I kdyby takova situace nastala, dane intervaly take mohou
58
    // slouzit pro pouziti ve statistikach.
59
    for ($i = 0; $i < $parser->HOW_MANY_INTERVALS; $i++) {
60
        $insertDate[] = "('".$idDateTable++."', '".$times[$i][0]->format("Y-m-d H:i:s")."', '".$times[$i][1]->format("Y-m-d H:i:s")."')";
61
    }
62
    
63
    // Priprava dat pro naplneni tabulky zaznam_prum_den.
64
    foreach ($trafficOneDay as $device => $direction) {
65
        for ($d = 0; $d < 2; $d++) {
66
            for ($v = 0; $v < 11; $v++) {
67
                $count_ = $direction[$d][$v][0] + $direction[$d][$v][2];
68
                if ($count_ > 0) {
69
                    $speed_ = -1.0;
70
                    if ($direction[$d][$v][0] > 0) {
71
                        $speed_ = $direction[$d][$v][1] / (double) $direction[$d][$v][0];
72
                    }
73
                    $insertOneDay[] = "('".$idRecordOneDayTable++."', '$count_', '$speed_', '".($d + 1)."', '$device', '$v', '$idDateTable')";
74
                }
75
            }
76
        }
77
    }
78
    
79
    // Priprava posledniho zaznamu ke vlozeni do tabulky datum (cely den - vzdy bude alespon jeden udaj).
80
    $timeFrom = new DateTime($date);
81
    $timeFrom->setTime(0, 0, 0);
82
    $timeTo = new DateTime($date);
83
    $timeTo->setTime(0, 0, 0);
84
    $timeTo->modify("+1 day");
85
    $insertDate[] = "('$idDateTable', '".$timeFrom->format("Y-m-d H:i:s")."', '".$timeTo->format("Y-m-d H:i:s")."')";
86
    
87
}
88

  
89
?>
cron_test/traffic.php
1
<?php
2

  
3
class Traffic {
4
    
5
    // Pouzivane atributy.
6
    public $device;
7
    public $direction;
8
    public $dateTime;
9
    public $speed;
10
    public $type10;
11
    
12
    // TODO pouziti.
13
    public $state;
14
    
15
    // Nepouzivane.
16
    // public $intensity;
17
    // public $intensityN;
18
    // public $occupancy;
19
    // public $type;
20
    // public $duration;
21
    // public $history;
22
    
23
    public function __construct($data) {
24
        $this->device = substr($data[0], 2, 3);
25
        $this->direction = substr($data[0], 7) - 1; // Misto hodnot 1, 2 - hodnoty 0, 1 (kvuli poli).
26
        $this->dateTime = new DateTime($data[1]);
27
        // $this->intensity = $data[2];
28
        // $this->intensityN = $data[3];
29
        // $this->occupancy = $data[4];
30
        $this->speed = (double) $data[5];
31
        $this->state = (int) $data[6];
32
        // $this->type = $data[7];
33
        // $this->duration = $data[8];
34
        // $this->history = $data[9];
35
        $this->type10 = (int) $data[10];
36
    }
37
    
38
}
39

  
40
?>
cron_test/vystup.sql
1
-- phpMyAdmin SQL Dump
2
-- version 3.5.2.2
3
-- http://www.phpmyadmin.net
4
--
5
-- Počítač: 127.0.0.1
6
-- Vygenerováno: Čtv 07. čen 2018, 01:11
7
-- Verze MySQL: 5.5.27-log
8
-- Verze PHP: 5.4.6
9

  
10
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
11
SET time_zone = "+00:00";
12

  
13

  
14
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
15
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
16
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
17
/*!40101 SET NAMES utf8 */;
18

  
19
--
20
-- Databáze: `prujezd_vozidel`
21
--
22
CREATE DATABASE `prujezd_vozidel` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
23
USE `prujezd_vozidel`;
24

  
25
-- --------------------------------------------------------
26

  
27
--
28
-- Struktura tabulky `datum`
29
--
30

  
31
CREATE TABLE IF NOT EXISTS `datum` (
32
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
33
  `od` datetime NOT NULL,
34
  `do` datetime NOT NULL,
35
  PRIMARY KEY (`id`)
36
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=98 ;
37

  
38
--
39
-- Vypisuji data pro tabulku `datum`
40
--
41

  
42
INSERT INTO `datum` (`id`, `od`, `do`) VALUES
43
(1, '2018-06-05 00:00:00', '2018-06-05 00:15:00'),
44
(2, '2018-06-05 00:15:00', '2018-06-05 00:30:00'),
45
(3, '2018-06-05 00:30:00', '2018-06-05 00:45:00'),
46
(4, '2018-06-05 00:45:00', '2018-06-05 01:00:00'),
47
(5, '2018-06-05 01:00:00', '2018-06-05 01:15:00'),
48
(6, '2018-06-05 01:15:00', '2018-06-05 01:30:00'),
49
(7, '2018-06-05 01:30:00', '2018-06-05 01:45:00'),
50
(8, '2018-06-05 01:45:00', '2018-06-05 02:00:00'),
51
(9, '2018-06-05 02:00:00', '2018-06-05 02:15:00'),
52
(10, '2018-06-05 02:15:00', '2018-06-05 02:30:00'),
53
(11, '2018-06-05 02:30:00', '2018-06-05 02:45:00'),
54
(12, '2018-06-05 02:45:00', '2018-06-05 03:00:00'),
55
(13, '2018-06-05 03:00:00', '2018-06-05 03:15:00'),
56
(14, '2018-06-05 03:15:00', '2018-06-05 03:30:00'),
57
(15, '2018-06-05 03:30:00', '2018-06-05 03:45:00'),
58
(16, '2018-06-05 03:45:00', '2018-06-05 04:00:00'),
59
(17, '2018-06-05 04:00:00', '2018-06-05 04:15:00'),
60
(18, '2018-06-05 04:15:00', '2018-06-05 04:30:00'),
61
(19, '2018-06-05 04:30:00', '2018-06-05 04:45:00'),
62
(20, '2018-06-05 04:45:00', '2018-06-05 05:00:00'),
63
(21, '2018-06-05 05:00:00', '2018-06-05 05:15:00'),
64
(22, '2018-06-05 05:15:00', '2018-06-05 05:30:00'),
65
(23, '2018-06-05 05:30:00', '2018-06-05 05:45:00'),
66
(24, '2018-06-05 05:45:00', '2018-06-05 06:00:00'),
67
(25, '2018-06-05 06:00:00', '2018-06-05 06:15:00'),
68
(26, '2018-06-05 06:15:00', '2018-06-05 06:30:00'),
69
(27, '2018-06-05 06:30:00', '2018-06-05 06:45:00'),
70
(28, '2018-06-05 06:45:00', '2018-06-05 07:00:00'),
71
(29, '2018-06-05 07:00:00', '2018-06-05 07:15:00'),
72
(30, '2018-06-05 07:15:00', '2018-06-05 07:30:00'),
73
(31, '2018-06-05 07:30:00', '2018-06-05 07:45:00'),
74
(32, '2018-06-05 07:45:00', '2018-06-05 08:00:00'),
75
(33, '2018-06-05 08:00:00', '2018-06-05 08:15:00'),
76
(34, '2018-06-05 08:15:00', '2018-06-05 08:30:00'),
77
(35, '2018-06-05 08:30:00', '2018-06-05 08:45:00'),
78
(36, '2018-06-05 08:45:00', '2018-06-05 09:00:00'),
79
(37, '2018-06-05 09:00:00', '2018-06-05 09:15:00'),
80
(38, '2018-06-05 09:15:00', '2018-06-05 09:30:00'),
81
(39, '2018-06-05 09:30:00', '2018-06-05 09:45:00'),
82
(40, '2018-06-05 09:45:00', '2018-06-05 10:00:00'),
83
(41, '2018-06-05 10:00:00', '2018-06-05 10:15:00'),
84
(42, '2018-06-05 10:15:00', '2018-06-05 10:30:00'),
85
(43, '2018-06-05 10:30:00', '2018-06-05 10:45:00'),
86
(44, '2018-06-05 10:45:00', '2018-06-05 11:00:00'),
87
(45, '2018-06-05 11:00:00', '2018-06-05 11:15:00'),
88
(46, '2018-06-05 11:15:00', '2018-06-05 11:30:00'),
89
(47, '2018-06-05 11:30:00', '2018-06-05 11:45:00'),
90
(48, '2018-06-05 11:45:00', '2018-06-05 12:00:00'),
91
(49, '2018-06-05 12:00:00', '2018-06-05 12:15:00'),
92
(50, '2018-06-05 12:15:00', '2018-06-05 12:30:00'),
93
(51, '2018-06-05 12:30:00', '2018-06-05 12:45:00'),
94
(52, '2018-06-05 12:45:00', '2018-06-05 13:00:00'),
95
(53, '2018-06-05 13:00:00', '2018-06-05 13:15:00'),
96
(54, '2018-06-05 13:15:00', '2018-06-05 13:30:00'),
97
(55, '2018-06-05 13:30:00', '2018-06-05 13:45:00'),
98
(56, '2018-06-05 13:45:00', '2018-06-05 14:00:00'),
99
(57, '2018-06-05 14:00:00', '2018-06-05 14:15:00'),
100
(58, '2018-06-05 14:15:00', '2018-06-05 14:30:00'),
101
(59, '2018-06-05 14:30:00', '2018-06-05 14:45:00'),
102
(60, '2018-06-05 14:45:00', '2018-06-05 15:00:00'),
103
(61, '2018-06-05 15:00:00', '2018-06-05 15:15:00'),
104
(62, '2018-06-05 15:15:00', '2018-06-05 15:30:00'),
105
(63, '2018-06-05 15:30:00', '2018-06-05 15:45:00'),
106
(64, '2018-06-05 15:45:00', '2018-06-05 16:00:00'),
107
(65, '2018-06-05 16:00:00', '2018-06-05 16:15:00'),
108
(66, '2018-06-05 16:15:00', '2018-06-05 16:30:00'),
109
(67, '2018-06-05 16:30:00', '2018-06-05 16:45:00'),
110
(68, '2018-06-05 16:45:00', '2018-06-05 17:00:00'),
111
(69, '2018-06-05 17:00:00', '2018-06-05 17:15:00'),
112
(70, '2018-06-05 17:15:00', '2018-06-05 17:30:00'),
113
(71, '2018-06-05 17:30:00', '2018-06-05 17:45:00'),
114
(72, '2018-06-05 17:45:00', '2018-06-05 18:00:00'),
115
(73, '2018-06-05 18:00:00', '2018-06-05 18:15:00'),
116
(74, '2018-06-05 18:15:00', '2018-06-05 18:30:00'),
117
(75, '2018-06-05 18:30:00', '2018-06-05 18:45:00'),
118
(76, '2018-06-05 18:45:00', '2018-06-05 19:00:00'),
119
(77, '2018-06-05 19:00:00', '2018-06-05 19:15:00'),
120
(78, '2018-06-05 19:15:00', '2018-06-05 19:30:00'),
121
(79, '2018-06-05 19:30:00', '2018-06-05 19:45:00'),
122
(80, '2018-06-05 19:45:00', '2018-06-05 20:00:00'),
123
(81, '2018-06-05 20:00:00', '2018-06-05 20:15:00'),
124
(82, '2018-06-05 20:15:00', '2018-06-05 20:30:00'),
125
(83, '2018-06-05 20:30:00', '2018-06-05 20:45:00'),
126
(84, '2018-06-05 20:45:00', '2018-06-05 21:00:00'),
127
(85, '2018-06-05 21:00:00', '2018-06-05 21:15:00'),
128
(86, '2018-06-05 21:15:00', '2018-06-05 21:30:00'),
129
(87, '2018-06-05 21:30:00', '2018-06-05 21:45:00'),
130
(88, '2018-06-05 21:45:00', '2018-06-05 22:00:00'),
131
(89, '2018-06-05 22:00:00', '2018-06-05 22:15:00'),
132
(90, '2018-06-05 22:15:00', '2018-06-05 22:30:00'),
133
(91, '2018-06-05 22:30:00', '2018-06-05 22:45:00'),
134
(92, '2018-06-05 22:45:00', '2018-06-05 23:00:00'),
135
(93, '2018-06-05 23:00:00', '2018-06-05 23:15:00'),
136
(94, '2018-06-05 23:15:00', '2018-06-05 23:30:00'),
137
(95, '2018-06-05 23:30:00', '2018-06-05 23:45:00'),
138
(96, '2018-06-05 23:45:00', '2018-06-06 00:00:00'),
139
(97, '2018-06-05 00:00:00', '2018-06-06 00:00:00');
140

  
141
-- --------------------------------------------------------
142

  
143
--
144
-- Struktura tabulky `mesto`
145
--
146

  
147
CREATE TABLE IF NOT EXISTS `mesto` (
148
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
149
  `nazev` varchar(100) NOT NULL,
150
  PRIMARY KEY (`id`)
151
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
152

  
153
--
154
-- Vypisuji data pro tabulku `mesto`
155
--
156

  
157
INSERT INTO `mesto` (`id`, `nazev`) VALUES
158
(1, 'Česká Kubice');
159

  
160
-- --------------------------------------------------------
161

  
162
--
163
-- Struktura tabulky `ulice`
164
--
165

  
166
CREATE TABLE IF NOT EXISTS `ulice` (
167
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
168
  `nazev` varchar(255) NOT NULL,
169
  `mesto_id` bigint(20) NOT NULL,
170
  `zem_sirka` double NOT NULL DEFAULT '-1' COMMENT 'Zemepisna sirka podle GOOGLE.',
171
  `zem_delka` double NOT NULL DEFAULT '-1' COMMENT 'Zemepisna delka podle GOOGLE.',
172
  PRIMARY KEY (`id`),
173
  KEY `fk_ulice_mesto_idx` (`mesto_id`)
174
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
175

  
176
--
177
-- Vypisuji data pro tabulku `ulice`
178
--
179

  
180
INSERT INTO `ulice` (`id`, `nazev`, `mesto_id`, `zem_sirka`, `zem_delka`) VALUES
181
(1, 'Česká Kubice', 1, 49.369388, 12.8588044);
182

  
183
-- --------------------------------------------------------
184

  
185
--
186
-- Struktura tabulky `vozidlo`
187
--
188

  
189
CREATE TABLE IF NOT EXISTS `vozidlo` (
190
  `id` bigint(20) NOT NULL COMMENT 'Odpovídá číslu skupiny vozidla (TypVozidla10 v csv souboru s daty). Hodnoty 0-10.',
191
  `nazev` varchar(45) NOT NULL,
192
  PRIMARY KEY (`id`)
193
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
194

  
195
--
196
-- Vypisuji data pro tabulku `vozidlo`
197
--
198

  
199
INSERT INTO `vozidlo` (`id`, `nazev`) VALUES
200
(0, 'Neznámé vozidlo'),
201
(1, 'Motocykl'),
202
(2, 'Auto'),
203
(3, 'Auto s přívěsem'),
204
(4, 'Dodávka'),
205
(5, 'Dodávka s přívěsem'),
206
(6, 'Lehký nákladní automobil'),
207
(7, 'Lehký nákladní automobil s přívěsem'),
208
(8, 'Nákladní automobil'),
209
(9, 'Nákladní automobil s přívěsem'),
210
(10, 'Autobus');
211

  
212
-- --------------------------------------------------------
213

  
214
--
215
-- Struktura tabulky `zarizeni`
216
--
217

  
218
CREATE TABLE IF NOT EXISTS `zarizeni` (
219
  `id` varchar(20) NOT NULL COMMENT 'Odpovídá idDevice v location.csv.',
220
  `smer_popis` varchar(255) NOT NULL COMMENT 'Odpovídá Name v locations.csv.',
221
  `stav` int(11) NOT NULL,
222
  `ulice_id` bigint(20) NOT NULL,
223
  PRIMARY KEY (`id`),
224
  KEY `fk_zarizeni_ulice1_idx` (`ulice_id`)
225
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
226

  
227
--
228
-- Vypisuji data pro tabulku `zarizeni`
229
--
230

  
231
INSERT INTO `zarizeni` (`id`, `smer_popis`, `stav`, `ulice_id`) VALUES
232
('055', 'Česká Kubice, směr od Německa', 0, 1),
233
('056', 'Česká Kubice, směr od Babylonu', 0, 1);
234

  
235
-- --------------------------------------------------------
236

  
237
--
238
-- Struktura tabulky `zaznam`
239
--
240

  
241
CREATE TABLE IF NOT EXISTS `zaznam` (
242
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
243
  `vozidla_pocet` int(11) NOT NULL,
244
  `rychlost_prumer` double NOT NULL,
245
  `vozidla_id` bigint(20) NOT NULL,
246
  `zaznam_cas_id` bigint(20) NOT NULL,
247
  PRIMARY KEY (`id`),
248
  KEY `fk_zaznam_vozidla1_idx` (`vozidla_id`),
249
  KEY `fk_zaznam_zaznam_cas1_idx` (`zaznam_cas_id`)
250
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=17 ;
251

  
252
--
253
-- Vypisuji data pro tabulku `zaznam`
254
--
255

  
256
INSERT INTO `zaznam` (`id`, `vozidla_pocet`, `rychlost_prumer`, `vozidla_id`, `zaznam_cas_id`) VALUES
257
(1, 1, 12, 0, 1),
258
(2, 1, 16, 1, 1),
259
(3, 4, 110.49233333333, 2, 1),
260
(4, 1, -1, 3, 1),
261
(5, 1, 19.05, 4, 1),
262
(6, 2, 25.5, 8, 1),
263
(7, 1, 65.4, 2, 2),
264
(8, 1, 65.789, 6, 2),
265
(9, 1, 25.15, 2, 3),
266
(10, 1, 12, 0, 4),
267
(11, 1, 16, 1, 4),
268
(12, 2, 25.5, 2, 4),
269
(13, 1, -1, 3, 4),
270
(14, 1, 19.05, 4, 4),
271
(15, 4, 110.49233333333, 8, 4),
272
(16, 1, 25.15, 8, 5);
273

  
274
-- --------------------------------------------------------
275

  
276
--
277
-- Struktura tabulky `zaznam_cas`
278
--
279

  
280
CREATE TABLE IF NOT EXISTS `zaznam_cas` (
281
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
282
  `smer` int(11) NOT NULL COMMENT '1 nebo 2 viz struktura idDetektor v csv souboru s daty.',
283
  `zarizeni_id` varchar(20) NOT NULL,
284
  `datum_id` bigint(20) NOT NULL,
285
  PRIMARY KEY (`id`),
286
  KEY `fk_zaznam_cas_zarizeni1_idx` (`zarizeni_id`),
287
  KEY `datum_id` (`datum_id`)
288
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;
289

  
290
--
291
-- Vypisuji data pro tabulku `zaznam_cas`
292
--
293

  
294
INSERT INTO `zaznam_cas` (`id`, `smer`, `zarizeni_id`, `datum_id`) VALUES
295
(1, 2, '056', 1),
296
(2, 1, '056', 2),
297
(3, 2, '056', 2),
298
(4, 1, '055', 1),
299
(5, 1, '055', 2);
300

  
301
-- --------------------------------------------------------
302

  
303
--
304
-- Struktura tabulky `zaznam_prum_den`
305
--
306

  
307
CREATE TABLE IF NOT EXISTS `zaznam_prum_den` (
308
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
309
  `vozidla_pocet` int(11) NOT NULL,
310
  `rychlost_prumer` double NOT NULL,
311
  `smer` int(11) NOT NULL,
312
  `zarizeni_id` varchar(20) NOT NULL,
313
  `vozidla_id` bigint(20) NOT NULL,
314
  `datum_id` bigint(20) NOT NULL,
315
  PRIMARY KEY (`id`),
316
  KEY `zarizeni_id` (`zarizeni_id`),
317
  KEY `vozidla_id` (`vozidla_id`),
318
  KEY `datum_id` (`datum_id`)
319
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ;
320

  
321
--
322
-- Vypisuji data pro tabulku `zaznam_prum_den`
323
--
324

  
325
INSERT INTO `zaznam_prum_den` (`id`, `vozidla_pocet`, `rychlost_prumer`, `smer`, `zarizeni_id`, `vozidla_id`, `datum_id`) VALUES
326
(1, 1, 65.4, 1, '056', 2, 97),
327
(2, 1, 65.789, 1, '056', 6, 97),
328
(3, 1, 12, 2, '056', 0, 97),
329
(4, 1, 16, 2, '056', 1, 97),
330
(5, 5, 89.15675, 2, '056', 2, 97),
331
(6, 1, -1, 2, '056', 3, 97),
332
(7, 1, 19.05, 2, '056', 4, 97),
333
(8, 2, 25.5, 2, '056', 8, 97),
334
(9, 1, 12, 1, '055', 0, 97),
335
(10, 1, 16, 1, '055', 1, 97),
336
(11, 2, 25.5, 1, '055', 2, 97),
337
(12, 1, -1, 1, '055', 3, 97),
338
(13, 1, 19.05, 1, '055', 4, 97),
339
(14, 5, 89.15675, 1, '055', 8, 97);
340

  
341
--
342
-- Omezení pro exportované tabulky
343
--
344

  
345
--
346
-- Omezení pro tabulku `ulice`
347
--
348
ALTER TABLE `ulice`
349
  ADD CONSTRAINT `fk_ulice_mesto` FOREIGN KEY (`mesto_id`) REFERENCES `mesto` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;
350

  
351
--
352
-- Omezení pro tabulku `zarizeni`
353
--
354
ALTER TABLE `zarizeni`
355
  ADD CONSTRAINT `fk_zarizeni_ulice1` FOREIGN KEY (`ulice_id`) REFERENCES `ulice` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;
356

  
357
--
358
-- Omezení pro tabulku `zaznam`
359
--
360
ALTER TABLE `zaznam`
361
  ADD CONSTRAINT `fk_zaznam_vozidla1` FOREIGN KEY (`vozidla_id`) REFERENCES `vozidlo` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
362
  ADD CONSTRAINT `fk_zaznam_zaznam_cas1` FOREIGN KEY (`zaznam_cas_id`) REFERENCES `zaznam_cas` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;
363

  
364
--
365
-- Omezení pro tabulku `zaznam_cas`
366
--
367
ALTER TABLE `zaznam_cas`
368
  ADD CONSTRAINT `zaznam_cas_ibfk_1` FOREIGN KEY (`datum_id`) REFERENCES `datum` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
369
  ADD CONSTRAINT `fk_zaznam_cas_zarizeni1` FOREIGN KEY (`zarizeni_id`) REFERENCES `zarizeni` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;
370

  
371
--
372
-- Omezení pro tabulku `zaznam_prum_den`
373
--
374
ALTER TABLE `zaznam_prum_den`
375
  ADD CONSTRAINT `zaznam_prum_den_ibfk_3` FOREIGN KEY (`datum_id`) REFERENCES `datum` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
376
  ADD CONSTRAINT `zaznam_prum_den_ibfk_1` FOREIGN KEY (`zarizeni_id`) REFERENCES `zarizeni` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
377
  ADD CONSTRAINT `zaznam_prum_den_ibfk_2` FOREIGN KEY (`vozidla_id`) REFERENCES `vozidlo` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;
378

  
379
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
380
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
381
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Také k dispozici: Unified diff