Completed
Push — master ( 48d981...ca573a )
by Yannick
07:38
created

SpotterArchive   D

Complexity

Total Complexity 187

Size/Duplication

Total Lines 1202
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Importance

Changes 0
Metric Value
dl 0
loc 1202
rs 4.4102
c 0
b 0
f 0
wmc 187
lcom 1
cbo 3

25 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
F getFilter() 0 66 38
B addSpotterArchiveData() 0 26 5
A getLastArchiveSpotterDataByIdent() 0 13 1
B getLastArchiveSpotterDataById() 0 24 1
A getAllArchiveSpotterDataById() 0 19 2
A getCoordArchiveSpotterDataById() 0 19 2
A getAltitudeArchiveSpotterDataByIdent() 0 19 2
A getAltitudeArchiveSpotterDataById() 0 19 2
A getAltitudeSpeedArchiveSpotterDataById() 0 19 2
A getLastAltitudeArchiveSpotterDataByIdent() 0 20 2
A getSpotterArchiveData() 0 10 1
A deleteSpotterArchiveTrackData() 0 13 2
C getMinLiveSpotterData() 0 61 11
C getMinLiveSpotterDataPlayback() 0 62 11
C getLiveSpotterCount() 0 40 11
F searchSpotterData() 0 328 54
A deleteSpotterArchiveData() 0 16 3
C getSpotterDataByIdent() 0 50 7
C getSpotterDataByOwner() 0 50 7
C getSpotterDataByPilot() 0 50 7
B countAllFlightOverCountries() 0 39 6
A getDateArchiveSpotterDataById() 0 10 1
A getDateArchiveSpotterDataByIdent() 0 10 1
C getSpotterDataByAirport() 0 49 7

How to fix   Complexity   

Complex Class

Complex classes like SpotterArchive often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use SpotterArchive, and based on these observations, apply Extract Interface, too.

1
<?php
2
class SpotterArchive {
3
	public $global_query = "SELECT spotter_archive.* FROM spotter_archive";
4
	public $db;
5
6
	public function __construct($dbc = null) {
7
		$Connection = new Connection($dbc);
8
		$this->db = $Connection->db;
9
	}
10
11
    /**
12
    * Get SQL query part for filter used
13
    * @param Array $filter the filter
14
    * @return Array the SQL part
15
    */
16
    public function getFilter($filter = array(),$where = false,$and = false) {
17
	global $globalFilter, $globalStatsFilters, $globalFilterName;
18
	$filters = array();
19
	if (is_array($globalStatsFilters) && isset($globalStatsFilters[$globalFilterName])) {
20
		if (isset($globalStatsFilters[$globalFilterName][0]['source'])) {
21
			$filters = $globalStatsFilters[$globalFilterName];
22
		} else {
23
			$filter = array_merge($filter,$globalStatsFilters[$globalFilterName]);
24
		}
25
	}
26
	if (is_array($globalFilter)) $filter = array_merge($filter,$globalFilter);
27
	$filter_query_join = '';
28
	$filter_query_where = '';
29
	foreach($filters as $flt) {
30
	    if (isset($flt['airlines']) && !empty($flt['airlines'])) {
31
		if ($flt['airlines'][0] != '') {
32
		    if (isset($flt['source'])) {
33
			$filter_query_join .= " INNER JOIN (SELECT flightaware_id FROM spotter_archive_output WHERE spotter_archive_output.airline_icao IN ('".implode("','",$flt['airlines'])."') AND spotter_archive_output.format_source IN ('".implode("','",$flt['source'])."')) so ON so.flightaware_id = spotter_archive_output.flightaware_id";
34
		    } else {
35
			$filter_query_join .= " INNER JOIN (SELECT flightaware_id FROM spotter_archive_output WHERE spotter_archive_output.airline_icao IN ('".implode("','",$flt['airlines'])."')) so ON so.flightaware_id = spotter_archive_output.flightaware_id";
36
		    }
37
		}
38
	    }
39
	    if (isset($flt['pilots_id']) && !empty($flt['pilots_id'])) {
40
		if (isset($flt['source'])) {
41
		    $filter_query_join .= " INNER JOIN (SELECT flightaware_id FROM spotter_archive_output WHERE spotter_archive_output.pilot_id IN ('".implode("','",$flt['pilots_id'])."') AND spotter_archive_output.format_source IN ('".implode("','",$flt['source'])."')) so ON so.flightaware_id = spotter_archive_output.flightaware_id";
42
		} else {
43
		    $filter_query_join .= " INNER JOIN (SELECT flightaware_id FROM spotter_archive_output WHERE spotter_archive_output.pilot_id IN ('".implode("','",$flt['pilots_id'])."')) so ON so.flightaware_id = spotter_archive_output.flightaware_id";
44
		}
45
	    }
46
	    if ((isset($flt['airlines']) && empty($flt['airlines']) && isset($flt['pilots_id']) && empty($flt['pilots_id'])) || (!isset($flt['airlines']) && !isset($flt['pilots_id']))) {
47
		if (isset($flt['source'])) {
48
		    $filter_query_join .= " INNER JOIN (SELECT flightaware_id FROM spotter_output WHERE spotter_output.format_source IN ('".implode("','",$flt['source'])."')) so ON so.flightaware_id = spotter_archive_output.flightaware_id";
49
		}
50
	    }
51
	}
52
	if (isset($filter['airlines']) && !empty($filter['airlines'])) {
53
	    if ($filter['airlines'][0] != '') {
54
		$filter_query_join .= " INNER JOIN (SELECT flightaware_id FROM spotter_archive_output WHERE spotter_archive_output.airline_icao IN ('".implode("','",$filter['airlines'])."')) so ON so.flightaware_id = spotter_archive_output.flightaware_id";
55
	    }
56
	}
57
	
58
	if (isset($filter['airlinestype']) && !empty($filter['airlinestype'])) {
59
	    $filter_query_join .= " INNER JOIN (SELECT flightaware_id FROM spotter_archive_output WHERE spotter_archive_output.airline_type = '".$filter['airlinestype']."') sa ON sa.flightaware_id = spotter_archive_output.flightaware_id ";
60
	}
61
	if (isset($filter['pilots_id']) && !empty($filter['pilots_id'])) {
62
	    $filter_query_join .= " INNER JOIN (SELECT flightaware_id FROM spotter_archive_output WHERE spotter_archive_output.pilot_id IN ('".implode("','",$filter['pilots_id'])."')) so ON so.flightaware_id = spotter_archive_output.flightaware_id";
63
	}
64
	if (isset($filter['source']) && !empty($filter['source'])) {
65
	    $filter_query_where = " WHERE format_source IN ('".implode("','",$filter['source'])."')";
66
	}
67
	if (isset($filter['ident']) && !empty($filter['ident'])) {
68
	    $filter_query_where = " WHERE ident = '".$filter['ident']."'";
69
	}
70
	if (isset($filter['source_aprs']) && !empty($filter['source_aprs'])) {
71
	    if ($filter_query_where == '') {
72
		$filter_query_where = " WHERE format_source = 'aprs' AND source_name IN ('".implode("','",$filter['source_aprs'])."')";
73
	    } else {
74
		$filter_query_where .= " AND format_source = 'aprs' AND source_name IN ('".implode("','",$filter['source_aprs'])."')";
75
	    }
76
	}
77
	if ($filter_query_where == '' && $where) $filter_query_where = ' WHERE';
78
	elseif ($filter_query_where != '' && $and) $filter_query_where .= ' AND';
79
	$filter_query = $filter_query_join.$filter_query_where;
80
	return $filter_query;
81
    }
82
83
	// Spotter_archive
84
	public function addSpotterArchiveData($flightaware_id = '', $ident = '', $registration = '', $airline_name = '', $airline_icao = '', $airline_country = '', $airline_type = '', $aircraft_icao = '', $aircraft_shadow = '', $aircraft_name = '', $aircraft_manufacturer = '', $departure_airport_icao = '', $departure_airport_name = '', $departure_airport_city = '', $departure_airport_country = '', $departure_airport_time = '',$arrival_airport_icao = '', $arrival_airport_name = '', $arrival_airport_city ='', $arrival_airport_country = '', $arrival_airport_time = '', $route_stop = '', $date = '',$latitude = '', $longitude = '', $waypoints = '', $altitude = '', $heading = '', $ground_speed = '', $squawk = '', $ModeS = '', $pilot_id = '', $pilot_name = '',$verticalrate = '',$format_source = '', $source_name = '', $over_country = '') {
85
		require_once(dirname(__FILE__).'/class.Spotter.php');
86
		if ($over_country == '') {
87
			$Spotter = new Spotter($this->db);
88
			$data_country = $Spotter->getCountryFromLatitudeLongitude($latitude,$longitude);
89
			if (!empty($data_country)) $country = $data_country['iso2'];
90
			else $country = '';
91
		} else $country = $over_country;
92
		if ($airline_type === NULL) $airline_type ='';
93
	
94
		//if ($country == '') echo "\n".'************ UNKNOW COUNTRY ****************'."\n";
95
		//else echo "\n".'*/*/*/*/*/*/*/ Country : '.$country.' */*/*/*/*/*/*/*/*/'."\n";
96
97
		// Route is not added in spotter_archive
98
		$query  = "INSERT INTO spotter_archive (flightaware_id, ident, registration, airline_name, airline_icao, airline_country, airline_type, aircraft_icao, aircraft_shadow, aircraft_name, aircraft_manufacturer, departure_airport_icao, departure_airport_name, departure_airport_city, departure_airport_country, departure_airport_time,arrival_airport_icao, arrival_airport_name, arrival_airport_city, arrival_airport_country, arrival_airport_time, route_stop, date,latitude, longitude, waypoints, altitude, heading, ground_speed, squawk, ModeS, pilot_id, pilot_name, verticalrate,format_source,over_country,source_name)
99
		        VALUES (:flightaware_id, :ident, :registration, :airline_name, :airline_icao, :airline_country, :airline_type, :aircraft_icao, :aircraft_shadow, :aircraft_name, :aircraft_manufacturer, :departure_airport_icao, :departure_airport_name, :departure_airport_city, :departure_airport_country, :departure_airport_time,:arrival_airport_icao, :arrival_airport_name, :arrival_airport_city, :arrival_airport_country, :arrival_airport_time, :route_stop, :date,:latitude, :longitude, :waypoints, :altitude, :heading, :ground_speed, :squawk, :ModeS, :pilot_id, :pilot_name, :verticalrate, :format_source, :over_country, :source_name)";
100
101
		$query_values = array(':flightaware_id' => $flightaware_id, ':ident' => $ident, ':registration' => $registration, ':airline_name' => $airline_name, ':airline_icao' => $airline_icao, ':airline_country' => $airline_country, ':airline_type' => $airline_type, ':aircraft_icao' => $aircraft_icao, ':aircraft_shadow' => $aircraft_shadow, ':aircraft_name' => $aircraft_name, ':aircraft_manufacturer' => $aircraft_manufacturer, ':departure_airport_icao' => $departure_airport_icao, ':departure_airport_name' => $departure_airport_name, ':departure_airport_city' => $departure_airport_city, ':departure_airport_country' => $departure_airport_country, ':departure_airport_time' => $departure_airport_time,':arrival_airport_icao' => $arrival_airport_icao, ':arrival_airport_name' => $arrival_airport_name, ':arrival_airport_city' => $arrival_airport_city, ':arrival_airport_country' => $arrival_airport_country, ':arrival_airport_time' => $arrival_airport_time, ':route_stop' => $route_stop, ':date' => $date,':latitude' => $latitude, ':longitude' => $longitude, ':waypoints' => $waypoints, ':altitude' => $altitude, ':heading' => $heading, ':ground_speed' => $ground_speed, ':squawk' => $squawk, ':ModeS' => $ModeS, ':pilot_id' => $pilot_id, ':pilot_name' => $pilot_name, ':verticalrate' => $verticalrate, ':format_source' => $format_source, ':over_country' => $country, ':source_name' => $source_name);
102
		try {
103
			$sth = $this->db->prepare($query);
104
			$sth->execute($query_values);
105
		} catch(PDOException $e) {
106
			return "error : ".$e->getMessage();
107
		}
108
		return "success";
109
	}
110
111
112
        /**
113
        * Gets all the spotter information based on a particular callsign
114
        *
115
        * @return Array the spotter information
116
        *
117
        */
118
        public function getLastArchiveSpotterDataByIdent($ident)
119
        {
120
		$Spotter = new Spotter($this->db);
121
                date_default_timezone_set('UTC');
122
123
                $ident = filter_var($ident, FILTER_SANITIZE_STRING);
124
                //$query  = "SELECT spotter_archive.* FROM spotter_archive INNER JOIN (SELECT l.flightaware_id, max(l.date) as maxdate FROM spotter_archive l WHERE l.ident = :ident GROUP BY l.flightaware_id) s on spotter_archive.flightaware_id = s.flightaware_id AND spotter_archive.date = s.maxdate LIMIT 1";
125
                $query  = "SELECT spotter_archive.* FROM spotter_archive WHERE ident = :ident ORDER BY date DESC LIMIT 1";
126
127
                $spotter_array = $Spotter->getDataFromDB($query,array(':ident' => $ident));
128
129
                return $spotter_array;
130
        }
131
132
133
        /**
134
        * Gets last the spotter information based on a particular id
135
        *
136
        * @return Array the spotter information
137
        *
138
        */
139
        public function getLastArchiveSpotterDataById($id)
140
        {
141
    		$Spotter = new Spotter($this->db);
142
                date_default_timezone_set('UTC');
143
                $id = filter_var($id, FILTER_SANITIZE_STRING);
144
                //$query  = SpotterArchive->$global_query." WHERE spotter_archive.flightaware_id = :id";
145
                //$query  = "SELECT spotter_archive.* FROM spotter_archive INNER JOIN (SELECT l.flightaware_id, max(l.date) as maxdate FROM spotter_archive l WHERE l.flightaware_id = :id GROUP BY l.flightaware_id) s on spotter_archive.flightaware_id = s.flightaware_id AND spotter_archive.date = s.maxdate LIMIT 1";
146
                $query  = "SELECT * FROM spotter_archive WHERE flightaware_id = :id ORDER BY date DESC LIMIT 1";
147
148
//              $spotter_array = Spotter->getDataFromDB($query,array(':id' => $id));
149
                  /*
150
                try {
151
                        $Connection = new Connection();
152
                        $sth = Connection->$db->prepare($query);
153
                        $sth->execute(array(':id' => $id));
154
                } catch(PDOException $e) {
155
                        return "error";
156
                }
157
                $spotter_array = $sth->fetchAll(PDO->FETCH_ASSOC);
158
                */
159
                $spotter_array = $Spotter->getDataFromDB($query,array(':id' => $id));
160
161
                return $spotter_array;
162
        }
163
164
        /**
165
        * Gets all the spotter information based on a particular id
166
        *
167
        * @return Array the spotter information
168
        *
169
        */
170
        public function getAllArchiveSpotterDataById($id)
171
        {
172
                date_default_timezone_set('UTC');
173
                $id = filter_var($id, FILTER_SANITIZE_STRING);
174
                $query  = $this->global_query." WHERE spotter_archive.flightaware_id = :id";
175
176
//              $spotter_array = Spotter->getDataFromDB($query,array(':id' => $id));
177
178
                try {
179
                        $sth = $this->db->prepare($query);
180
                        $sth->execute(array(':id' => $id));
181
                } catch(PDOException $e) {
182
                        echo $e->getMessage();
183
                        die;
184
                }
185
                $spotter_array = $sth->fetchAll(PDO::FETCH_ASSOC);
186
187
                return $spotter_array;
188
        }
189
190
        /**
191
        * Gets coordinate & time spotter information based on a particular id
192
        *
193
        * @return Array the spotter information
194
        *
195
        */
196
        public function getCoordArchiveSpotterDataById($id)
197
        {
198
                date_default_timezone_set('UTC');
199
                $id = filter_var($id, FILTER_SANITIZE_STRING);
200
                $query  = "SELECT spotter_archive.latitude, spotter_archive.longitude, spotter_archive.date FROM spotter_archive WHERE spotter_archive.flightaware_id = :id";
201
202
//              $spotter_array = Spotter->getDataFromDB($query,array(':id' => $id));
203
204
                try {
205
                        $sth = $this->db->prepare($query);
206
                        $sth->execute(array(':id' => $id));
207
                } catch(PDOException $e) {
208
                        echo $e->getMessage();
209
                        die;
210
                }
211
                $spotter_array = $sth->fetchAll(PDO::FETCH_ASSOC);
212
213
                return $spotter_array;
214
        }
215
216
217
        /**
218
        * Gets altitude information based on a particular callsign
219
        *
220
        * @return Array the spotter information
221
        *
222
        */
223
        public function getAltitudeArchiveSpotterDataByIdent($ident)
224
        {
225
226
                date_default_timezone_set('UTC');
227
228
                $ident = filter_var($ident, FILTER_SANITIZE_STRING);
229
                $query  = "SELECT spotter_archive.altitude, spotter_archive.date FROM spotter_archive WHERE spotter_archive.ident = :ident AND spotter_archive.latitude <> 0 AND spotter_archive.longitude <> 0 ORDER BY date";
230
231
                try {
232
                        $sth = $this->db->prepare($query);
233
                        $sth->execute(array(':ident' => $ident));
234
                } catch(PDOException $e) {
235
                        echo $e->getMessage();
236
                        die;
237
                }
238
                $spotter_array = $sth->fetchAll(PDO::FETCH_ASSOC);
239
240
                return $spotter_array;
241
        }
242
243
        /**
244
        * Gets altitude information based on a particular id
245
        *
246
        * @return Array the spotter information
247
        *
248
        */
249
        public function getAltitudeArchiveSpotterDataById($id)
250
        {
251
252
                date_default_timezone_set('UTC');
253
254
                $id = filter_var($id, FILTER_SANITIZE_STRING);
255
                $query  = "SELECT spotter_archive.altitude, spotter_archive.date FROM spotter_archive WHERE spotter_archive.flightaware_id = :id AND spotter_archive.latitude <> 0 AND spotter_archive.longitude <> 0 ORDER BY date";
256
257
                try {
258
                        $sth = $this->db->prepare($query);
259
                        $sth->execute(array(':id' => $id));
260
                } catch(PDOException $e) {
261
                        echo $e->getMessage();
262
                        die;
263
                }
264
                $spotter_array = $sth->fetchAll(PDO::FETCH_ASSOC);
265
266
                return $spotter_array;
267
        }
268
269
        /**
270
        * Gets altitude & speed information based on a particular id
271
        *
272
        * @return Array the spotter information
273
        *
274
        */
275
        public function getAltitudeSpeedArchiveSpotterDataById($id)
276
        {
277
278
                date_default_timezone_set('UTC');
279
280
                $id = filter_var($id, FILTER_SANITIZE_STRING);
281
                $query  = "SELECT spotter_archive.altitude, spotter_archive.ground_speed, spotter_archive.date FROM spotter_archive WHERE spotter_archive.flightaware_id = :id ORDER BY date";
282
283
                try {
284
                        $sth = $this->db->prepare($query);
285
                        $sth->execute(array(':id' => $id));
286
                } catch(PDOException $e) {
287
                        echo $e->getMessage();
288
                        die;
289
                }
290
                $spotter_array = $sth->fetchAll(PDO::FETCH_ASSOC);
291
292
                return $spotter_array;
293
        }
294
295
296
        /**
297
        * Gets altitude information based on a particular callsign
298
        *
299
        * @return Array the spotter information
300
        *
301
        */
302
        public function getLastAltitudeArchiveSpotterDataByIdent($ident)
303
        {
304
305
                date_default_timezone_set('UTC');
306
307
                $ident = filter_var($ident, FILTER_SANITIZE_STRING);
308
                $query  = "SELECT spotter_archive.altitude, spotter_archive.date FROM spotter_archive INNER JOIN (SELECT l.flightaware_id, max(l.date) as maxdate FROM spotter_archive l WHERE l.ident = :ident GROUP BY l.flightaware_id) s on spotter_archive.flightaware_id = s.flightaware_id AND spotter_archive.date = s.maxdate LIMIT 1";
309
//                $query  = "SELECT spotter_archive.altitude, spotter_archive.date FROM spotter_archive WHERE spotter_archive.ident = :ident";
310
311
                try {
312
                        $sth = $this->db->prepare($query);
313
                        $sth->execute(array(':ident' => $ident));
314
                } catch(PDOException $e) {
315
                        echo $e->getMessage();
316
                        die;
317
                }
318
                $spotter_array = $sth->fetchAll(PDO::FETCH_ASSOC);
319
320
                return $spotter_array;
321
        }
322
323
324
325
       /**
326
        * Gets all the archive spotter information
327
        *
328
        * @return Array the spotter information
329
        *
330
        */
331
        public function getSpotterArchiveData($ident,$flightaware_id,$date)
332
        {
333
    		$Spotter = new Spotter($this->db);
334
                $ident = filter_var($ident, FILTER_SANITIZE_STRING);
335
                $query  = "SELECT spotter_live.* FROM spotter_live INNER JOIN (SELECT l.flightaware_id, max(l.date) as maxdate FROM spotter_live l WHERE l.ident = :ident AND l.flightaware_id = :flightaware_id AND l.date LIKE :date GROUP BY l.flightaware_id) s on spotter_live.flightaware_id = s.flightaware_id AND spotter_live.date = s.maxdate";
336
337
                $spotter_array = $Spotter->getDataFromDB($query,array(':ident' => $ident,':flightaware_id' => $flightaware_id,':date' => $date.'%'));
338
339
                return $spotter_array;
340
        }
341
        
342
        public function deleteSpotterArchiveTrackData()
343
        {
344
		global $globalArchiveKeepTrackMonths;
345
                date_default_timezone_set('UTC');
346
		$query = 'DELETE FROM spotter_archive WHERE spotter_archive.date < DATE_SUB(UTC_TIMESTAMP(), INTERVAL '.$globalArchiveKeepTrackMonths.' MONTH)';
347
                try {
348
                        $sth = $this->db->prepare($query);
349
                        $sth->execute();
350
                } catch(PDOException $e) {
351
                        echo $e->getMessage();
352
                        die;
353
                }
354
	}
355
356
	/**
357
        * Gets Minimal Live Spotter data
358
        *
359
        * @return Array the spotter information
360
        *
361
        */
362
        public function getMinLiveSpotterData($begindate,$enddate,$filter = array())
363
        {
364
                global $globalDBdriver, $globalLiveInterval;
365
                date_default_timezone_set('UTC');
366
367
                $filter_query = '';
368
                if (isset($filter['source']) && !empty($filter['source'])) {
369
                        $filter_query .= " AND format_source IN ('".implode("','",$filter['source'])."') ";
370
                }
371
                // Use spotter_output also ?
372
                if (isset($filter['airlines']) && !empty($filter['airlines'])) {
373
                        $filter_query .= " INNER JOIN (SELECT flightaware_id FROM spotter_archive_output WHERE spotter_archive_output.airline_icao IN ('".implode("','",$filter['airlines'])."')) so ON so.flightaware_id = spotter_archive.flightaware_id ";
374
                }
375
                if (isset($filter['airlinestype']) && !empty($filter['airlinestype'])) {
376
                        $filter_query .= " INNER JOIN (SELECT flightaware_id FROM spotter_archive_output WHERE spotter_archive_output.airline_type = '".$filter['airlinestype']."') sa ON sa.flightaware_id = spotter_archive.flightaware_id ";
377
                }
378
                if (isset($filter['source_aprs']) && !empty($filter['source_aprs'])) {
379
                        $filter_query = " AND format_source = 'aprs' AND source_name IN ('".implode("','",$filter['source_aprs'])."')";
380
                }
381
382
                //if (!isset($globalLiveInterval)) $globalLiveInterval = '200';
383
                if ($globalDBdriver == 'mysql') {
384
                        /*
385
                        $query  = 'SELECT a.aircraft_shadow, spotter_archive.ident, spotter_archive.flightaware_id, spotter_archive.aircraft_icao, spotter_archive.departure_airport_icao as departure_airport, spotter_archive.arrival_airport_icao as arrival_airport, spotter_archive.latitude, spotter_archive.longitude, spotter_archive.altitude, spotter_archive.heading, spotter_archive.ground_speed, spotter_archive.squawk 
386
                    		    FROM spotter_archive 
387
                    		    INNER JOIN (SELECT l.flightaware_id, max(l.date) as maxdate FROM spotter_archive l WHERE (l.date BETWEEN '."'".$begindate."'".' AND '."'".$enddate."'".') GROUP BY l.flightaware_id) s on spotter_archive.flightaware_id = s.flightaware_id AND spotter_archive.date = s.maxdate '.$filter_query.'LEFT JOIN (SELECT aircraft_shadow,icao FROM aircraft) a ON spotter_archive.aircraft_icao = a.icao';
388
			*/
389
/*
390
			$query  = 'SELECT a.aircraft_shadow, spotter_archive.ident, spotter_archive.flightaware_id, spotter_archive.aircraft_icao, spotter_archive.departure_airport_icao as departure_airport, spotter_archive.arrival_airport_icao as arrival_airport, spotter_archive.latitude, spotter_archive.longitude, spotter_archive.altitude, spotter_archive.heading, spotter_archive.ground_speed, spotter_archive.squawk 
391
				    FROM spotter_archive 
392
				    INNER JOIN (SELECT l.flightaware_id, max(l.date) as maxdate 
393
						FROM spotter_archive l 
394
						WHERE (l.date BETWEEN DATE_SUB('."'".$begindate."'".',INTERVAL '.$globalLiveInterval.' SECOND) AND '."'".$begindate."'".') 
395
						GROUP BY l.flightaware_id) s on spotter_archive.flightaware_id = s.flightaware_id 
396
				    AND spotter_archive.date = s.maxdate '.$filter_query.'LEFT JOIN (SELECT aircraft_shadow,icao FROM aircraft) a ON spotter_archive.aircraft_icao = a.icao';
397
*/
398
			$query  = 'SELECT spotter_archive.date,spotter_archive.flightaware_id, spotter_archive.ident, spotter_archive.aircraft_icao, spotter_archive.departure_airport_icao as departure_airport, spotter_archive.arrival_airport_icao as arrival_airport, spotter_archive.latitude, spotter_archive.longitude, spotter_archive.altitude, spotter_archive.heading, spotter_archive.ground_speed, spotter_archive.squawk, a.aircraft_shadow,a.engine_type, a.engine_count, a.wake_category 
399
				    FROM spotter_archive 
400
				    INNER JOIN (SELECT * FROM aircraft) a on spotter_archive.aircraft_icao = a.icao
401
				    WHERE spotter_archive.date BETWEEN '."'".$begindate."'".' AND '."'".$begindate."'".' 
402
                        	    '.$filter_query.' ORDER BY flightaware_id';
403
                } else {
404
                        //$query  = 'SELECT spotter_archive.ident, spotter_archive.flightaware_id, spotter_archive.aircraft_icao, spotter_archive.departure_airport_icao as departure_airport, spotter_archive.arrival_airport_icao as arrival_airport, spotter_archive.latitude, spotter_archive.longitude, spotter_archive.altitude, spotter_archive.heading, spotter_archive.ground_speed, spotter_archive.squawk, a.aircraft_shadow FROM spotter_archive INNER JOIN (SELECT l.flightaware_id, max(l.date) as maxdate FROM spotter_archive l WHERE DATE_SUB(UTC_TIMESTAMP(),INTERVAL '.$globalLiveInterval.' SECOND) <= l.date GROUP BY l.flightaware_id) s on spotter_archive.flightaware_id = s.flightaware_id AND spotter_archive.date = s.maxdate '.$filter_query.'INNER JOIN (SELECT * FROM aircraft) a on spotter_archive.aircraft_icao = a.icao';
405
                        $query  = 'SELECT spotter_archive.date,spotter_archive.flightaware_id, spotter_archive.ident, spotter_archive.aircraft_icao, spotter_archive.departure_airport_icao as departure_airport, spotter_archive.arrival_airport_icao as arrival_airport, spotter_archive.latitude, spotter_archive.longitude, spotter_archive.altitude, spotter_archive.heading, spotter_archive.ground_speed, spotter_archive.squawk, a.aircraft_shadow,a.engine_type, a.engine_count, a.wake_category 
406
                        	    FROM spotter_archive 
407
                        	    INNER JOIN (SELECT * FROM aircraft) a on spotter_archive.aircraft_icao = a.icao
408
                        	    WHERE spotter_archive.date >= '."'".$begindate."'".' AND spotter_archive.date <= '."'".$enddate."'".'
409
                        	    '.$filter_query.' ORDER BY flightaware_id';
410
                }
411
                //echo $query;
412
                try {
413
                        $sth = $this->db->prepare($query);
414
                        $sth->execute();
415
                } catch(PDOException $e) {
416
                        echo $e->getMessage();
417
                        die;
418
                }
419
                $spotter_array = $sth->fetchAll(PDO::FETCH_ASSOC);
420
421
                return $spotter_array;
422
        }
423
424
	/**
425
        * Gets Minimal Live Spotter data
426
        *
427
        * @return Array the spotter information
428
        *
429
        */
430
        public function getMinLiveSpotterDataPlayback($begindate,$enddate,$filter = array())
431
        {
432
                global $globalDBdriver, $globalLiveInterval;
433
                date_default_timezone_set('UTC');
434
435
                $filter_query = '';
436
                if (isset($filter['source']) && !empty($filter['source'])) {
437
                        $filter_query .= " AND format_source IN ('".implode("','",$filter['source'])."') ";
438
                }
439
                // Should use spotter_output also ?
440
                if (isset($filter['airlines']) && !empty($filter['airlines'])) {
441
                        $filter_query .= " INNER JOIN (SELECT flightaware_id FROM spotter_archive_output WHERE spotter_archive_output.airline_icao IN ('".implode("','",$filter['airlines'])."')) so ON so.flightaware_id = spotter_archive.flightaware_id ";
442
                }
443
                if (isset($filter['airlinestype']) && !empty($filter['airlinestype'])) {
444
                        $filter_query .= " INNER JOIN (SELECT flightaware_id FROM spotter_archive_output WHERE spotter_archive_output.airline_type = '".$filter['airlinestype']."') sa ON sa.flightaware_id = spotter_archive.flightaware_id ";
445
                }
446
                if (isset($filter['source_aprs']) && !empty($filter['source_aprs'])) {
447
                        $filter_query = " AND format_source = 'aprs' AND source_name IN ('".implode("','",$filter['source_aprs'])."')";
448
                }
449
450
                //if (!isset($globalLiveInterval)) $globalLiveInterval = '200';
451
                if ($globalDBdriver == 'mysql') {
452
                        /*
453
                        $query  = 'SELECT a.aircraft_shadow, spotter_archive.ident, spotter_archive.flightaware_id, spotter_archive.aircraft_icao, spotter_archive.departure_airport_icao as departure_airport, spotter_archive.arrival_airport_icao as arrival_airport, spotter_archive.latitude, spotter_archive.longitude, spotter_archive.altitude, spotter_archive.heading, spotter_archive.ground_speed, spotter_archive.squawk 
454
                    		    FROM spotter_archive 
455
                    		    INNER JOIN (SELECT l.flightaware_id, max(l.date) as maxdate FROM spotter_archive l WHERE (l.date BETWEEN '."'".$begindate."'".' AND '."'".$enddate."'".') GROUP BY l.flightaware_id) s on spotter_archive.flightaware_id = s.flightaware_id AND spotter_archive.date = s.maxdate '.$filter_query.'LEFT JOIN (SELECT aircraft_shadow,icao FROM aircraft) a ON spotter_archive.aircraft_icao = a.icao';
456
			*/
457
			$query  = 'SELECT a.aircraft_shadow, spotter_archive_output.ident, spotter_archive_output.flightaware_id, spotter_archive_output.aircraft_icao, spotter_archive_output.departure_airport_icao as departure_airport, spotter_archive_output.arrival_airport_icao as arrival_airport, spotter_archive_output.latitude, spotter_archive_output.longitude, spotter_archive_output.altitude, spotter_archive_output.heading, spotter_archive_output.ground_speed, spotter_archive_output.squawk 
458
				    FROM spotter_archive_output 
459
				    LEFT JOIN (SELECT aircraft_shadow,icao FROM aircraft) a ON spotter_archive_output.aircraft_icao = a.icao 
460
				    WHERE (spotter_archive_output.date BETWEEN '."'".$begindate."'".' AND '."'".$enddate."'".') 
461
                        	    '.$filter_query.' GROUP BY spotter_archive_output.flightaware_id, spotter_archive_output.ident, spotter_archive_output.aircraft_icao, spotter_archive_output.departure_airport_icao, spotter_archive_output.arrival_airport_icao, spotter_archive_output.latitude, spotter_archive_output.longitude, spotter_archive_output.altitude, spotter_archive_output.heading, spotter_archive_output.ground_speed, spotter_archive_output.squawk, a.aircraft_shadow';
462
463
                } else {
464
                        //$query  = 'SELECT spotter_archive_output.ident, spotter_archive_output.flightaware_id, spotter_archive_output.aircraft_icao, spotter_archive_output.departure_airport_icao as departure_airport, spotter_archive_output.arrival_airport_icao as arrival_airport, spotter_archive_output.latitude, spotter_archive_output.longitude, spotter_archive_output.altitude, spotter_archive_output.heading, spotter_archive_output.ground_speed, spotter_archive_output.squawk, a.aircraft_shadow FROM spotter_archive_output INNER JOIN (SELECT l.flightaware_id, max(l.date) as maxdate FROM spotter_archive_output l WHERE DATE_SUB(UTC_TIMESTAMP(),INTERVAL '.$globalLiveInterval.' SECOND) <= l.date GROUP BY l.flightaware_id) s on spotter_archive_output.flightaware_id = s.flightaware_id AND spotter_archive_output.date = s.maxdate '.$filter_query.'INNER JOIN (SELECT * FROM aircraft) a on spotter_archive_output.aircraft_icao = a.icao';
465
                       /*
466
                        $query  = 'SELECT spotter_archive_output.ident, spotter_archive_output.flightaware_id, spotter_archive_output.aircraft_icao, spotter_archive_output.departure_airport_icao as departure_airport, spotter_archive_output.arrival_airport_icao as arrival_airport, spotter_archive_output.latitude, spotter_archive_output.longitude, spotter_archive_output.altitude, spotter_archive_output.heading, spotter_archive_output.ground_speed, spotter_archive_output.squawk, a.aircraft_shadow
467
                        	    FROM spotter_archive_output 
468
                        	    INNER JOIN (SELECT * FROM aircraft) a on spotter_archive_output.aircraft_icao = a.icao
469
                        	    WHERE spotter_archive_output.date >= '."'".$begindate."'".' AND spotter_archive_output.date <= '."'".$enddate."'".'
470
                        	    '.$filter_query.' GROUP BY spotter_archive_output.flightaware_id, spotter_archive_output.ident, spotter_archive_output.aircraft_icao, spotter_archive_output.departure_airport_icao, spotter_archive_output.arrival_airport_icao, spotter_archive_output.latitude, spotter_archive_output.longitude, spotter_archive_output.altitude, spotter_archive_output.heading, spotter_archive_output.ground_speed, spotter_archive_output.squawk, a.aircraft_shadow';
471
                        */
472
                        $query  = 'SELECT DISTINCT spotter_archive_output.flightaware_id, spotter_archive_output.ident, spotter_archive_output.aircraft_icao, spotter_archive_output.departure_airport_icao as departure_airport, spotter_archive_output.arrival_airport_icao as arrival_airport, spotter_archive_output.latitude, spotter_archive_output.longitude, spotter_archive_output.altitude, spotter_archive_output.heading, spotter_archive_output.ground_speed, spotter_archive_output.squawk, a.aircraft_shadow
473
                        	    FROM spotter_archive_output 
474
                        	    INNER JOIN (SELECT * FROM aircraft) a on spotter_archive_output.aircraft_icao = a.icao
475
                        	    WHERE spotter_archive_output.date >= '."'".$begindate."'".' AND spotter_archive_output.date <= '."'".$enddate."'".'
476
                        	    '.$filter_query.' LIMIT 200 OFFSET 0';
477
//                        	    .' GROUP BY spotter_output.flightaware_id, spotter_output.ident, spotter_output.aircraft_icao, spotter_output.departure_airport_icao, spotter_output.arrival_airport_icao, spotter_output.latitude, spotter_output.longitude, spotter_output.altitude, spotter_output.heading, spotter_output.ground_speed, spotter_output.squawk, a.aircraft_shadow';
478
                        	    
479
                }
480
                //echo $query;
481
                try {
482
                        $sth = $this->db->prepare($query);
483
                        $sth->execute();
484
                } catch(PDOException $e) {
485
                        echo $e->getMessage();
486
                        die;
487
                }
488
                $spotter_array = $sth->fetchAll(PDO::FETCH_ASSOC);
489
490
                return $spotter_array;
491
        }
492
493
	 /**
494
        * Gets count Live Spotter data
495
        *
496
        * @return Array the spotter information
497
        *
498
        */
499
        public function getLiveSpotterCount($begindate,$enddate,$filter = array())
500
        {
501
                global $globalDBdriver, $globalLiveInterval;
502
                date_default_timezone_set('UTC');
503
504
                $filter_query = '';
505
                if (isset($filter['source']) && !empty($filter['source'])) {
506
                        $filter_query .= " AND format_source IN ('".implode("','",$filter['source'])."') ";
507
                }
508
                if (isset($filter['airlines']) && !empty($filter['airlines'])) {
509
                        $filter_query .= " INNER JOIN (SELECT flightaware_id FROM spotter_output WHERE spotter_output.airline_icao IN ('".implode("','",$filter['airlines'])."')) so ON so.flightaware_id = spotter_archive.flightaware_id ";
510
                }
511
                if (isset($filter['airlinestype']) && !empty($filter['airlinestype'])) {
512
                        $filter_query .= " INNER JOIN (SELECT flightaware_id FROM spotter_output WHERE spotter_output.airline_type = '".$filter['airlinestype']."') sa ON sa.flightaware_id = spotter_archive.flightaware_id ";
513
                }
514
                if (isset($filter['source_aprs']) && !empty($filter['source_aprs'])) {
515
                        $filter_query = " AND format_source = 'aprs' AND source_name IN ('".implode("','",$filter['source_aprs'])."')";
516
                }
517
518
                //if (!isset($globalLiveInterval)) $globalLiveInterval = '200';
519
                if ($globalDBdriver == 'mysql') {
520
			$query = 'SELECT COUNT(DISTINCT flightaware_id) as nb 
521
			FROM spotter_archive l 
522
			WHERE (l.date BETWEEN DATE_SUB('."'".$begindate."'".',INTERVAL '.$globalLiveInterval.' SECOND) AND '."'".$begindate."'".')'.$filter_query;
523
                } else {
524
			$query = 'SELECT COUNT(DISTINCT flightaware_id) as nb FROM spotter_archive l WHERE (l.date BETWEEN '."'".$begindate."' - INTERVAL '".$globalLiveInterval." SECONDS' AND "."'".$enddate."'".')'.$filter_query;
525
                }
526
                //echo $query;
527
                try {
528
                        $sth = $this->db->prepare($query);
529
                        $sth->execute();
530
                } catch(PDOException $e) {
531
                        echo $e->getMessage();
532
                        die;
533
                }
534
		$result = $sth->fetch(PDO::FETCH_ASSOC);
535
		$sth->closeCursor();
536
                return $result['nb'];
537
538
        }
539
540
541
542
	// Spotter_Archive_output
543
	
544
    /**
545
    * Gets all the spotter information
546
    *
547
    * @return Array the spotter information
548
    *
549
    */
550
    public function searchSpotterData($q = '', $registration = '', $aircraft_icao = '', $aircraft_manufacturer = '', $highlights = '', $airline_icao = '', $airline_country = '', $airline_type = '', $airport = '', $airport_country = '', $callsign = '', $departure_airport_route = '', $arrival_airport_route = '', $owner = '',$pilot_id = '',$pilot_name = '',$altitude = '', $date_posted = '', $limit = '', $sort = '', $includegeodata = '',$origLat = '',$origLon = '',$dist = '', $filters=array())
551
    {
552
	global $globalTimezone, $globalDBdriver;
553
	require_once(dirname(__FILE__).'/class.Translation.php');
554
	$Translation = new Translation();
555
	$Spotter = new Spotter($this->db);
556
557
	date_default_timezone_set('UTC');
558
	
559
	$query_values = array();
560
	$additional_query = '';
561
	$limit_query = '';
562
	$filter_query = $this->getFilter($filters);
563
	if ($q != "")
564
	{
565
	    if (!is_string($q))
566
	    {
567
		return false;
568
	    } else {
569
	        
570
		$q_array = explode(" ", $q);
571
		
572
		foreach ($q_array as $q_item){
573
		    $additional_query .= " AND (";
574
		    $additional_query .= "(spotter_archive_output.spotter_id like '%".$q_item."%') OR ";
575
		    $additional_query .= "(spotter_archive_output.aircraft_icao like '%".$q_item."%') OR ";
576
		    $additional_query .= "(spotter_archive_output.aircraft_name like '%".$q_item."%') OR ";
577
		    $additional_query .= "(spotter_archive_output.aircraft_manufacturer like '%".$q_item."%') OR ";
578
		    $additional_query .= "(spotter_archive_output.airline_icao like '%".$q_item."%') OR ";
579
		    $additional_query .= "(spotter_archive_output.airline_name like '%".$q_item."%') OR ";
580
		    $additional_query .= "(spotter_archive_output.airline_country like '%".$q_item."%') OR ";
581
		    $additional_query .= "(spotter_archive_output.departure_airport_icao like '%".$q_item."%') OR ";
582
		    $additional_query .= "(spotter_archive_output.departure_airport_name like '%".$q_item."%') OR ";
583
		    $additional_query .= "(spotter_archive_output.departure_airport_city like '%".$q_item."%') OR ";
584
		    $additional_query .= "(spotter_archive_output.departure_airport_country like '%".$q_item."%') OR ";
585
		    $additional_query .= "(spotter_archive_output.arrival_airport_icao like '%".$q_item."%') OR ";
586
		    $additional_query .= "(spotter_archive_output.arrival_airport_name like '%".$q_item."%') OR ";
587
		    $additional_query .= "(spotter_archive_output.arrival_airport_city like '%".$q_item."%') OR ";
588
		    $additional_query .= "(spotter_archive_output.arrival_airport_country like '%".$q_item."%') OR ";
589
		    $additional_query .= "(spotter_archive_output.registration like '%".$q_item."%') OR ";
590
		    $additional_query .= "(spotter_archive_output.owner_name like '%".$q_item."%') OR ";
591
		    $additional_query .= "(spotter_archive_output.pilot_id like '%".$q_item."%') OR ";
592
		    $additional_query .= "(spotter_archive_output.pilot_name like '%".$q_item."%') OR ";
593
		    $additional_query .= "(spotter_archive_output.ident like '%".$q_item."%') OR ";
594
		    $translate = $Translation->ident2icao($q_item);
595
		    if ($translate != $q_item) $additional_query .= "(spotter_archive_output.ident like '%".$translate."%') OR ";
596
		    $additional_query .= "(spotter_archive_output.highlight like '%".$q_item."%')";
597
		    $additional_query .= ")";
598
		}
599
	    }
600
	}
601
	
602
	if ($registration != "")
603
	{
604
	    $registration = filter_var($registration,FILTER_SANITIZE_STRING);
605
	    if (!is_string($registration))
606
	    {
607
		return false;
608
	    } else {
609
		$additional_query .= " AND (spotter_archive_output.registration = '".$registration."')";
610
	    }
611
	}
612
	
613
	if ($aircraft_icao != "")
614
	{
615
	    $aircraft_icao = filter_var($aircraft_icao,FILTER_SANITIZE_STRING);
616
	    if (!is_string($aircraft_icao))
617
	    {
618
		return false;
619
	    } else {
620
		$additional_query .= " AND (spotter_archive_output.aircraft_icao = '".$aircraft_icao."')";
621
	    }
622
	}
623
	
624
	if ($aircraft_manufacturer != "")
625
	{
626
	    $aircraft_manufacturer = filter_var($aircraft_manufacturer,FILTER_SANITIZE_STRING);
627
	    if (!is_string($aircraft_manufacturer))
628
	    {
629
		return false;
630
	    } else {
631
		$additional_query .= " AND (spotter_archive_output.aircraft_manufacturer = '".$aircraft_manufacturer."')";
632
	    }
633
	}
634
	
635
	if ($highlights == "true")
636
	{
637
	    if (!is_string($highlights))
638
	    {
639
		return false;
640
	    } else {
641
		$additional_query .= " AND (spotter_archive_output.highlight <> '')";
642
	    }
643
	}
644
	
645
	if ($airline_icao != "")
646
	{
647
	    $airline_icao = filter_var($airline_icao,FILTER_SANITIZE_STRING);
648
	    if (!is_string($airline_icao))
649
	    {
650
		return false;
651
	    } else {
652
		$additional_query .= " AND (spotter_archive_output.airline_icao = '".$airline_icao."')";
653
	    }
654
	}
655
	
656
	if ($airline_country != "")
657
	{
658
	    $airline_country = filter_var($airline_country,FILTER_SANITIZE_STRING);
659
	    if (!is_string($airline_country))
660
	    {
661
		return false;
662
	    } else {
663
		$additional_query .= " AND (spotter_archive_output.airline_country = '".$airline_country."')";
664
	    }
665
	}
666
	
667
	if ($airline_type != "")
668
	{
669
	    $airline_type = filter_var($airline_type,FILTER_SANITIZE_STRING);
670
	    if (!is_string($airline_type))
671
	    {
672
		return false;
673
	    } else {
674
		if ($airline_type == "passenger")
675
		{
676
		    $additional_query .= " AND (spotter_archive_output.airline_type = 'passenger')";
677
		}
678
		if ($airline_type == "cargo")
679
		{
680
		    $additional_query .= " AND (spotter_archive_output.airline_type = 'cargo')";
681
		}
682
		if ($airline_type == "military")
683
		{
684
		    $additional_query .= " AND (spotter_archive_output.airline_type = 'military')";
685
		}
686
	    }
687
	}
688
	
689
	if ($airport != "")
690
	{
691
	    $airport = filter_var($airport,FILTER_SANITIZE_STRING);
692
	    if (!is_string($airport))
693
	    {
694
		return false;
695
	    } else {
696
		$additional_query .= " AND ((spotter_archive_output.departure_airport_icao = '".$airport."') OR (spotter_archive_output.arrival_airport_icao = '".$airport."'))";
697
	    }
698
	}
699
	
700
	if ($airport_country != "")
701
	{
702
	    $airport_country = filter_var($airport_country,FILTER_SANITIZE_STRING);
703
	    if (!is_string($airport_country))
704
	    {
705
		return false;
706
	    } else {
707
		$additional_query .= " AND ((spotter_archive_output.departure_airport_country = '".$airport_country."') OR (spotter_archive_output.arrival_airport_country = '".$airport_country."'))";
708
	    }
709
	}
710
    
711
	if ($callsign != "")
712
	{
713
	    $callsign = filter_var($callsign,FILTER_SANITIZE_STRING);
714
	    if (!is_string($callsign))
715
	    {
716
		return false;
717
	    } else {
718
		$translate = $Translation->ident2icao($callsign);
719
		if ($translate != $callsign) {
720
			$additional_query .= " AND (spotter_archive_output.ident = :callsign OR spotter_archive_output.ident = :translate)";
721
			$query_values = array_merge($query_values,array(':callsign' => $callsign,':translate' => $translate));
722
		} else {
723
			$additional_query .= " AND (spotter_archive_output.ident = '".$callsign."')";
724
		}
725
	    }
726
	}
727
728
	if ($owner != "")
729
	{
730
	    $owner = filter_var($owner,FILTER_SANITIZE_STRING);
731
	    if (!is_string($owner))
732
	    {
733
		return false;
734
	    } else {
735
		$additional_query .= " AND (spotter_archive_output.owner_name = '".$owner."')";
736
	    }
737
	}
738
739
	if ($pilot_name != "")
740
	{
741
	    $pilot_name = filter_var($pilot_name,FILTER_SANITIZE_STRING);
742
	    if (!is_string($pilot_name))
743
	    {
744
		return false;
745
	    } else {
746
		$additional_query .= " AND (spotter_archive_output.pilot_name = '".$pilot_name."')";
747
	    }
748
	}
749
	
750
	if ($pilot_id != "")
751
	{
752
	    $pilot_id = filter_var($pilot_id,FILTER_SANITIZE_NUMBER_INT);
753
	    if (!is_string($pilot_id))
754
	    {
755
		return false;
756
	    } else {
757
		$additional_query .= " AND (spotter_archive_output.pilot_id = '".$pilot_id."')";
758
	    }
759
	}
760
	
761
	if ($departure_airport_route != "")
762
	{
763
	    $departure_airport_route = filter_var($departure_airport_route,FILTER_SANITIZE_STRING);
764
	    if (!is_string($departure_airport_route))
765
	    {
766
		return false;
767
	    } else {
768
		$additional_query .= " AND (spotter_archive_output.departure_airport_icao = '".$departure_airport_route."')";
769
	    }
770
	}
771
	
772
	if ($arrival_airport_route != "")
773
	{
774
	    $arrival_airport_route = filter_var($arrival_airport_route,FILTER_SANITIZE_STRING);
775
	    if (!is_string($arrival_airport_route))
776
	    {
777
		return false;
778
	    } else {
779
		$additional_query .= " AND (spotter_archive_output.arrival_airport_icao = '".$arrival_airport_route."')";
780
	    }
781
	}
782
	
783
	if ($altitude != "")
784
	{
785
	    $altitude_array = explode(",", $altitude);
786
	    
787
	    $altitude_array[0] = filter_var($altitude_array[0],FILTER_SANITIZE_NUMBER_FLOAT,FILTER_FLAG_ALLOW_FRACTION);
788
	    $altitude_array[1] = filter_var($altitude_array[1],FILTER_SANITIZE_NUMBER_FLOAT,FILTER_FLAG_ALLOW_FRACTION);
789
	    
790
791
	    if ($altitude_array[1] != "")
792
	    {                
793
		$altitude_array[0] = substr($altitude_array[0], 0, -2);
794
		$altitude_array[1] = substr($altitude_array[1], 0, -2);
795
		$additional_query .= " AND altitude BETWEEN '".$altitude_array[0]."' AND '".$altitude_array[1]."' ";
796
	    } else {
797
		$altitude_array[0] = substr($altitude_array[0], 0, -2);
798
		$additional_query .= " AND altitude <= '".$altitude_array[0]."' ";
799
	    }
800
	}
801
	
802
	if ($date_posted != "")
803
	{
804
	    $date_array = explode(",", $date_posted);
805
	    
806
	    $date_array[0] = filter_var($date_array[0],FILTER_SANITIZE_STRING);
807
	    $date_array[1] = filter_var($date_array[1],FILTER_SANITIZE_STRING);
808
	    
809
	    if ($globalTimezone != '') {
810
		date_default_timezone_set($globalTimezone);
811
		$datetime = new DateTime();
812
		$offset = $datetime->format('P');
813
	    } else $offset = '+00:00';
814
815
816
	    if ($date_array[1] != "")
817
	    {                
818
		$date_array[0] = date("Y-m-d H:i:s", strtotime($date_array[0]));
819
		$date_array[1] = date("Y-m-d H:i:s", strtotime($date_array[1]));
820
		if ($globalDBdriver == 'mysql') {
821
			$additional_query .= " AND TIMESTAMP(CONVERT_TZ(spotter_archive_output.date,'+00:00', '".$offset."')) >= '".$date_array[0]."' AND TIMESTAMP(CONVERT_TZ(spotter_archive_output.date,'+00:00', '".$offset."')) <= '".$date_array[1]."' ";
822
		} else {
823
			$additional_query .= " AND spotter_archive_output.date::timestamp AT TIME ZONE INTERVAL ".$offset." >= CAST('".$date_array[0]."' AS TIMESTAMP) AND spotter_archive_output.date::timestamp AT TIME ZONE INTERVAL ".$offset." <= CAST('".$date_array[1]."' AS TIMESTAMP) ";
824
		}
825
	    } else {
826
		$date_array[0] = date("Y-m-d H:i:s", strtotime($date_array[0]));
827
                if ($globalDBdriver == 'mysql') {
828
			$additional_query .= " AND TIMESTAMP(CONVERT_TZ(spotter_archive_output.date,'+00:00', '".$offset."')) >= '".$date_array[0]."' ";
829
		} else {
830
			$additional_query .= " AND spotter_archive_output.date::timestamp AT TIME ZONE INTERVAL ".$offset." >= CAST('".$date_array[0]."' AS TIMESTAMP) ";
831
		}
832
	    }
833
	}
834
	
835
	if ($limit != "")
836
	{
837
	    $limit_array = explode(",", $limit);
838
	    
839
	    $limit_array[0] = filter_var($limit_array[0],FILTER_SANITIZE_NUMBER_INT);
840
	    $limit_array[1] = filter_var($limit_array[1],FILTER_SANITIZE_NUMBER_INT);
841
	    
842
	    if ($limit_array[0] >= 0 && $limit_array[1] >= 0)
843
	    {
844
		//$limit_query = " LIMIT ".$limit_array[0].",".$limit_array[1];
845
		$limit_query = " LIMIT ".$limit_array[1]." OFFSET ".$limit_array[0];
846
	    }
847
	}
848
	
849
850
	if ($origLat != "" && $origLon != "" && $dist != "") {
851
		$dist = number_format($dist*0.621371,2,'.','');
852
		$query="SELECT spotter_archive_output.*, 3956 * 2 * ASIN(SQRT( POWER(SIN(($origLat - ABS(CAST(spotter_archive.latitude as double precision)))*pi()/180/2),2)+COS( $origLat *pi()/180)*COS(ABS(CAST(spotter_archive.latitude as double precision))*pi()/180)*POWER(SIN(($origLon-CAST(spotter_archive.longitude as double precision))*pi()/180/2),2))) as distance 
853
                          FROM spotter_archive_output, spotter_archive WHERE spotter_output_archive.flightaware_id = spotter_archive.flightaware_id AND spotter_output.ident <> '' ".$additional_query."AND CAST(spotter_archive.longitude as double precision) between ($origLon-$dist/ABS(cos(radians($origLat))*69)) and ($origLon+$dist/ABS(cos(radians($origLat))*69)) and CAST(spotter_archive.latitude as double precision) between ($origLat-($dist/69)) and ($origLat+($dist/69)) 
854
                          AND (3956 * 2 * ASIN(SQRT( POWER(SIN(($origLat - ABS(CAST(spotter_archive.latitude as double precision)))*pi()/180/2),2)+COS( $origLat *pi()/180)*COS(ABS(CAST(spotter_archive.latitude as double precision))*pi()/180)*POWER(SIN(($origLon-CAST(spotter_archive.longitude as double precision))*pi()/180/2),2)))) < $dist".$filter_query." ORDER BY distance";
855
	} else {
856
		if ($sort != "")
857
		{
858
			$search_orderby_array = $Spotter->getOrderBy();
859
			$orderby_query = $search_orderby_array[$sort]['sql'];
860
		} else {
861
			$orderby_query = " ORDER BY spotter_archive_output.date DESC";
862
		}
863
	
864
		if ($includegeodata == "true")
865
		{
866
			$additional_query .= " AND (spotter_archive_output.waypoints <> '')";
867
		}
868
869
		$query  = "SELECT spotter_archive_output.* FROM spotter_archive_output 
870
		    WHERE spotter_archive_output.ident <> '' 
871
		    ".$additional_query."
872
		    ".$filter_query.$orderby_query;
873
	}
874
	$spotter_array = $Spotter->getDataFromDB($query, $query_values,$limit_query);
875
876
	return $spotter_array;
877
    }
878
879
    public function deleteSpotterArchiveData()
880
    {
881
		global $globalArchiveKeepMonths, $globalDBdriver;
882
                date_default_timezone_set('UTC');
883
                if ($globalDBdriver == 'mysql') {
884
			$query = 'DELETE FROM spotter_archive_output WHERE spotter_archive_output.date < DATE_SUB(UTC_TIMESTAMP(), INTERVAL '.$globalArchiveKeepMonths.' MONTH)';
885
		} else {
886
			$query = "DELETE FROM spotter_archive_output WHERE spotter_archive_output.date < CURRENT_TIMESTAMP AT TIME ZONE 'UTC' - INTERVAL '".$globalArchiveKeepMonths." MONTH'";
887
		}
888
                try {
889
                        $sth = $this->db->prepare($query);
890
                        $sth->execute();
891
                } catch(PDOException $e) {
892
                        return "error";
893
                }
894
	}
895
896
    /**
897
    * Gets all the spotter information based on the callsign
898
    *
899
    * @return Array the spotter information
900
    *
901
    */
902
    public function getSpotterDataByIdent($ident = '', $limit = '', $sort = '')
903
    {
904
	$global_query = "SELECT spotter_archive_output.* FROM spotter_archive_output";
905
	
906
	date_default_timezone_set('UTC');
907
	$Spotter = new Spotter($this->db);
908
	
909
	$query_values = array();
910
	$limit_query = '';
911
	$additional_query = '';
912
	
913
	if ($ident != "")
914
	{
915
	    if (!is_string($ident))
916
	    {
917
		return false;
918
	    } else {
919
		$additional_query = " AND (spotter_archive_output.ident = :ident)";
920
		$query_values = array(':ident' => $ident);
921
	    }
922
	}
923
	
924
	if ($limit != "")
925
	{
926
	    $limit_array = explode(",", $limit);
927
	    
928
	    $limit_array[0] = filter_var($limit_array[0],FILTER_SANITIZE_NUMBER_INT);
929
	    $limit_array[1] = filter_var($limit_array[1],FILTER_SANITIZE_NUMBER_INT);
930
	    
931
	    if ($limit_array[0] >= 0 && $limit_array[1] >= 0)
932
	    {
933
		//$limit_query = " LIMIT ".$limit_array[0].",".$limit_array[1];
934
		$limit_query = " LIMIT ".$limit_array[1]." OFFSET ".$limit_array[0];
935
	    }
936
	}
937
938
	if ($sort != "")
939
	{
940
	    $search_orderby_array = $Spotter->getOrderBy();
941
	    $orderby_query = $search_orderby_array[$sort]['sql'];
942
	} else {
943
	    $orderby_query = " ORDER BY spotter_archive_output.date DESC";
944
	}
945
946
	$query = $global_query." WHERE spotter_archive_output.ident <> '' ".$additional_query." ".$orderby_query;
947
948
	$spotter_array = $Spotter->getDataFromDB($query, $query_values, $limit_query);
949
950
	return $spotter_array;
951
    }
952
953
954
    /**
955
    * Gets all the spotter information based on the owner
956
    *
957
    * @return Array the spotter information
958
    *
959
    */
960
    public function getSpotterDataByOwner($owner = '', $limit = '', $sort = '')
961
    {
962
	$global_query = "SELECT spotter_archive_output.* FROM spotter_archive_output";
963
	
964
	date_default_timezone_set('UTC');
965
	$Spotter = new Spotter($this->db);
966
	
967
	$query_values = array();
968
	$limit_query = '';
969
	$additional_query = '';
970
	
971
	if ($owner != "")
972
	{
973
	    if (!is_string($owner))
974
	    {
975
		return false;
976
	    } else {
977
		$additional_query = " AND (spotter_archive_output.owner = :owner)";
978
		$query_values = array(':owner' => $owner);
979
	    }
980
	}
981
	
982
	if ($limit != "")
983
	{
984
	    $limit_array = explode(",", $limit);
985
	    
986
	    $limit_array[0] = filter_var($limit_array[0],FILTER_SANITIZE_NUMBER_INT);
987
	    $limit_array[1] = filter_var($limit_array[1],FILTER_SANITIZE_NUMBER_INT);
988
	    
989
	    if ($limit_array[0] >= 0 && $limit_array[1] >= 0)
990
	    {
991
		//$limit_query = " LIMIT ".$limit_array[0].",".$limit_array[1];
992
		$limit_query = " LIMIT ".$limit_array[1]." OFFSET ".$limit_array[0];
993
	    }
994
	}
995
996
	if ($sort != "")
997
	{
998
	    $search_orderby_array = $Spotter->getOrderBy();
999
	    $orderby_query = $search_orderby_array[$sort]['sql'];
1000
	} else {
1001
	    $orderby_query = " ORDER BY spotter_archive_output.date DESC";
1002
	}
1003
1004
	$query = $global_query." WHERE spotter_archive_output.owner <> '' ".$additional_query." ".$orderby_query;
1005
1006
	$spotter_array = $Spotter->getDataFromDB($query, $query_values, $limit_query);
1007
1008
	return $spotter_array;
1009
    }
1010
1011
    /**
1012
    * Gets all the spotter information based on the pilot
1013
    *
1014
    * @return Array the spotter information
1015
    *
1016
    */
1017
    public function getSpotterDataByPilot($pilot = '', $limit = '', $sort = '')
1018
    {
1019
	$global_query = "SELECT spotter_archive_output.* FROM spotter_archive_output";
1020
	
1021
	date_default_timezone_set('UTC');
1022
	$Spotter = new Spotter($this->db);
1023
	
1024
	$query_values = array();
1025
	$limit_query = '';
1026
	$additional_query = '';
1027
	
1028
	if ($owner != "")
1029
	{
1030
	    if (!is_string($owner))
0 ignored issues
show
Bug introduced by
The variable $owner does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
1031
	    {
1032
		return false;
1033
	    } else {
1034
		$additional_query = " AND (spotter_archive_output.pilot_id = :pilot OR spotter_archive_output.pilot_name = :pilot)";
1035
		$query_values = array(':pilot' => $pilot);
1036
	    }
1037
	}
1038
	
1039
	if ($limit != "")
1040
	{
1041
	    $limit_array = explode(",", $limit);
1042
	    
1043
	    $limit_array[0] = filter_var($limit_array[0],FILTER_SANITIZE_NUMBER_INT);
1044
	    $limit_array[1] = filter_var($limit_array[1],FILTER_SANITIZE_NUMBER_INT);
1045
	    
1046
	    if ($limit_array[0] >= 0 && $limit_array[1] >= 0)
1047
	    {
1048
		//$limit_query = " LIMIT ".$limit_array[0].",".$limit_array[1];
1049
		$limit_query = " LIMIT ".$limit_array[1]." OFFSET ".$limit_array[0];
1050
	    }
1051
	}
1052
1053
	if ($sort != "")
1054
	{
1055
	    $search_orderby_array = $Spotter->getOrderBy();
1056
	    $orderby_query = $search_orderby_array[$sort]['sql'];
1057
	} else {
1058
	    $orderby_query = " ORDER BY spotter_archive_output.date DESC";
1059
	}
1060
1061
	$query = $global_query." WHERE spotter_archive_output.pilot_name <> '' ".$additional_query." ".$orderby_query;
1062
1063
	$spotter_array = $Spotter->getDataFromDB($query, $query_values, $limit_query);
1064
1065
	return $spotter_array;
1066
    }
1067
1068
    /**
1069
    * Gets all number of flight over countries
1070
    *
1071
    * @return Array the airline country list
1072
    *
1073
    */
1074
    public function countAllFlightOverCountries($limit = true,$olderthanmonths = 0,$sincedate = '')
1075
    {
1076
	global $globalDBdriver;
1077
	/*
1078
	$query = "SELECT c.name, c.iso3, c.iso2, count(c.name) as nb 
1079
		    FROM countries c, spotter_archive s
1080
		    WHERE Within(GeomFromText(CONCAT('POINT(',s.longitude,' ',s.latitude,')')), ogc_geom) ";
1081
	*/
1082
	$query = "SELECT c.name, c.iso3, c.iso2, count(c.name) as nb
1083
		    FROM countries c, spotter_archive s
1084
		    WHERE c.iso2 = s.over_country ";
1085
                if ($olderthanmonths > 0) {
1086
            		if ($globalDBdriver == 'mysql') {
1087
				$query .= 'AND date < DATE_SUB(UTC_TIMESTAMP(),INTERVAL '.$olderthanmonths.' MONTH) ';
1088
			} else {
1089
				$query .= "AND date < CURRENT_TIMESTAMP AT TIME ZONE 'UTC' - INTERVAL '".$olderthanmonths." MONTHS'";
1090
			}
1091
		}
1092
                if ($sincedate != '') $query .= "AND date > '".$sincedate."' ";
1093
	$query .= "GROUP BY c.name, c.iso3, c.iso2 ORDER BY nb DESC";
1094
	if ($limit) $query .= " LIMIT 0,10";
1095
      
1096
	
1097
	$sth = $this->db->prepare($query);
1098
	$sth->execute();
1099
 
1100
	$flight_array = array();
1101
	$temp_array = array();
1102
        
1103
	while($row = $sth->fetch(PDO::FETCH_ASSOC))
1104
	{
1105
	    $temp_array['flight_count'] = $row['nb'];
1106
	    $temp_array['flight_country'] = $row['name'];
1107
	    $temp_array['flight_country_iso3'] = $row['iso3'];
1108
	    $temp_array['flight_country_iso2'] = $row['iso2'];
1109
	    $flight_array[] = $temp_array;
1110
	}
1111
	return $flight_array;
1112
    }
1113
1114
    /**
1115
    * Gets last spotter information based on a particular callsign
1116
    *
1117
    * @return Array the spotter information
1118
    *
1119
    */
1120
    public function getDateArchiveSpotterDataById($id,$date)
1121
    {
1122
	$Spotter = new Spotter($this->db);
1123
	date_default_timezone_set('UTC');
1124
	$id = filter_var($id, FILTER_SANITIZE_STRING);
1125
	$query  = 'SELECT spotter_archive.* FROM spotter_archive INNER JOIN (SELECT l.flightaware_id, max(l.date) as maxdate FROM spotter_archive l WHERE l.flightaware_id = :id AND l.date <= :date GROUP BY l.flightaware_id) s on spotter_archive.flightaware_id = s.flightaware_id AND spotter_archive.date = s.maxdate ORDER BY spotter_archive.date DESC';
1126
	$date = date('c',$date);
1127
	$spotter_array = $Spotter->getDataFromDB($query,array(':id' => $id,':date' => $date));
1128
	return $spotter_array;
1129
    }
1130
1131
    /**
1132
    * Gets all the spotter information based on a particular callsign
1133
    *
1134
    * @return Array the spotter information
1135
    *
1136
    */
1137
    public function getDateArchiveSpotterDataByIdent($ident,$date)
1138
    {
1139
	$Spotter = new Spotter($this->db);
1140
	date_default_timezone_set('UTC');
1141
	$ident = filter_var($ident, FILTER_SANITIZE_STRING);
1142
	$query  = 'SELECT spotter_archive.* FROM spotter_archive INNER JOIN (SELECT l.flightaware_id, max(l.date) as maxdate FROM spotter_archive l WHERE l.ident = :ident AND l.date <= :date GROUP BY l.flightaware_id) s on spotter_archive.flightaware_id = s.flightaware_id AND spotter_archive.date = s.maxdate ORDER BY spotter_archive.date DESC';
1143
	$date = date('c',$date);
1144
	$spotter_array = $Spotter->getDataFromDB($query,array(':ident' => $ident,':date' => $date));
1145
	return $spotter_array;
1146
    }
1147
1148
    /**
1149
    * Gets all the spotter information based on the airport
1150
    *
1151
    * @return Array the spotter information
1152
    *
1153
    */
1154
    public function getSpotterDataByAirport($airport = '', $limit = '', $sort = '',$filters = array())
1155
    {
1156
	global $global_query;
1157
	$Spotter = new Spotter();
1158
	date_default_timezone_set('UTC');
1159
	$query_values = array();
1160
	$limit_query = '';
1161
	$additional_query = '';
1162
	$filter_query = $this->getFilter($filters,true,true);
1163
	
1164
	if ($airport != "")
1165
	{
1166
	    if (!is_string($airport))
1167
	    {
1168
		return false;
1169
	    } else {
1170
		$additional_query .= " AND ((spotter_archive_output.departure_airport_icao = :airport) OR (spotter_archive_output.arrival_airport_icao = :airport))";
1171
		$query_values = array(':airport' => $airport);
1172
	    }
1173
	}
1174
	
1175
	if ($limit != "")
1176
	{
1177
	    $limit_array = explode(",", $limit);
1178
	    
1179
	    $limit_array[0] = filter_var($limit_array[0],FILTER_SANITIZE_NUMBER_INT);
1180
	    $limit_array[1] = filter_var($limit_array[1],FILTER_SANITIZE_NUMBER_INT);
1181
	    
1182
	    if ($limit_array[0] >= 0 && $limit_array[1] >= 0)
1183
	    {
1184
		//$limit_query = " LIMIT ".$limit_array[0].",".$limit_array[1];
1185
		$limit_query = " LIMIT ".$limit_array[1]." OFFSET ".$limit_array[0];
1186
	    }
1187
	}
1188
	
1189
	if ($sort != "")
1190
	{
1191
	    $search_orderby_array = $Spotter->getOrderBy();
1192
	    $orderby_query = $search_orderby_array[$sort]['sql'];
1193
	} else {
1194
	    $orderby_query = " ORDER BY spotter_archive_output.date DESC";
1195
	}
1196
1197
	$query = $global_query.$filter_query." spotter_archive_output.ident <> '' ".$additional_query." AND ((spotter_archive_output.departure_airport_icao <> 'NA') AND (spotter_archive_output.arrival_airport_icao <> 'NA')) ".$orderby_query;
1198
1199
	$spotter_array = $Spotter->getDataFromDB($query, $query_values, $limit_query);
1200
1201
	return $spotter_array;
1202
    }
1203
}
1204
?>