root/dev/common/class.killlist.php @ 187

Revision 187, 15.4 KB (checked in by exi, 14 years ago)

Changed contracts/campaigns to use a sql query for the summary instead of iterating through all kill-objects which should be a lot faster now.
Converted some internal functions in class.killlist.php to use array stacks instead of strings.

Line 
1<?php
2require_once('class.kill.php');
3require_once('class.pagesplitter.php');
4
5class KillList
6{
7    function KillList()
8    {
9        $this->qry_ = new DBQuery();
10        $this->killpointer_ = 0;
11        $this->kills_ = 0;
12        $this->losses_ = 0;
13        $this->killisk_ = 0;
14        $this->lossisk_ = 0;
15        $this->exclude_scl_ = array();
16        $this->vic_scl_id_ = array();
17        $this->regions_ = array();
18        $this->systems_ = array();
19        $this->groupby_ = array();
20        $this->offset_ = 0;
21        $this->killcounter_ = 0;
22        $this->realkillcounter_ = 0;
23        $this->ordered_ = false;
24    }
25
26    function execQuery()
27    {
28        if (!$this->qry_->executed_)
29        {
30            if (!count($this->groupby_))
31                $this->sql_ = 'select distinct kll.kll_id, kll.kll_timestamp, plt.plt_name,
32                                crp.crp_name, crp.crp_id, ali.all_name, ali.all_id, kll.kll_ship_id,
33                                kll.kll_system_id, kll.kll_ship_id,
34                                kll.kll_victim_id, plt.plt_externalid,
35                                kll.kll_crp_id, kll.kll_points,
36                                        shp.shp_class, shp.shp_name,
37                                        shp.shp_externalid, shp.shp_id,
38                                                scl.scl_id, scl.scl_class, scl.scl_value,
39                                                sys.sys_name, sys.sys_sec,
40                                fbplt.plt_name as fbplt_name,
41                                fbplt.plt_externalid as fbplt_externalid,
42                                fbcrp.crp_name as fbcrp_name';
43
44            global $config;
45            if ($config->getConfig('ship_values'))
46            {
47                $this->sql_ .= ', ksv.shp_value';
48            }
49            if (count($this->groupby_))
50            {
51                $this->sql_ .= "select count(*) as cnt, ".implode(",", $this->groupby_);
52            }
53
54            $this->sql_ .= "    from kb3_kills kll
55                           inner join kb3_ships shp
56                              on ( shp.shp_id = kll.kll_ship_id )
57                           inner join kb3_ship_classes scl
58                              on ( scl.scl_id = shp.shp_class )";
59            if ($config->getConfig('ship_values'))
60            {
61                $this->sql_ .= ' left join kb3_ships_values ksv on (shp.shp_id = ksv.shp_id) ';
62            }
63
64            $this->sql_ .= "inner join kb3_pilots plt
65                              on ( plt.plt_id = kll.kll_victim_id )
66                           inner join kb3_corps crp
67                              on ( crp.crp_id = kll.kll_crp_id )
68                           inner join kb3_alliances ali
69                              on ( ali.all_id = kll.kll_all_id )
70                           inner join kb3_pilots fbplt
71                              on ( fbplt.plt_id = kll.kll_fb_plt_id )
72                           inner join kb3_corps fbcrp
73                              on ( fbcrp.crp_id = kll.kll_fb_crp_id )
74                           inner join kb3_systems sys
75                              on ( sys.sys_id = kll.kll_system_id )";
76
77            // involved filter
78            if (! $this->mixedinvolved_)
79            {
80                if ($this->inv_plt_)
81                    $this->sql_ .= " inner join kb3_inv_plt inp
82                               on ( inp.inp_plt_id in ( ".join(',', $this->inv_plt_)." ) and kll.kll_id = inp.inp_kll_id ) ";
83                if ($this->inv_crp_)
84                    $this->sql_ .= " inner join kb3_inv_crp inc
85                              on ( inc.inc_crp_id in ( ".join(',', $this->inv_crp_)." ) and kll.kll_id = inc.inc_kll_id
86                               and inc.inc_crp_id != kll.kll_crp_id ) ";
87                if ($this->inv_all_)
88                    $this->sql_ .= " inner join kb3_inv_all ina
89                              on ( ina.ina_all_id in ( ".join(',', $this->inv_all_)." ) and kll.kll_id = ina.ina_kll_id
90                               and ina.ina_all_id != kll.kll_all_id ) ";
91            }
92            else
93            {
94                $this->sql_ .= " <ph> ";
95            }
96            // echo $this->sql_;
97            // regions
98            if (count($this->regions_))
99            {
100                $this->sql_ .= " inner join kb3_constellations con
101                              on ( con.con_id = sys.sys_con_id )
102                           inner join kb3_regions reg
103                              on ( reg.reg_id = con.con_reg_id
104                                   and reg.reg_id in ( ".implode($this->regions_, ",")." ) )";
105            }
106
107            if (count($this->systems_))
108            {
109                $this->sql_ .= "   and kll.kll_system_id in ( ".implode($this->systems_, ",").")";
110            }
111            // victim filter
112            if ($this->mixedvictims_)
113            {
114                $this->sql_ .= " and ( 1 = 0 ";
115                $op = "or";
116            }
117            else $op = "and";
118
119            if ($this->vic_plt_)
120                $this->sql_ .= " ".$op." kll.kll_victim_id in ( ".join(',', $this->vic_plt_)." )";
121            if ($this->vic_crp_)
122                $this->sql_ .= " ".$op." kll.kll_crp_id in ( ".join(',', $this->vic_crp_)." )";
123            if ($this->vic_all_)
124                $this->sql_ .= " ".$op." kll.kll_all_id in ( ".join(',', $this->vic_all_)." )";
125
126            if ($this->mixedvictims_)
127                $this->sql_ .= " ) ";
128            // echo $this->sql_;
129            // ship filter
130            if (count($this->exclude_scl_))
131            {
132                $this->sql_ .= " and scl.scl_id not in ( ".implode(",", $this->exclude_scl_)." )";
133            }
134            if (count($this->vic_scl_id_))
135            {
136                $this->sql_ .= " and scl.scl_id in ( ".implode(",", $this->vic_scl_id_)." )";
137            }
138            // related
139            if ($this->related_)
140            {
141                $rqry = new DBQuery();
142                $rsql = "select kll_timestamp, kll_system_id from kb3_kills where kll_id = ".$this->related_;
143
144                $rqry->execute($rsql);
145                $rrow = $rqry->getRow();
146
147                $this->sql_ .= " and kll.kll_system_id = ".$rrow['kll_system_id']."
148                           and kll.kll_timestamp <=
149                               date_add( '".$rrow['kll_timestamp']."', INTERVAL '15:0' MINUTE_SECOND )
150                           and kll.kll_timestamp >=
151                               date_sub( '".$rrow['kll_timestamp']."', INTERVAL '15:0' MINUTE_SECOND )";
152            }
153            // timeframe
154            if ($this->timeframe_)
155                $this->sql_ .= $this->timeframe_;
156
157            if (!strpos($this->sql_, " join ") && !$this->mixedinvolved_)
158                $this->sqlhead_ .= " where 1 = 1";
159
160            if ($this->mixedinvolved_)
161            {
162                if ($this->inv_plt_)
163                {
164                    $replace = " inner join kb3_inv_plt inp
165                            on ( inp.inp_plt_id in ( ".join(',', $this->inv_plt_)." ) and kll.kll_id = inp.inp_kll_id ) ";
166                    $psql = str_replace("<ph>", $replace, $this->sql_);
167                }
168                if ($this->inv_crp_)
169                {
170                    $replace = " inner join kb3_inv_crp inc
171                            on ( inc.inc_crp_id in ( ".join(',', $this->inv_crp_)." ) and kll.kll_id = inc.inc_kll_id ) ";
172                    $csql = str_replace("<ph>", $replace, $this->sql_);
173                }
174                if ($this->inv_all_)
175                {
176                    $replace = " inner join kb3_inv_all ina
177                            on ( ina.ina_all_id in ( ".join(',', $this->inv_all_)." ) and kll.kll_id = ina.ina_kll_id ) ";
178                    $asql = str_replace("<ph>", $replace, $this->sql_);
179                }
180
181                if ($psql)
182                    $nsql = $psql." union ";
183                if ($csql)
184                    $nsql .= $csql." union ";
185                if ($asql)
186                    $nsql .= $asql;
187
188                $this->sql_ = $nsql;
189            }
190            if ($this->minkllid_)
191            {
192                $this->sql_ .= ' WHERE kll.kll_id > \''.$this->minkllid_.'\' ';
193            }
194
195            // group by
196            if ($this->groupby_) $this->sql_ .= " group by ".implode(",", $this->groupby_);
197            // order/limit
198            if ($this->ordered_)
199            {
200                if (!$this->orderby_) $this->sql_ .= " order by kll_timestamp desc";
201                else $this->sql_ .= " order by ".$this->orderby_;
202            }
203            if ($this->limit_) $this->sql_ .= " limit ".$this->offset_.", ".$this->limit_;
204            // echo '<p>'.$this->sql_."</p>";
205            $this->qry_->execute($this->sql_);
206        }
207    }
208
209    function getRow()
210    {
211        $this->execQuery();
212        if ($this->plimit_ && $this->killcounter_ >= $this->plimit_)
213        {
214            // echo $this->plimit_." ".$this->killcounter_;
215            return null;
216        }
217
218        $skip = $this->poffset_ - $this->killpointer_;
219        if ($skip > 0)
220        {
221            for ($i = 0; $i < $skip; $i++)
222            {
223                $this->killpointer_++;
224                $row = $this->qry_->getRow();
225            }
226        }
227
228        $row = $this->qry_->getRow();
229
230        return $row;
231    }
232
233    function getKill()
234    {
235        $this->execQuery();
236        if ($this->plimit_ && $this->killcounter_ >= $this->plimit_)
237        {
238            // echo $this->plimit_." ".$this->killcounter_;
239            return null;
240        }
241
242        $skip = $this->poffset_ - $this->killpointer_;
243        if ($skip > 0)
244        {
245            for ($i = 0; $i < $skip; $i++)
246            {
247                $this->killpointer_++;
248                $row = $this->qry_->getRow();
249            }
250        }
251
252        $row = $this->qry_->getRow();
253        if ($row)
254        {
255            $this->killcounter_++;
256            if ($row['scl_class'] != 2 && $row['scl_class'] != 3 && $row['scl_class'] != 11)
257                $this->realkillcounter_++;
258
259            global $config;
260            if ($config->getConfig('ship_values'))
261            {
262                if ($row['shp_value'])
263                {
264                    $row['scl_value'] = $row['shp_value'];
265                }
266            }
267
268            $this->killisk_ += $row['scl_value'] / 1000000;
269            $this->killpoints_ += $row['kll_points'];
270
271            $kill = new Kill($row['kll_id']);
272            $kill->setTimeStamp($row['kll_timestamp']);
273            $kill->setSolarSystemName($row['sys_name']);
274            $kill->setSolarSystemSecurity($row['sys_sec']);
275            $kill->setVictimName($row['plt_name']);
276            $kill->setVictimCorpName($row['crp_name']);
277            $kill->setVictimCorpID($row['crp_id']);
278            $kill->setVictimAllianceName($row['all_name']);
279            $kill->setVictimAllianceID($row['all_id']);
280            $kill->setVictimShipName($row['shp_name']);
281            $kill->setVictimShipExternalID($row['shp_externalid']);
282            $kill->setVictimShipClassName($row['scl_class']);
283            $kill->setVictimShipValue(round($row['scl_value'] / 1000000, 2));
284            $kill->setVictimID($row['kll_victim_id']);
285            $kill->setFBPilotName($row['fbplt_name']);
286            $kill->setFBCorpName($row['fbcrp_name']);
287            $kill->setKillPoints($row['kll_points']);
288            $kill->plt_ext_ = $row['plt_externalid'];
289            $kill->fbplt_ext_ = $row['fbplt_externalid'];
290            $kill->_sclid = $row['scl_id'];
291            $kill->_shpid = $row['shp_id'];
292
293            return $kill;
294        }
295        else return null;
296    }
297
298    function getAllKills()
299    {
300        while ($this->getKill())
301        {
302        }
303        $this->rewind();
304    }
305
306    function addInvolvedPilot($pilot)
307    {
308        $this->inv_plt_[] = $pilot->getID();
309        if ($this->inv_crp_ || $this->inv_all_)
310            $this->mixedinvolved_ = true;
311    }
312
313    function addInvolvedCorp($corp)
314    {
315        $this->inv_crp_[] = $corp->getID();
316        if ($this->inv_plt_ || $this->inv_all_)
317            $this->mixedinvolved_ = true;
318    }
319
320    function addInvolvedAlliance($alliance)
321    {
322        $this->inv_all_[] = $alliance->getID();
323        if ($this->inv_plt_ || $this->inv_crp_)
324            $this->mixedinvolved_ = true;
325    }
326
327    function addVictimPilot($pilot)
328    {
329        $this->vic_plt_[] = $pilot->getID();
330        if ($this->vic_crp_ || $this->vic_all_)
331            $this->mixedvictims_ = true;
332    }
333
334    function addVictimCorp($corp)
335    {
336        $this->vic_crp_[] = $corp->getID();
337        if ($this->vic_plt_ || $this->vic_all_)
338            $this->mixedvictims_ = true;
339    }
340
341    function addVictimAlliance($alliance)
342    {
343        $this->vic_all_[] = $alliance->getID();
344        if ($this->vic_plt_ || $this->vic_crp_)
345            $this->mixedvictims_ = true;
346    }
347
348    function addVictimShipClass($shipclass)
349    {
350        array_push($this->vic_scl_id_, $shipclass->getID());
351    }
352
353    function addVictimShip($ship)
354    {
355    }
356
357    function addItemDestroyed($item)
358    {
359    }
360
361    function addRegion($region)
362    {
363        array_push($this->regions_, $region->getID());
364    }
365
366    function addSystem($system)
367    {
368        array_push($this->systems_, $system->getID());
369    }
370
371    function addGroupBy($groupby)
372    {
373        array_push($this->groupby_, $groupby);
374    }
375
376    function setPageSplitter($pagesplitter)
377    {
378        if (isset($_GET['page'])) $page = $_GET['page'];
379        else $page = 1;
380        $this->plimit_ = $pagesplitter->getSplit();
381        $this->poffset_ = ($page * $this->plimit_) - $this->plimit_;
382        // echo $this->offset_;
383        // echo $this->limit_;
384    }
385
386    function setWeek($weekno)
387    {
388        $this->timeframe_ .= " and date_format( kll.kll_timestamp, \"%u\" ) = ";
389        $this->timeframe_ .= $weekno;
390    }
391
392    function setYear($yearno)
393    {
394        $this->timeframe_ .= " and date_format( kll.kll_timestamp, \"%Y\" ) = ";
395        $this->timeframe_ .= $yearno;
396    }
397
398    function setStartWeek($weekno)
399    {
400        $this->timeframe_ .= " and date_format( kll.kll_timestamp, \"%u\" ) >= ";
401        $this->timeframe_ .= $weekno;
402    }
403
404    function setStartDate($timestamp)
405    {
406        $this->timeframe_ .= " and kll.kll_timestamp >= '".$timestamp."'";
407    }
408
409    function setEndDate($timestamp)
410    {
411        $this->timeframe_ .= " and kll.kll_timestamp <= '".$timestamp."'";
412    }
413
414    function setRelated($killid)
415    {
416        $this->related_ = $killid;
417    }
418
419    function setLimit($limit)
420    {
421        $this->limit_ = $limit;
422    }
423
424    function setOrderBy($orderby)
425    {
426        $this->orderby_ = $orderby;
427    }
428
429    function setMinKllID($id)
430    {
431        $this->timeframe_ = '';
432        $this->minkllid_ = $id;
433    }
434
435    function getCount()
436    {
437        $this->execQuery();
438        return $this->qry_->recordCount();
439    }
440
441    function getRealCount()
442    {
443        $this->execQuery();
444        return $this->qry_->recordCount();
445    }
446
447    function getISK()
448    {
449        $this->execQuery();
450        return $this->killisk_;
451    }
452
453    function getPoints()
454    {
455        return $this->killpoints_;
456    }
457
458    function rewind()
459    {
460        $this->qry_->rewind();
461        $this->killcounter_ = 0;
462    }
463
464    function setPodsNoobShips($flag)
465    {
466        if (!$flag)
467        {
468            array_push($this->exclude_scl_, 2);
469            array_push($this->exclude_scl_, 3);
470            array_push($this->exclude_scl_, 11);
471        }
472    }
473
474    function setOrdered($flag)
475    {
476        $this->ordered_ = $flag;
477    }
478}
479?>
Note: See TracBrowser for help on using the browser.