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

Revision 399, 12.0 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('common/includes/class.kill.php');
3require_once('common/includes/class.ship.php');
4
5class allianceSummary
6{
7        function allianceSummary($all_id)
8        {
9                $this->all_id_ = intval($all_id);
10                $this->executed_ = false;
11        }
12        //! Get the complete summary for this alliance.
13
14        //! \return an array of ship id by kill/loss count/isk.
15        function getSummary()
16        {
17                if(!$this->executed_) $this->execute();
18                return $this->summary;
19        }
20        //! Return total ISK killed.
21        function getTotalKillISK()
22        {
23                if(!$this->executed_) $this->execute();
24                foreach($this->summary as $value)
25                        $totalisk .= $value['killisk'];
26                return $totalisk;
27        }
28        //! Return total ISK lost.
29        function getTotalLossISK()
30        {
31                if(!$this->executed_) $this->execute();
32                foreach($this->summary as $value)
33                        $totalisk .= $value['lossisk'];
34                return $totalisk;
35        }
36        //! Return the number of kills for the given ship class.
37        function getKillCount($shp_class)
38        {
39                if(!$this->executed_) $this->execute();
40                return intval($this->summary[$ship_class]['killcount']);
41        }
42        //! Return the ISK value of kills for the given ship class.
43        function getKillISK($shp_class)
44        {
45                if(!$this->executed_) $this->execute();
46                return intval($this->summary[$ship_class]['killisk']);
47        }
48        //! Return the number of losses for the given ship class.
49        function getLossCount($shp_class)
50        {
51                if(!$this->executed_) $this->execute();
52                return intval($this->summary[$ship_class]['losscount']);
53        }
54        //! Return the ISK value of losses for the given ship class.
55        function getLossISK($shp_class)
56        {
57                if(!$this->executed_) $this->execute();
58                return intval($this->summary[$ship_class]['lossisk']);
59        }
60        //! Fetch the summary information.
61        function execute()
62        {
63                if($this->executed_) return;
64                if(!$this->all_id_)
65                {
66                        $this->executed_ = true;
67                        return false;
68                }
69
70                $qry = new DBQuery();
71                $qry->execute("SELECT 1 FROM kb3_sum_alliance WHERE asm_all_id = ".$this->all_id_);
72                if(!$qry->recordCount())
73                        $this->buildSummary($this->all_id_);
74
75                $sql = "SELECT scl_class, scl_id, kb3_sum_alliance.*
76                        FROM kb3_ship_classes left join kb3_sum_alliance
77                                ON (asm_shp_id = scl_id AND asm_all_id = ".$this->all_id_.")
78                        WHERE scl_class not in ('Drone','Unknown')
79                                ORDER BY scl_class";
80                $qry->execute($sql);
81                while($row = $qry->getRow())
82                {
83                        $this->summary[$row['scl_id']]['class_name'] = $row['scl_class'];
84                        $this->summary[$row['scl_id']]['killcount'] = intval($row['asm_kill_count']);
85                        $this->summary[$row['scl_id']]['killisk'] = floatval($row['asm_kill_isk']);
86                        $this->summary[$row['scl_id']]['losscount'] = intval($row['asm_loss_count']);
87                        $this->summary[$row['scl_id']]['lossisk'] = floatval($row['asm_loss_isk']);
88                }
89                $this->executed_ = true;
90        }
91        //! Build a new summary table for an alliance.
92        function buildSummary($all_id)
93        {
94                $all_id = intval($all_id);
95                if(!$all_id) return false;
96                $qry = new DBQuery();
97                $sql = 'INSERT INTO kb3_sum_alliance (asm_all_id, asm_shp_id, asm_kill_count, asm_kill_isk)
98                        SELECT '.$all_id.', shp_class, COUNT(distinct kll.kll_id) AS knb,
99                                sum(kll_isk_loss) AS kisk
100                        FROM kb3_kills kll
101                                INNER JOIN kb3_ships shp
102                                        ON ( shp.shp_id = kll.kll_ship_id )
103                                INNER JOIN (SELECT distinct c.ind_kll_id, c.ind_all_id
104                                                        FROM kb3_inv_detail c
105                                                        WHERE c.ind_all_id ='.$all_id.'  ) ind
106                                        ON (ind.ind_kll_id = kll.kll_id
107                                                AND kll.kll_all_id <> '.$all_id.')
108                        GROUP BY shp_class';
109                $qry->execute($sql);
110                $sql = "CREATE TEMPORARY TABLE tmp_summary (shp_id INT NOT NULL DEFAULT '0',
111                        loss_count INT NOT NULL DEFAULT '0',
112                        loss_isk FLOAT NOT NULL DEFAULT '0')
113                        ENGINE = MEMORY";
114                $qry->execute($sql);
115
116                $sql = 'INSERT INTO tmp_summary (shp_id, loss_count, loss_isk)
117                        SELECT shp_class, count(distinct kll_id) AS lnb, sum(kll_isk_loss) AS lisk
118                        FROM kb3_kills kll
119                                INNER JOIN kb3_ships shp ON ( shp.shp_id = kll.kll_ship_id )
120                        WHERE  kll.kll_all_id = '.$all_id.'
121                                AND EXISTS (SELECT 1
122                                                        FROM kb3_inv_detail ind
123                                                        WHERE kll.kll_id = ind_kll_id
124                                                        AND ind.ind_all_id <> '.$all_id.' limit 0,1)
125                        GROUP BY shp_class';
126                $qry->execute($sql);
127                $qry->execute("INSERT INTO kb3_sum_alliance (asm_all_id, asm_shp_id, asm_loss_count, asm_loss_isk)
128                        SELECT ".$all_id.", shp_id, loss_count, loss_isk FROM tmp_summary
129                        ON DUPLICATE KEY UPDATE asm_loss_count = loss_count, asm_loss_isk = loss_isk");
130                $qry->execute("DROP TEMPORARY TABLE tmp_summary");
131        }
132        //! Add a Kill and its value to the summary.
133        function addKill($kill)
134        {
135                $alls = array();
136                $qry = new DBQuery();
137                $qry2 = new DBQuery();
138                $qry->execute("SELECT 1 FROM kb3_sum_alliance WHERE asm_all_id = ".$kill->getVictimAllianceID());
139                if(!$qry->recordCount())
140                        allianceSummary::buildSummary($kill->getVictimAllianceID());
141
142                $sql = "INSERT INTO kb3_sum_alliance (asm_all_id, asm_shp_id, asm_loss_count, asm_loss_isk) ".
143                        "VALUES ( ".$kill->getVictimAllianceID().", ".$kill->getVictimShip()->getClass()->getID().", 1, ".
144                        $kill->getISKLoss().") ON DUPLICATE KEY UPDATE ".
145                        "asm_loss_count = asm_loss_count + 1, ".
146                        "asm_loss_isk = asm_loss_isk + ".$kill->getISKLoss();
147                $qry->execute($sql);
148                foreach($kill->involvedparties_ as $inv)
149                {
150                        if(intval($alls[$inv->getAllianceID()])) continue;
151                        $alls[$inv->getAllianceID()] = 1;
152                        $qry->execute("SELECT 1 FROM kb3_sum_alliance WHERE asm_all_id = ".$inv->getAllianceID());
153                        if(!$qry->recordCount())
154                                allianceSummary::buildSummary($inv->getAllianceID());
155                        $sql = "INSERT INTO kb3_sum_alliance (asm_all_id, asm_shp_id, asm_kill_count, asm_kill_isk) ".
156                                "VALUES ( ".$inv->getAllianceID().", ".$kill->getVictimShip()->getClass()->getID().", 1, ".
157                                $kill->getISKLoss().") ON DUPLICATE KEY UPDATE ".
158                                "asm_kill_count = asm_kill_count + 1, ".
159                                "asm_kill_isk = asm_kill_isk + ".$kill->getISKLoss();
160                        $qry->execute($sql);
161                }
162        }
163        //! Add a Kill and its value to the summary.
164        function delKill($kill)
165        {
166                $alls = array();
167                $qry = new DBQuery();
168                $qry2 = new DBQuery();
169                $qry->execute("SELECT 1 FROM kb3_sum_alliance WHERE asm_all_id = ".$kill->getVictimAllianceID());
170                // No summary table to remove kill from so skip.
171                if($qry->recordCount())
172                {
173                        $sql = "UPDATE kb3_sum_alliance SET asm_loss_count = asm_loss_count - 1, ".
174                                " asm_loss_isk = asm_loss_isk - ".$kill->getISKLoss().
175                                " WHERE asm_all_id = ".$kill->getVictimAllianceID().
176                                        " AND asm_shp_id = ".$kill->getVictimShip()->getClass()->getID();
177                        $qry->execute($sql);
178                }
179                foreach($kill->involvedparties_ as $inv)
180                {
181                        if(intval($alls[$inv->getAllianceID()])) continue;
182                        $alls[$inv->getAllianceID()] = 1;
183                        $qry->execute("SELECT 1 FROM kb3_sum_alliance WHERE asm_all_id = ".$inv->getAllianceID());
184                        if(!$qry->recordCount()) continue;
185                        $sql = "UPDATE kb3_sum_alliance SET asm_kill_count = asm_kill_count - 1, ".
186                                " asm_kill_isk = asm_kill_isk - ".$kill->getISKLoss().
187                                " WHERE asm_all_id = ".$inv->getAllianceID().
188                                        " AND asm_shp_id = ".$kill->getVictimShip()->getClass()->getID();
189                        $qry->execute($sql);
190                }
191        }
192}
193
194class corpSummary extends allianceSummary
195{
196        function corpSummary($crp_id)
197        {
198                $this->crp_id_ = intval($crp_id);
199                $this->executed_ = false;
200        }
201        //! Fetch the summary information.
202        function execute()
203        {
204                if($this->executed_) return;
205                if(!$this->crp_id_)
206                {
207                        $this->executed_ = true;
208                        return false;
209                }
210
211                $qry = new DBQuery();
212                $qry->execute("SELECT 1 FROM kb3_sum_corp WHERE csm_crp_id = ".$this->crp_id_);
213                if(!$qry->recordCount())
214                        $this->buildSummary($this->crp_id_);
215
216                $sql = "SELECT scl_class, scl_id, kb3_sum_corp.*
217                        FROM kb3_ship_classes left join kb3_sum_corp
218                                ON (csm_shp_id = scl_id AND csm_crp_id = ".$this->crp_id_.")
219                        WHERE scl_class not in ('Drone','Unknown')
220                                ORDER BY scl_class";
221                $qry->execute($sql);
222                while($row = $qry->getRow())
223                {
224                        $this->summary[$row['scl_id']]['class_name'] = $row['scl_class'];
225                        $this->summary[$row['scl_id']]['killcount'] = intval($row['csm_kill_count']);
226                        $this->summary[$row['scl_id']]['killisk'] = floatval($row['csm_kill_isk']);
227                        $this->summary[$row['scl_id']]['losscount'] = intval($row['csm_loss_count']);
228                        $this->summary[$row['scl_id']]['lossisk'] = floatval($row['csm_loss_isk']);
229                }
230                $this->executed_ = true;
231        }
232        //! Build a new summary table for an corp.
233        function buildSummary($crp_id)
234        {
235                $crp_id = intval($crp_id);
236                if(!$crp_id) return false;
237                $qry = new DBQuery();
238                $sql = 'INSERT INTO kb3_sum_corp (csm_crp_id, csm_shp_id, csm_kill_count, csm_kill_isk)
239                        SELECT '.$crp_id.', shp_class, COUNT(distinct kll.kll_id) AS knb,
240                                sum(kll_isk_loss) AS kisk
241                        FROM kb3_kills kll
242                                INNER JOIN kb3_ships shp
243                                        ON ( shp.shp_id = kll.kll_ship_id )
244                                INNER JOIN (SELECT distinct c.ind_kll_id, c.ind_crp_id
245                                                        FROM kb3_inv_detail c
246                                                        WHERE c.ind_crp_id ='.$crp_id.'  ) ind
247                                        ON (ind.ind_kll_id = kll.kll_id
248                                                AND kll.kll_crp_id <> '.$crp_id.')
249                        GROUP BY shp_class';
250                $qry->execute($sql);
251                $sql = "CREATE TEMPORARY TABLE tmp_summary (shp_id INT NOT NULL DEFAULT '0',
252                        loss_count INT NOT NULL DEFAULT '0',
253                        loss_isk FLOAT NOT NULL DEFAULT '0')
254                        ENGINE = MEMORY";
255                $qry->execute($sql);
256
257                $sql = 'INSERT INTO tmp_summary (shp_id, loss_count, loss_isk)
258                        SELECT shp_class, count(distinct kll_id) AS lnb, sum(kll_isk_loss) AS lisk
259                        FROM kb3_kills kll
260                                INNER JOIN kb3_ships shp ON ( shp.shp_id = kll.kll_ship_id )
261                        WHERE  kll.kll_crp_id = '.$crp_id.'
262                                AND EXISTS (SELECT 1
263                                                        FROM kb3_inv_detail ind
264                                                        WHERE kll.kll_id = ind_kll_id
265                                                        AND ind.ind_crp_id <> '.$crp_id.' limit 0,1)
266                        GROUP BY shp_class';
267                $qry->execute($sql);
268                $qry->execute("INSERT INTO kb3_sum_corp (csm_crp_id, csm_shp_id, csm_loss_count, csm_loss_isk)
269                        SELECT ".$crp_id.", shp_id, loss_count, loss_isk FROM tmp_summary
270                        ON DUPLICATE KEY UPDATE csm_loss_count = loss_count, csm_loss_isk = loss_isk");
271                $qry->execute("DROP TEMPORARY TABLE tmp_summary");
272        }
273        //! Add a Kill and its value to the summary.
274        function addKill($kill)
275        {
276                $alls = array();
277                $qry = new DBQuery();
278                $qry2 = new DBQuery();
279                $qry->execute("SELECT 1 FROM kb3_sum_corp WHERE csm_crp_id = ".$kill->getVictimcorpID());
280                if(!$qry->recordCount())
281                        corpSummary::buildSummary($kill->getVictimcorpID());
282
283                $sql = "INSERT INTO kb3_sum_corp (csm_crp_id, csm_shp_id, csm_loss_count, csm_loss_isk) ".
284                        "VALUES ( ".$kill->getVictimcorpID().", ".$kill->getVictimShip()->getClass()->getID().", 1, ".
285                        $kill->getISKLoss().") ON DUPLICATE KEY UPDATE ".
286                        "csm_loss_count = csm_loss_count + 1, ".
287                        "csm_loss_isk = csm_loss_isk + ".$kill->getISKLoss();
288                $qry->execute($sql);
289                foreach($kill->involvedparties_ as $inv)
290                {
291                        if(intval($alls[$inv->getcorpID()])) continue;
292                        $alls[$inv->getcorpID()] = 1;
293                        $qry->execute("SELECT 1 FROM kb3_sum_corp WHERE csm_crp_id = ".$inv->getcorpID());
294                        if(!$qry->recordCount())
295                                corpSummary::buildSummary($inv->getcorpID());
296                        $sql = "INSERT INTO kb3_sum_corp (csm_crp_id, csm_shp_id, csm_kill_count, csm_kill_isk) ".
297                                "VALUES ( ".$inv->getcorpID().", ".$kill->getVictimShip()->getClass()->getID().", 1, ".
298                                $kill->getISKLoss().") ON DUPLICATE KEY UPDATE ".
299                                "csm_kill_count = csm_kill_count + 1, ".
300                                "csm_kill_isk = csm_kill_isk + ".$kill->getISKLoss();
301                        $qry->execute($sql);
302                }
303        }
304        //! Add a Kill and its value to the summary.
305        function delKill($kill)
306        {
307                $alls = array();
308                $qry = new DBQuery();
309                $qry2 = new DBQuery();
310                $qry->execute("SELECT 1 FROM kb3_sum_corp WHERE csm_crp_id = ".$kill->getVictimcorpID());
311                // No summary table to remove kill from so skip.
312                if($qry->recordCount())
313                {
314                        $sql = "UPDATE kb3_sum_corp SET csm_loss_count = csm_loss_count - 1, ".
315                                " csm_loss_isk = csm_loss_isk - ".$kill->getISKLoss().
316                                " WHERE csm_crp_id = ".$kill->getVictimcorpID().
317                                        " AND csm_shp_id = ".$kill->getVictimShip()->getClass()->getID();
318                        $qry->execute($sql);
319                }
320                foreach($kill->involvedparties_ as $inv)
321                {
322                        if(intval($alls[$inv->getcorpID()])) continue;
323                        $alls[$inv->getcorpID()] = 1;
324                        $qry->execute("SELECT 1 FROM kb3_sum_corp WHERE csm_crp_id = ".$inv->getcorpID());
325                        if(!$qry->recordCount()) continue;
326                        $sql = "UPDATE kb3_sum_corp SET csm_kill_count = csm_kill_count - 1, ".
327                                " csm_kill_isk = csm_kill_isk - ".$kill->getISKLoss().
328                                " WHERE csm_crp_id = ".$inv->getcorpID().
329                                        " AND csm_shp_id = ".$kill->getVictimShip()->getClass()->getID();
330                        $qry->execute($sql);
331                }
332        }
333}
334?>
Note: See TracBrowser for help on using the browser.