root/dev/common/includes/class.killlist.php @ 424

Revision 424, 27.2 KB (checked in by kovell, 11 years ago)

Fixes: killlists with both involved corps and alliances work. Memory use reduced.

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        $this->walked = false;
25                $this->apikill_ = false;
26    }
27
28    function execQuery()
29    {
30        /* Killlist philosophy
31         * For EDK the most common uses of a killlist require date ordering
32         * based on kb3_kills. This is then restricted by joins with other
33         * tables. MySQL will decide on a query interpretation based on rows
34         * returned in each step. For EDK this can be very suboptimal as the
35         * most important restriction is by date or number of kills - both
36         * based on kb3_kills - which is usually followed by ordering by date.
37         *
38         * The killlist is constructed so as to give MySQL the least opportunity
39         * to carry out the query in a slow manner. kb3_kills is used as the
40         * main table. Where possible it is only joined with tables that do not
41         * restrict the output. Comment count and involved count are in an outer
42         * query to avoid the use of distinct on the whole kb3_kills table and
43         * the potential ordering of a query with kb3_inv_detail first.
44         *
45         */
46        if (!$this->qry_->executed_)
47        {
48                        $datefilter=$this->getDateFilter();
49            $this->sql_ = '';
50            if (!count($this->groupby_) && ($this->comments_ || $this->involved_))
51            {
52                $this->sql_ .= 'SELECT list.* ';
53                if($this->comments_) $this->sql_ .= ', count(distinct com.id) as comments';
54                if($this->involved_) $this->sql_ .= ', max(ind.ind_order) + 1 as inv';
55                $this->sql_ .= ' FROM (';
56            }
57            if (!count($this->groupby_))
58            {
59                if($this->summary_)
60                {
61                                        $this->sql_ .= 'select distinct kll.kll_id, kll.kll_ship_id,
62                                                        kll.kll_points, kll.kll_isk_loss,
63                                                shp.shp_class, shp.shp_name,
64                                        shp.shp_externalid, shp.shp_id,
65                                        scl.scl_id, scl.scl_class, scl.scl_value';
66                    if(count($this->systems_))
67                      $this->sql_ .= ', sys.sys_name, sys.sys_sec';
68                }
69                else
70                                {
71                                        $this->sql_ .= 'select distinct kll.kll_id, kll.kll_timestamp, kll.kll_external_id,
72                                                                plt.plt_name, crp.crp_name, crp.crp_id,
73                                                                ali.all_name, ali.all_id,
74                                                                kll.kll_system_id, kll.kll_ship_id,
75                                                                kll.kll_victim_id, plt.plt_externalid,
76                                                                kll.kll_crp_id, kll.kll_points, kll.kll_isk_loss,
77                                                                shp.shp_class, shp.shp_name,
78                                                                shp.shp_externalid, shp.shp_id,
79                                                                scl.scl_id, scl.scl_class, scl.scl_value,
80                                                                sys.sys_name, sys.sys_sec,
81                                                                fbplt.plt_name as fbplt_name,
82                                                                fbplt.plt_externalid as fbplt_externalid,
83                                                                fbcrp.crp_name as fbcrp_name,
84                                                                fbali.all_name as fball_name';
85                                }
86            }
87
88
89            if (count($this->groupby_))
90            {
91                $this->sql_ .= "SELECT COUNT(1) as cnt, ".implode(",", $this->groupby_);
92            }
93            if (config::get('ship_values'))
94            {
95                $this->sql_ .= ', ksv.shp_value';
96            }
97
98            $this->sql_ .= "    FROM kb3_kills kll ";
99            // MySQL tends to pick an index for this query poorly so specify one.
100            //if($this->ordered_ && !$this->orderby_) $this->sql_ .= "use index (".$timeindex.") ";
101
102            $this->sql_ .= "INNER JOIN kb3_ships shp
103                              ON ( shp.shp_id = kll.kll_ship_id )
104                           INNER JOIN kb3_ship_classes scl
105                              ON ( scl.scl_id = shp.shp_class )";
106            if (config::get('ship_values'))
107            {
108                $this->sql_ .= ' left join kb3_ships_values ksv ON (kll.kll_ship_id = ksv.shp_id) ';
109            }
110
111            if (!$this->summary_) $this->sql_ .= "INNER JOIN kb3_pilots plt
112                                                                ON ( plt.plt_id = kll.kll_victim_id )
113                                                        INNER JOIN kb3_corps crp
114                                                                ON ( crp.crp_id = kll.kll_crp_id )
115                                                        INNER JOIN kb3_alliances ali
116                                                                ON ( ali.all_id = kll.kll_all_id )
117                                                        INNER JOIN kb3_pilots fbplt
118                                                                ON ( fbplt.plt_id = kll.kll_fb_plt_id )
119                                                        INNER JOIN kb3_inv_detail fb
120                                                                ON ( fb.ind_kll_id = kll.kll_id AND fb.ind_plt_id = kll.kll_fb_plt_id )
121                                                        INNER JOIN kb3_corps fbcrp
122                                                                ON ( fbcrp.crp_id = fb.ind_crp_id )
123                                                        INNER JOIN kb3_alliances fbali
124                                                                ON ( fbali.all_id = fb.ind_all_id )
125                           ";
126            if(!$this->summary_ || count($this->systems_))
127              $this->sql_ .= " INNER JOIN kb3_systems sys
128                              ON ( sys.sys_id = kll.kll_system_id )";
129
130            // regions
131            if (count($this->regions_))
132            {
133                $this->sql_ .= " INNER JOIN kb3_constellations con
134                              ON ( con.con_id = sys.sys_con_id and
135                           con.con_reg_id in ( ".implode($this->regions_, ",")." ) )";
136            }
137
138            if( $datefilter == "" && ( $this->inv_plt_ || $this->inv_crp_ || $this->inv_all_))
139            {
140                                $this->sql_ .= " INNER JOIN kb3_inv_detail ind ON (kll.kll_id = ind.ind_kll_id AND (";
141                                $invop = "";
142                                if($this->inv_plt_ )
143                                {
144                                        $this->sql_ .= " ind.ind_plt_id IN (".
145                                                implode(',', $this->inv_plt_)." ) ";
146                                        $invop = "OR";
147                                }
148                                if($this->inv_crp_ )
149                                {
150                                        $this->sql_ .= $invop." ind.ind_crp_id IN (".
151                                                implode(',', $this->inv_crp_)." ) ";
152                                        $invop = "OR";
153                                }
154                                if($this->inv_all_ )
155                                {
156                                        $this->sql_ .= $invop." ind.ind_all_id IN (".
157                                                implode(',', $this->inv_all_)." ) ";
158                                }
159                                $this->sql_ .= ") ) ";
160            }
161            // The first argument after WHERE affects sql optimisation so check
162            // each possible argument to see whether it should use AND or WHERE
163            // rather than start with WHERE 1
164            $sqlwhereop = ' WHERE ';
165            // Date filter
166            if($datefilter != "")
167            {
168                $this->sql_ .= $sqlwhereop.$datefilter;
169                $sqlwhereop = ' AND ';
170            }
171
172                        if($this->apikill_)
173                        {
174                $this->sql_ .= $sqlwhereop." kll.kll_external_id IS NOT NULL ";
175                $sqlwhereop = ' AND ';
176                        }
177
178            // System filter
179            if (count($this->systems_))
180            {
181                $this->sql_ .= $sqlwhereop." kll.kll_system_id in ( ".implode($this->systems_, ",").")";
182                $sqlwhereop = ' AND ';
183            }
184            // victim filter
185            if($this->vic_plt_ || $this->vic_crp_ || $this->vic_all_)
186            {
187                                $this->sql_ .= $sqlwhereop." ( ";
188                                $sqlwhereop = "";
189
190                                if ($this->vic_plt_)
191                                        {$this->sql_ .= " ".$sqlwhereop." kll.kll_victim_id in ( ".implode(',', $this->vic_plt_)." )"; $sqlwhereop = " OR ";}
192                                if ($this->vic_crp_)
193                                        {$this->sql_ .= " ".$sqlwhereop." kll.kll_crp_id in ( ".implode(',', $this->vic_crp_)." )"; $sqlwhereop = " OR ";}
194                                if ($this->vic_all_)
195                                        {$this->sql_ .= " ".$sqlwhereop." kll.kll_all_id in ( ".implode(',', $this->vic_all_)." )"; $sqlwhereop = " OR ";}
196                                       
197                                $sqlwhereop = ' AND ';
198                                $this->sql_ .= " ) ";
199            }
200
201            // related kills
202            if ($this->related_)
203            {
204                $rqry = new DBQuery();
205                $rsql = "select kll_timestamp, kll_system_id from kb3_kills where kll_id = ".$this->related_;
206
207                $rqry->execute($rsql);
208                $rrow = $rqry->getRow();
209
210                $this->sql_ .= $sqlwhereop."kll.kll_timestamp <=
211                               ".(date('Y-m-d H:i:s',strtotime($rrow['kll_timestamp']) + 60 * 60)).
212                           " and kll.kll_timestamp >=
213                               ".(date('Y-m-d H:i:s',strtotime($rrow['kll_timestamp']) - 60 * 60)).
214                            " and kll.kll_system_id = ".$rrow['kll_system_id'];
215                $sqlwhereop = " AND ";
216            }
217            // Get all kills after given kill id (used for feed syndication)
218            if ($this->minkllid_)
219            {
220                $this->sql_ .= $sqlwhereop.'kll.kll_id >= '.$this->minkllid_.' ';
221                $sqlwhereop = ' AND ';
222            }
223
224            // Get all kills before given kill id (used for feed syndication)
225            if ($this->maxkllid_)
226            {
227                $this->sql_ .= $sqlwhereop.'kll.kll_id <= '.$this->maxkllid_.' ';
228                $sqlwhereop = ' AND ';
229            }
230
231            // excluded ship filter
232            if (count($this->exclude_scl_))
233            {
234                $this->sql_ .= $sqlwhereop." shp.shp_class not in ( ".implode(",", $this->exclude_scl_)." )";
235                $sqlwhereop = ' AND ';
236            }
237            // included ship filter
238            if (count($this->vic_scl_id_))
239            {
240                $this->sql_ .= $sqlwhereop." shp.shp_class in ( ".implode(",", $this->vic_scl_id_)." ) ";
241                $sqlwhereop = ' AND ';
242            }
243            // involved filter
244            // involved parties who aren't also the victim
245            // Only use a join if no other limits are used.
246            if($this->inv_plt_ || $this->inv_crp_ || $this->inv_all_)
247            {
248                                if($this->inv_all_ && $this->inv_crp_)
249                                {
250                                        $this->sql_ .= $sqlwhereop." ( ";
251                                        $sqlwhereop = '';
252                                }
253                                // No need to check the involved pilot since they can't shoot themself and get a killmail.
254                if ($this->inv_all_)
255                {
256                    $this->sql_ .= $sqlwhereop." kll.kll_all_id NOT IN ( ".implode(',', $this->inv_all_)." )";
257                    $sqlwhereop = ' AND ';
258                }
259                if ($this->inv_crp_)
260                {
261                    $this->sql_ .= $sqlwhereop." kll.kll_crp_id NOT IN ( ".implode(',', $this->inv_crp_)." )";
262                    $sqlwhereop = ' AND ';
263                }
264                                if($this->inv_all_ && $this->inv_crp_) $this->sql_ .= ") ";
265                if( $datefilter != "")
266                {
267                    $this->sql_ .= $sqlwhereop." EXISTS (SELECT 1 FROM kb3_inv_detail exind ".
268                                                 "WHERE kll.kll_id = exind.ind_kll_id AND (";
269                                        $sqlwhereop = "";
270                    if ($this->inv_all_)
271                        {$this->sql_ .= $sqlwhereop." exind.ind_all_id in ( ".implode(',', $this->inv_all_)." ) ";$sqlwhereop = " OR ";}
272                    if ($this->inv_crp_)
273                        {$this->sql_ .= $sqlwhereop." exind.ind_crp_id in ( ".implode(',', $this->inv_crp_)." ) ";$sqlwhereop = " OR ";}
274                    if ($this->inv_plt_)
275                        $this->sql_ .= $sqlwhereop." exind.ind_plt_id in ( ".implode(',', $this->inv_plt_)." ) ";
276                    $this->sql_ .= " ) ) ";
277                    $sqlwhereop = " AND ";
278                }
279            }
280            // This may scan the entire table if LIMIT or a date filter are not used.
281                        // Some queries combining groups will be slow on mysql versions < 5 without index merge.
282            if($this->comb_plt_ || $this->comb_crp_ || $this->comb_all_)
283            {
284                $this->sql_ .= $sqlwhereop." ( ";
285                $sqlwhereop = " OR ";
286                                $sqlexistop = "EXISTS ( SELECT 1 FROM kb3_inv_detail cind WHERE kll.kll_id = cind.ind_kll_id AND (";
287                if($this->comb_plt_)
288                {
289                        $this->sql_ .= $sqlexistop." cind.ind_plt_id in ( ".implode(',', $this->comb_plt_)." )";
290                        $sqlexistop = " OR ";
291                }
292                if($this->comb_crp_)
293                {
294                        $this->sql_ .= $sqlexistop." cind.ind_crp_id in ( ".implode(',', $this->comb_crp_)." )";
295                        $sqlexistop = " OR ";
296                }
297                if($this->comb_all_)
298                {
299                        $this->sql_ .= $sqlexistop." cind.ind_all_id in ( ".implode(',', $this->comb_all_)." )";
300                }
301                                $this->sql_ .= " ) )";
302                if($this->comb_plt_)
303                {
304                        $this->sql_ .= $sqlwhereop."kll.kll_victim_id in ( ".implode(',', $this->comb_plt_)." ) ";
305                        $sqlwhereop = " OR ";
306                }
307                if($this->comb_crp_)
308                {
309                        $this->sql_ .= $sqlwhereop."kll.kll_crp_id in ( ".implode(',', $this->comb_crp_)." ) ";
310                        $sqlwhereop = " OR ";
311                }
312                if($this->comb_all_)
313                {
314                        $this->sql_ .= $sqlwhereop."kll.kll_all_id in ( ".implode(',', $this->comb_all_)." ) ";
315                }
316                $this->sql_ .= " )";
317                $sqlwhereop = " AND ";
318            }
319
320            // GROUP BY
321            if ($this->groupby_) $this->sql_ .= " GROUP BY ".implode(",", $this->groupby_);
322            // order/limit
323            if ($this->ordered_)
324            {
325                if (!$this->orderby_) $this->sql_ .= " order by kll_timestamp desc";
326                else $this->sql_ .= " order by ".$this->orderby_;
327            }
328            if ($this->limit_) $this->sql_ .= " limit ".$this->limit_." OFFSET ".$this->offset_;
329            // Enclose query in another to fetch comments and involved parties
330            if(!count($this->groupby_) && ($this->comments_ || $this->involved_))
331            {
332                $this->sql_ .= ") list";
333                if($this->involved_) $this->sql_ .= ' join kb3_inv_detail ind ON (ind.ind_kll_id = list.kll_id)';
334                if($this->comments_) $this->sql_ .= ' left join kb3_comments com ON (list.kll_id = com.kll_id)';
335                $this->sql_ .= " group by list.kll_id";
336                // Outer query also needs to be ordered, if there's an order
337                if ($this->ordered_)
338                {
339                    if (!$this->orderby_) $this->sql_ .= " order by kll_timestamp desc";
340                    else $this->sql_ .= " order by ".$this->orderby_;
341                }
342            }
343            $this->sql_ .= " -- kill list";
344            $this->qry_->execute($this->sql_);
345        }
346    }
347
348    function getRow()
349    {
350        $this->execQuery();
351        if ($this->plimit_ && $this->killcounter_ >= $this->plimit_)
352        {
353            // echo $this->plimit_." ".$this->killcounter_;
354            return null;
355        }
356
357        $skip = $this->poffset_ - $this->killpointer_;
358        if ($skip > 0)
359        {
360            for ($i = 0; $i < $skip; $i++)
361            {
362                $this->killpointer_++;
363                $row = $this->qry_->getRow();
364            }
365        }
366
367        $row = $this->qry_->getRow();
368
369        return $row;
370    }
371
372    function getKill()
373    {
374        $this->execQuery();
375        if ($this->plimit_ && $this->killcounter_ >= $this->plimit_)
376        {
377            // echo $this->plimit_." ".$this->killcounter_;
378            return null;
379        }
380
381        $skip = $this->poffset_ - $this->killpointer_;
382        if ($skip > 0)
383        {
384            for ($i = 0; $i < $skip; $i++)
385            {
386                $this->killpointer_++;
387                $row = $this->qry_->getRow();
388            }
389        }
390
391        $row = $this->qry_->getRow();
392        if ($row)
393        {
394            $this->killcounter_++;
395            if ($row['scl_class'] != 2 && $row['scl_class'] != 3 && $row['scl_class'] != 11)
396                $this->realkillcounter_++;
397
398           if (config::get('ship_values'))
399            {
400                if ($row['shp_value'])
401                {
402                    $row['scl_value'] = $row['shp_value'];
403                }
404            }
405
406            if ($this->walked == false)
407            {
408                $this->killisk_ += $row['kll_isk_loss'];
409                $this->killpoints_ += $row['kll_points'];
410            }
411
412            $kill = new Kill($row['kll_id']);
413            $kill->setTimeStamp($row['kll_timestamp']);
414            $kill->setSolarSystemName($row['sys_name']);
415            $kill->setSolarSystemSecurity($row['sys_sec']);
416            $kill->setVictimName($row['plt_name']);
417            $kill->setVictimCorpName($row['crp_name']);
418            $kill->setVictimCorpID($row['crp_id']);
419            $kill->setVictimAllianceName($row['all_name']);
420            $kill->setVictimAllianceID($row['all_id']);
421            $kill->setVictimShipName($row['shp_name']);
422            $kill->setVictimShipExternalID($row['shp_externalid']);
423            $kill->setVictimShipClassName($row['scl_class']);
424            $kill->setVictimShipValue($row['scl_value']);
425            $kill->setVictimID($row['kll_victim_id']);
426            $kill->setFBPilotName($row['fbplt_name']);
427            $kill->setFBCorpName($row['fbcrp_name']);
428            $kill->setFBAllianceName($row['fbcrp_name']);
429            $kill->setKillPoints($row['kll_points']);
430                        $kill->setExternalID($row['kll_external_id']);
431                        $kill->setISKLoss($row['kll_isk_loss']);
432                        $kill->plt_ext_ = $row['plt_externalid'];
433            $kill->fbplt_ext_ = $row['fbplt_externalid'];
434            $kill->_sclid = $row['scl_id'];
435            $kill->_shpid = $row['shp_id'];
436            //Set the involved party count if it is known
437            if($this->involved_) $kill->setInvolvedPartyCount($row['inv']);
438            //Set the comment count if it is known
439            if($this->comments_) $kill->setCommentCount($row['comments']);
440            if ($this->_tag)
441            {
442                $kill->_tag = $this->_tag;
443            }
444            if (config::get('kill_classified'))
445            {
446                if ($kill->isClassified())
447                {
448                    $kill->setSolarSystemName('Classified');
449                    $kill->setSolarSystemSecurity('0.0');
450                }
451            }
452
453            return $kill;
454        }
455        else
456        {
457            $this->walked = true;
458            return null;
459        }
460    }
461
462    function getAllKills()
463    {
464        while ($this->getKill())
465        {
466        }
467        $this->rewind();
468    }
469
470    function addInvolvedPilot($pilot)
471    {
472        if(is_numeric($pilot)) $this->inv_plt_[] = $pilot;
473            else $this->inv_plt_[] = $pilot->getID();
474    }
475
476    function addInvolvedCorp($corp)
477    {
478        if(is_numeric($corp)) $this->inv_crp_[] = $corp;
479            else $this->inv_crp_[] = $corp->getID();
480    }
481
482    function addInvolvedAlliance($alliance)
483    {
484        if(is_numeric($alliance)) $this->inv_all_[] = $alliance;
485        else $this->inv_all_[] = $alliance->getID();
486    }
487
488    function addVictimPilot($pilot)
489    {
490        if(is_numeric($pilot)) $this->vic_plt_[] = $pilot;
491            else $this->vic_plt_[] = $pilot->getID();
492    }
493
494    function addVictimCorp($corp)
495    {
496        if(is_numeric($corp)) $this->vic_crp_[] = $corp;
497            else $this->vic_crp_[] = $corp->getID();
498    }
499
500    function addVictimAlliance($alliance)
501    {
502        if(is_numeric($alliance)) $this->vic_all_[] = $alliance;
503        else $this->vic_all_[] = $alliance->getID();
504    }
505
506    function addCombinedPilot($pilot)
507    {
508            if(is_numeric($pilot)) $this->comb_plt_[] = $pilot;
509            else $this->comb_plt_[] = $pilot->getID();
510    }
511
512    function addCombinedCorp($corp)
513    {
514            if(is_numeric($corp)) $this->comb_crp_[] = $corp;
515            else $this->comb_crp_[] = $corp->getID();
516    }
517
518    function addCombinedAlliance($alliance)
519    {
520            if(is_numeric($alliance)) $this->comb_all_[] = $alliance;
521            else $this->comb_all_[] = $alliance->getID();
522    }
523
524    function addVictimShipClass($shipclass)
525    {
526            if(is_numeric($shipclass)) $this->vic_scl_id_[] = $shipclass;
527            else $this->vic_scl_id_[] = $shipclass->getID();
528    }
529
530    function addVictimShip($ship)
531    {
532    }
533
534    function addItemDestroyed($item)
535    {
536    }
537
538    function addRegion($region)
539    {
540        if(is_numeric($region)) $this->regions_[] = $region;
541        else $this->regions_[] = $region->getID();
542    }
543
544    function addSystem($system)
545    {
546        if(is_numeric($system)) $this->systems_[] = $system;
547        else $this->systems_[] = $system->getID();
548    }
549
550    function addGroupBy($groupby)
551    {
552        array_push($this->groupby_, $groupby);
553    }
554
555    function setPageSplitter($pagesplitter)
556    {
557        if (isset($_GET['page'])) $page = $_GET['page'];
558        else $page = 1;
559        $this->plimit_ = $pagesplitter->getSplit();
560        $this->poffset_ = ($page * $this->plimit_) - $this->plimit_;
561    }
562
563    //! Filter results by week. Requires the year to also be set.
564    function setWeek($weekno)
565    {
566        $weekno=intval($weekno);
567        if($weekno <1)  $this->weekno_ = 1;
568        if($weekno >53) $this->weekno_ = 53;
569        else $this->weekno_ = $weekno;
570    }
571
572    //! Filter results by year.
573    function setYear($yearno)
574    {
575        // 1970-2038 is the allowable range for the timestamp code used
576        // Needs to be revisited in the next 30 years
577        $yearno = intval($yearno);
578        if($yearno < 1970) $this->yearno_ = 1970;
579        if($yearno > 2038) $this->yearno_ = 2038;
580        else $this->yearno_ = $yearno;
581    }
582
583    //! Filter results by starting week. Requires the year to also be set.
584    function setStartWeek($weekno)
585    {
586        $weekno=intval($weekno);
587        if($weekno <1)  $this->startweekno_ = 1;
588        if($weekno >53) $this->startweekno_ = 53;
589        else $this->startweekno_ = $weekno;
590    }
591
592    //! Filter results by starting date/time.
593    function setStartDate($timestamp)
594    {
595        // Check timestamp is valid before adding
596        if(strtotime($timestamp)) $this->startDate_ = $timestamp;
597    }
598
599    //! Filter results by ending date/time.
600    function setEndDate($timestamp)
601    {
602        // Check timestamp is valid before adding
603        if(strtotime($timestamp)) $this->endDate_ = $timestamp;
604    }
605
606    //! Convert given date ranges to SQL date range.
607
608        //! \return string containing SQL date filter.
609    function getDateFilter()
610    {
611                $qstartdate = makeStartDate($this->weekno_, $this->yearno_, $this->monthno_, $this->startweekno_, $this->startDate_);
612                $qenddate = makeEndDate($this->weekno_, $this->yearno_, $this->monthno_, $this->endDate_);
613                if($qstartdate) $sql .= " kll.kll_timestamp >= '".gmdate('Y-m-d H:i',$qstartdate)."' ";
614                if($qstartdate && $qenddate) $sql .= " AND ";
615                if($qenddate) $sql .= " kll.kll_timestamp <= '".gmdate('Y-m-d H:i',$qenddate)."' ";
616                return $sql;
617    }
618
619    function setRelated($killid)
620    {
621        $this->related_ = $killid;
622    }
623
624    function setLimit($limit)
625    {
626        $this->limit_ = $limit;
627    }
628        //! Only return kills with an external id set.
629        function setAPIKill($hasid = true)
630        {
631                $this->apikill_ = $hasid;
632        }
633
634    function setOrderBy($orderby)
635    {
636        $this->orderby_ = $orderby;
637    }
638
639    function setMinKllID($id)
640    {
641        $this->minkllid_ = $id;
642    }
643
644    function setMaxKllID($id)
645    {
646        $this->maxkllid_ = $id;
647    }
648
649    function setSummary($summary = false)
650    {
651        $this->summary_ = $summary;
652    }
653
654    function getCount()
655    {
656        $this->execQuery();
657        return $this->qry_->recordCount();
658    }
659
660    function getRealCount()
661    {
662        $this->execQuery();
663        return $this->qry_->recordCount();
664    }
665
666    function getISK()
667    {
668        $this->execQuery();
669        return $this->killisk_;
670    }
671
672    function getPoints()
673    {
674        return $this->killpoints_;
675    }
676
677    function rewind()
678    {
679        $this->qry_->rewind();
680        $this->killcounter_ = 0;
681    }
682
683    function setPodsNoobShips($flag)
684    {
685        if (!$flag)
686        {
687            array_push($this->exclude_scl_, 2);
688            array_push($this->exclude_scl_, 3);
689            array_push($this->exclude_scl_, 11);
690        }
691    }
692
693    function setOrdered($flag)
694    {
695        $this->ordered_ = $flag;
696    }
697
698    function tag($string)
699    {
700        if ($string == '')
701        {
702            $this->_tag = null;
703        }
704        else
705        {
706            $this->_tag = $string;
707        }
708    }
709
710    // Add a comment count to the killlist SQL
711    function setCountComments($comments = true)
712    {
713        $this->comments_ = $comments;
714    }
715
716    // Add an involved party count to the killlist SQL
717    function setCountInvolved($setinv = true)
718    {
719        $this->involved_ = $setinv;
720    }
721}
722
723class CombinedKillList extends KillList
724{
725    function CombinedKillList()
726    {
727        // please only load killlists here
728        $this->lists = func_get_args();
729        if (!is_array($this->lists))
730        {
731            trigger_error('No killlists given to CombinedKillList', E_USER_ERROR);
732        }
733        $this->kills = false;
734    }
735
736    function buildKillArray()
737    {
738        $this->kills = array();
739        foreach ($this->lists as $killlist)
740        {
741            // reset the list
742            $killlist->rewind();
743
744            // load all kills and store them in an array
745            while ($kill = $killlist->getKill())
746            {
747                // take sure that if there are multiple kills all are stored
748                if (isset($this->kills[$kill->timestamp_]))
749                {
750                    $this->kills[$kill->timestamp_.rand()] = $kill;
751                }
752                else
753                {
754                    $this->kills[$kill->timestamp_] = $kill;
755                }
756            }
757        }
758
759        // sort the kills by time
760        krsort($this->kills);
761    }
762
763    function getKill()
764    {
765        // on the first request we load up our kills
766        if ($this->kills === false)
767        {
768            $this->buildKillArray();
769            if (is_numeric($this->poffset_) && is_numeric($this->plimit_))
770                $this->kills = array_slice($this->kills, $this->poffset_, $this->plimit_);
771        }
772
773        // once all kills are out this will return null so we're fine
774        return array_shift($this->kills);
775    }
776
777    function rewind()
778    {
779        // intentionally left empty to overload the standard handle
780    }
781
782    function getCount()
783    {
784        $count = 0;
785        foreach ($this->lists as $killlist)
786        {
787            $count += $killlist->getCount();
788        }
789        return $count;
790    }
791
792    function getRealCount()
793    {
794        $count = 0;
795        foreach ($this->lists as $killlist)
796        {
797            $count += $killlist->getRealCount();
798        }
799        return $count;
800    }
801
802    function getISK()
803    {
804        $sum = 0;
805        foreach ($this->lists as $killlist)
806        {
807            $sum += $killlist->getISK();
808        }
809       return $sum;
810    }
811
812    function getPoints()
813    {
814        $sum = 0;
815        foreach ($this->lists as $killlist)
816        {
817            $sum += $killlist->getPoints();
818        }
819        return $sum;
820    }
821
822}
823?>
Note: See TracBrowser for help on using the browser.