root/dev/common/includes/class.killsummarytable.php @ 399

Revision 399, 12.6 KB (checked in by kovell, 13 years ago)

Fixes: autoupgrade smoother, Rare errors in db classes reduced, api login problems reduced, page cache notifications check if cache is active. admin mod list sorted. alliance and corp details pages load faster. all-time summary tables cached. killlist performance on large databases improved

Line 
1<?php
2require_once("class.ship.php");
3require_once("class.summary.php");
4
5class KillSummaryTable
6{
7        function KillSummaryTable($klist = null, $llist = null)
8        {
9                $this->klist_ = $klist;
10                $this->llist_ = $llist;
11                $this->verbose_ = false;
12                $this->filter_ = true;
13                $this->inv_plt_ = array();
14                $this->inv_crp_ = array();
15                $this->inv_all_ = array();
16        }
17
18        function setBreak($break)
19        {
20                $this->break_ = $break;
21        }
22
23        function setVerbose($verbose)
24        {
25                $this->verbose_ = $verbose;
26        }
27
28        function setFilter($filter)
29        {
30                $this->filter_ = $filter;
31        }
32
33        function setWeek($weekno)
34        {
35                $weekno=intval($weekno);
36                if($weekno <1)  $this->weekno_ = 1;
37                if($weekno >53) $this->weekno_ = 53;
38                else $this->weekno_ = $weekno;
39        }
40
41        function setMonth($monthno)
42        {
43                $monthno = intval($monthno);
44                if($monthno < 1) $this->monthno_ = 1;
45                if($monthno > 12) $this->monthno_ = 12;
46                else $this->monthno_ = $monthno;
47        }
48
49        function setYear($yearno)
50        {
51        // 1970-2038 is the allowable range for the timestamp code used
52        // Needs to be revisited in the next 30 years
53                $yearno = intval($yearno);
54                if($yearno < 1970) $this->yearno_ = 1970;
55                if($yearno > 2038) $this->yearno_ = 2038;
56                else $this->yearno_ = $yearno;
57        }
58
59        function setStartWeek($weekno)
60        {
61                $weekno=intval($weekno);
62                if($weekno <1)  $this->startweekno_ = 1;
63                if($weekno >53) $this->startweekno_ = 53;
64                else $this->startweekno_ = $weekno;
65        }
66
67        function setStartDate($timestamp)
68        {
69        // Check timestamp is valid before adding
70                if(strtotime($timestamp)) $this->startDate_ = $timestamp;
71        }
72
73        function setEndDate($timestamp)
74        {
75        // Check timestamp is valid before adding
76                if(strtotime($timestamp)) $this->endDate_ = $timestamp;
77        }
78
79        // Return SQL for date filter using currently set date limits
80        function setDateFilter()
81        {
82                $qstartdate = makeStartDate($this->weekno_, $this->yearno_, $this->monthno_, $this->startweekno_, $this->startDate_);
83                $qenddate = makeEndDate($this->weekno_, $this->yearno_, $this->monthno_, $this->endDate_);
84                if($qstartdate) $sql .= " kll.kll_timestamp >= '".gmdate('Y-m-d H:i',$qstartdate)."' ";
85                if($qstartdate && $qenddate) $sql .= " AND ";
86                if($qenddate) $sql .= " kll.kll_timestamp <= '".gmdate('Y-m-d H:i',$qenddate)."' ";
87                return $sql;
88        }
89
90        function getTotalKills()
91        {
92                return $this->tkcount_;
93        }
94
95        function getTotalLosses()
96        {
97                return $this->tlcount_;
98        }
99
100        function getTotalKillPoints()
101        {
102                return $this->tkpoints_;
103        }
104
105        function getTotalLossPoints()
106        {
107                return $this->tlpoints_;
108        }
109
110        function getTotalKillISK()
111        {
112                return $this->tkisk_;
113        }
114
115        function getTotalLossISK()
116        {
117                return $this->tlisk_;
118        }
119
120        function setView($string)
121        {
122                $this->view_ = $string;
123        }
124
125        function addInvolvedPilot($pilot)
126        {
127                $this->inv_plt_[] = $pilot->getID();
128                if ($this->inv_crp_ || $this->inv_all_)
129                {
130                        $this->mixedinvolved_ = true;
131                }
132        }
133
134        function addInvolvedCorp($corp)
135        {
136                $this->inv_crp_[] = $corp->getID();
137                if ($this->inv_plt_ || $this->inv_all_)
138                {
139                        $this->mixedinvolved_ = true;
140                }
141        }
142
143        function addInvolvedAlliance($alliance)
144        {
145                $this->inv_all_[] = $alliance->getID();
146                if ($this->inv_plt_ || $this->inv_crp_)
147                {
148                        $this->mixedinvolved_ = true;
149                }
150        }
151
152        // do it faster, baby!
153        function getkills()
154        {
155                if ($this->mixedinvolved_)
156                {
157                        echo 'mode not supported<br>';
158                        exit;
159                }
160                if( count($this->inv_all_) == 1 && !$this->inv_crp_ && !$this->inv_plt_ && $this->setDateFilter() == "")
161                {
162                        $allsum = new allianceSummary($this->inv_all_[0]);
163                        $summary = $allsum->getSummary();
164                        foreach($summary as $key => $row)
165                        {
166                                $this->entry_[$row['class_name']] = array('id' => $key,
167                                        'kills' => $row['killcount'], 'kills_isk' => $row['killisk'],
168                                        'losses' => $row['losscount'], 'losses_isk' => $row['lossisk']);
169
170                                $this->tkcount_ += $row['killcount'];
171                                $this->tkisk_ += $row['killisk'];
172                                $this->tlcount_ += $row['losscount'];
173                                $this->tlisk_ += $row['lossisk'];
174                        }
175                        return;
176                }
177
178                if( count($this->inv_crp_) == 1 && !$this->inv_all_ && !$this->inv_plt_ && $this->setDateFilter() == "")
179                {
180                        $crpsum = new corpSummary($this->inv_crp_[0]);
181                        $summary = $crpsum->getSummary();
182                        foreach($summary as $key => $row)
183                        {
184                                $this->entry_[$row['class_name']] = array('id' => $key,
185                                        'kills' => $row['killcount'], 'kills_isk' => $row['killisk'],
186                                        'losses' => $row['losscount'], 'losses_isk' => $row['lossisk']);
187
188                                $this->tkcount_ += $row['killcount'];
189                                $this->tkisk_ += $row['killisk'];
190                                $this->tlcount_ += $row['losscount'];
191                                $this->tlisk_ += $row['lossisk'];
192                        }
193                        return;
194                }
195
196                $this->entry_ = array();
197                // as there is no way to do this elegantly in sql
198                // i'll keep it in php
199                $sql = "select scl_id, scl_class from kb3_ship_classes
200               where scl_class not in ('Drone','Unknown') order by scl_class";
201
202                $qry = new DBQuery();
203                $qry->execute($sql);
204                while ($row = $qry->getRow())
205                {
206                        $this->entry_[$row['scl_class']] = array('id' => $row['scl_id'],
207                                'kills' => 0, 'kills_isk' => 0,
208                                'losses' => 0, 'losses_isk' => 0);
209                }
210
211                $sql = 'SELECT count(distinct kll.kll_id) AS knb, scl_id, scl_class,';
212                $sql .= ' sum(kll_isk_loss) AS kisk FROM kb3_kills kll
213                    INNER JOIN kb3_ships shp ON ( shp.shp_id = kll.kll_ship_id )';
214                $sql .= ' INNER JOIN kb3_ship_classes scl ON ( scl.scl_id = shp.shp_class )';
215
216                // Force MySQL to first filter by date if a date range is given.
217                if($this->setDateFilter())
218                {
219                        $sql.= 'WHERE '.$this->setDateFilter();
220                        if ($this->inv_plt_)
221                        {
222                                $sql .= ' AND EXISTS (SELECT 1 FROM kb3_inv_detail ind WHERE kll.kll_id = ind.ind_kll_id AND ind.ind_plt_id in ( '.implode(',', $this->inv_plt_).' ) LIMIT 1)';
223                        }
224                        if ($this->inv_crp_)
225                        {
226                                $sql .= ' AND EXISTS (SELECT 1 FROM kb3_inv_detail ind WHERE kll.kll_id = ind.ind_kll_id AND ind.ind_crp_id in ( '.implode(',', $this->inv_crp_).' ) AND ind.ind_crp_id != kll.kll_crp_id LIMIT 1)';
227                        }
228                        if ($this->inv_all_)
229                        {
230                                $sql .= ' AND EXISTS (SELECT 1 FROM kb3_inv_detail ind WHERE kll.kll_id = ind.ind_kll_id and ind.ind_all_id in ( '.implode(',', $this->inv_all_).' ) and ind.ind_all_id != kll.kll_all_id LIMIT 1) ';
231                        }
232                }
233                else
234                {
235                        if ($this->inv_plt_)
236                        {
237                                $sql .= ' INNER JOIN (SELECT distinct a.ind_kll_id FROM kb3_inv_detail a WHERE a.ind_plt_id in ( '.implode(',', $this->inv_plt_).' ) ) ind ON (ind.ind_kll_id = kll.kll_id) ';
238                        }
239                        elseif ($this->inv_crp_)
240                        {
241                                $sql .= ' INNER JOIN (SELECT distinct b.ind_kll_id, b.ind_crp_id FROM kb3_inv_detail b WHERE b.ind_crp_id in ( '.implode(',', $this->inv_crp_).' ) ) ind  ON (ind.ind_kll_id = kll.kll_id AND ind.ind_crp_id != kll.kll_crp_id) ';
242                        }
243                        elseif ($this->inv_all_)
244                        {
245                                $sql .= ' INNER JOIN (SELECT distinct c.ind_kll_id, c.ind_all_id FROM kb3_inv_detail c WHERE c.ind_all_id in ( '.implode(',', $this->inv_all_).' ) ) ind  ON (ind.ind_kll_id = kll.kll_id AND ind.ind_all_id != kll.kll_all_id) ';
246                        }
247                }
248
249                $sql .= 'GROUP BY scl_class order by scl_class';
250
251                $qry = new DBQuery();
252                $qry->execute($sql);
253                while ($row = $qry->getRow())
254                {
255                        $this->entry_[$row['scl_class']]['kills'] = $row['knb'];
256                        $this->entry_[$row['scl_class']]['kills_isk'] = $row['kisk'];
257                        $this->tkcount_ += $row['knb'];
258                        $this->tkisk_ += $row['kisk'];
259                }
260
261
262                $sql = 'SELECT count(distinct kll_id) AS lnb, scl_id, scl_class,';
263                $sql .= ' sum(kll_isk_loss) AS lisk FROM kb3_kills kll
264                    INNER JOIN kb3_ships shp ON ( shp.shp_id = kll.kll_ship_id )';
265                $sql .= ' INNER JOIN kb3_ship_classes scl ON ( scl.scl_id = shp.shp_class )';
266
267                $sqlop = ' WHERE ';
268                if($this->setDateFilter())
269                {
270                        $sql.= $sqlop.$this->setDateFilter();
271                        $sqlop = " AND ";
272                }
273
274                if ($this->inv_plt_)
275                {
276                        $sql .= $sqlop.' kll.kll_victim_id IN ( '.implode(',', $this->inv_plt_).' ) ';
277                        $sql .= ' AND EXISTS (SELECT 1 FROM kb3_inv_detail ind WHERE kll.kll_id = ind_kll_id AND ind.ind_plt_id NOT IN ( '.implode(',', $this->inv_plt_).' ) limit 0,1) ';
278                }
279                elseif ($this->inv_crp_)
280                {
281                        $sql .= $sqlop.' kll.kll_crp_id IN ( '.implode(',', $this->inv_crp_).' ) ';
282                        $sql .= 'AND EXISTS (SELECT 1 FROM kb3_inv_detail ind WHERE kll.kll_id = ind_kll_id AND ind.ind_crp_id NOT IN ( '.implode(',', $this->inv_crp_).' ) limit 0,1) ';
283                }
284                elseif ($this->inv_all_)
285                {
286                        $sql .= $sqlop.' kll.kll_all_id IN ( '.implode(',', $this->inv_all_).' ) ';
287                        $sql .= 'AND EXISTS (SELECT 1 FROM kb3_inv_detail ind WHERE kll.kll_id = ind_kll_id AND ind.ind_all_id NOT IN ( '.implode(',', $this->inv_all_).' ) limit 0,1) ';
288                }
289                $sql .= 'GROUP BY scl_class order by scl_class';
290
291                $qry = new DBQuery();
292                $qry->execute($sql);
293                while ($row = $qry->getRow())
294                {
295                        $this->entry_[$row['scl_class']]['losses'] = $row['lnb'];
296                        $this->entry_[$row['scl_class']]['losses_isk'] =  $row['lisk'];
297
298                        $this->tlcount_ += $row['lnb'];
299                        $this->tlisk_ += $row['lisk'];
300                }
301        }
302
303        function generate()
304        {
305                if ($this->klist_)
306                {
307                        $entry = array();
308                        // build array
309                        $sql = "select scl_id, scl_class
310                    from kb3_ship_classes
311                   where scl_class not in ( 'Drone', 'Unknown' )
312                  order by scl_class";
313
314                        $qry = new DBQuery();
315                        $qry->execute($sql) or die($qry->getErrorMsg());
316                        while ($row = $qry->getRow())
317                        {
318                                if (!$row['scl_id'])
319                                        continue;
320
321                                $shipclass = new ShipClass($row['scl_id']);
322                                $shipclass->setName($row['scl_class']);
323
324                                $entry[$shipclass->getName()]['id'] = $row['scl_id'];
325                                $entry[$shipclass->getName()]['kills'] = 0;
326                                $entry[$shipclass->getName()]['kills_isk'] = 0;
327                                $entry[$shipclass->getName()]['losses'] = 0;
328                                $entry[$shipclass->getName()]['losses_isk'] = 0;
329                        }
330                        // kills
331                        while ($kill = $this->klist_->getKill())
332                        {
333                                $classname = $kill->getVictimShipClassName();
334                                $entry[$classname]['kills']++;
335                                $entry[$classname]['kills_isk'] += $kill->getISKLoss();
336                                $this->tkcount_++;
337                                $this->tkisk_ += $kill->getISKLoss();
338                        }
339                        // losses
340                        while ($kill = $this->llist_->getKill())
341                        {
342                                $classname = $kill->getVictimShipClassName();
343                                $entry[$classname]['losses']++;
344                                $entry[$classname]['losses_isk'] += $kill->getISKLoss();
345                                $this->tlcount_++;
346                                $this->tlisk_ += $kill->getISKLoss();
347                        }
348                }
349                else
350                {
351                        $this->getkills();
352                        $entry = &$this->entry_;
353                }
354
355                $odd = false;
356                $prevdate = "";
357                // Don't count noobships.
358                $num = count($entry) - 1;
359                if($this->break_) $columns = ceil($num/$this->break_);
360                else $columns = 2;
361                if(!$columns) $columns = 1;
362        $width_mod = 1/$columns;
363        $width = round($width_mod*100);
364                if($this->verbose_) $width_abs = round($width_mod*(760-240*$columns));
365                else $width_abs = round($width_mod*(760-60*$columns));
366                $summary = array();
367                $count = 0;
368                foreach ($entry as $k => $v)
369                {
370                        if($v['id'] == 3) continue;
371                        if($count && $this->break_ && $count%$this->break_ == 0) $v['break'] = 1;
372                        else $v['break'] = 0;
373                        if($_GET['scl_id'] && $_GET['scl_id'] == $v['id']) $v['hl'] = 1;
374                        else $v['hl'] = 0;
375                        $qrystring = preg_replace("/&scl_id=([0-9]?[0-9])/", "", $_SERVER['QUERY_STRING']);
376                        $qrystring = preg_replace("/&page=([0-9]?[0-9])/", "", $qrystring);
377                        $qrystring = preg_replace("/&/", "&amp;", $qrystring);
378                        if ($this->view_)
379                        {
380                                $qrystring .= '&view='.$this->view_;
381                        }
382                        $v['url'] = $querystring;
383                        $v['kisk'] = round($v['kills_isk']/1000000, 2);
384                        $v['lisk'] = round($v['losses_isk']/1000000, 2);
385                        $v['name'] = $k;
386
387                        $summary[] = $v;
388
389                        $this->tkcount_ += $kcount;
390                        $this->tkisk_ += $kisk;
391                        $this->tkpoints_ += $kpoints;
392                        $this->tlcount_ += $lcount;
393                        $this->tlisk_ += $lisk;
394                        $this->tlpoints_ += $lpoints;
395                        $count++;
396
397                }
398                global $smarty;
399                $smarty->assign('summary', $summary);
400                $smarty->assign('count', count($entry));
401                $smarty->assign('break', $this->break_);
402                $smarty->assign('width', $width);
403                $smarty->assign('width_abs', $width_abs);
404                $smarty->assign('columns', $columns);
405                $smarty->assign('verbose', $this->verbose_);
406                $smarty->assign('filter', $this->filter_);
407                $smarty->assign('losses', 1);
408
409                if (config::get('summarytable_summary'))
410                {
411                        $smarty->assign('summarysummary', 1);
412                        if (config::get('summarytable_efficiency'))
413                                $smarty->assign('efficiency', round($this->tkisk_ / (($this->tkisk_ + $this->tlisk_) == 0 ? 1 : ($this->tkisk_ + $this->tlisk_)) * 100, 2));
414                        else $smarty->assign('efficiency', 0);
415                        $smarty->assign('kiskB', round($this->tkisk_/1000000000, 2));
416                        $smarty->assign('liskB', round($this->tlisk_/1000000000, 2));
417                        $smarty->assign('kiskM', round($this->tkisk_/1000000, 2));
418                        $smarty->assign('liskM', round($this->tlisk_/1000000, 2));
419                        $smarty->assign('kcount', $this->tkcount_);
420                        $smarty->assign('lcount', $this->tlcount_);
421                }
422
423                if ($_GET['scl_id'] != "")
424                {
425                        $qrystring = preg_replace("/&scl_id=([0-9]?[0-9])/", "", '?'.$_SERVER['QUERY_STRING']);
426                        $qrystring = preg_replace("/&/", "&amp;", $qrystring);
427                        $smarty->assign('clearfilter',$qrystring);
428                }
429
430                $html .= $smarty->fetch(get_tpl('summarytable'));
431
432                return $html;
433        }
434}
435?>
Note: See TracBrowser for help on using the browser.