X-Git-Url: https://ruin.nu/git/?a=blobdiff_plain;f=lib%2FNDWeb%2FController%2FStats.pm;h=9379e99c0aa8574835eb86ddee63728bf49dae7a;hb=c5a19db607b88a8d96a017e56cd92963bf8e69ea;hp=add02923e4df5e48ac94bc5ef672b9688c172a97;hpb=2d3a66913c76c8d333f53a6b5c64d91b3e594f6b;p=ndwebbie.git diff --git a/lib/NDWeb/Controller/Stats.pm b/lib/NDWeb/Controller/Stats.pm index add0292..9379e99 100644 --- a/lib/NDWeb/Controller/Stats.pm +++ b/lib/NDWeb/Controller/Stats.pm @@ -5,6 +5,7 @@ use warnings; use parent 'Catalyst::Controller'; use NDWeb::Include; +use HTML::TagCloud; =head1 NAME @@ -56,12 +57,12 @@ FROM galaxies g SELECT raid,p.tick,x,y,count(*), sum(size) AS size FROM raids r JOIN raid_targets rt ON r.id = rt.raid - JOIN planet_stats p ON p.id = rt.planet AND p.tick = r.tick-12 - WHERE x = $1 and y = $2 + JOIN planet_stats p USING (pid) + WHERE x = $1 and y = $2 AND p.tick = r.tick-12 GROUP BY raid,p.tick,x,y ) AS a JOIN galaxies g USING (tick,x,y) - WHERE a.count::float / g.planets >= 0.5 + WHERE a.count::float / NULLIF(g.planets,0) >= 0.5 ORDER BY x,y,tick ) AS raid USING (x,y) @@ -91,8 +92,8 @@ WHERE g.tick = ( SELECT max(tick) AS max FROM galaxies) }; } - $query = $dbh->prepare(qq{SELECT DISTINCT ON (x,y,z,p.id) - p.id,coords(x,y,z), ruler, p.planet,race, + $query = $dbh->prepare(qq{SELECT DISTINCT ON (x,y,z,pid) + pid AS id,coords(x,y,z), ruler, p.planet,race, size, size_gain, size_gain_day, score,score_gain,score_gain_day, value,value_gain,value_gain_day, @@ -103,22 +104,37 @@ WHERE g.tick = ( SELECT max(tick) AS max FROM galaxies) xprank,xprank_gain,xprank_gain_day $extra_columns FROM current_planet_stats_full p - LEFT OUTER JOIN planet_scans ps ON p.id = ps.planet - LEFT OUTER JOIN current_development_scans ds ON p.id = ds.planet + LEFT OUTER JOIN planet_scans ps USING (pid) + LEFT OUTER JOIN current_development_scans ds USING (pid) WHERE x = ? AND y = ? AND COALESCE(z = ?,TRUE) - ORDER BY x,y,z,p.id,ps.tick DESC, ps.id DESC, ds.tick DESC, ds.id DESC + ORDER BY x,y,z,pid,ps.tick DESC, ps.id DESC, ds.tick DESC, ds.id DESC }); $query->execute($x,$y,$z); $c->stash(planets => $query->fetchall_arrayref({}) ); + + $query = $dbh->prepare(q{ +WITH p AS ( + SELECT x,y FROM galaxies + WHERE tick = tick() AND (x <= $1 AND y < $2 OR x < $1) + ORDER BY x DESC, y DESC LIMIT 1 +), n AS ( + SELECT x,y FROM galaxies + WHERE tick = tick() AND (x >= $1 AND y > $2 OR x > $1) + ORDER BY x ASC, y ASC LIMIT 1 +) +TABLE p UNION TABLE n + }); + $query->execute($x,$y); + $c->stash(browse => $query->fetchall_arrayref({}) ); } sub planet : Local { my ( $self, $c, $id ) = @_; my $dbh = $c->model; - my $p = $dbh->selectrow_hashref(q{SELECT id,x,y,z FROM current_planet_stats - WHERE id = $1},undef,$id); + my $p = $dbh->selectrow_hashref(q{SELECT pid AS id,x,y,z FROM current_planet_stats + WHERE pid = $1},undef,$id); $c->detach('/default') unless $p; @@ -129,9 +145,9 @@ sub planet : Local { my $query = $dbh->prepare(q{ ( SELECT DISTINCT ON (mission,name) fid,mission,name,tick, NULL AS eta - ,amount, NULL AS coords, planet, NULL AS back + ,amount, NULL AS coords, pid AS planet, NULL AS back FROM fleets f - WHERE planet = $1 AND tick <= tick() AND ( + WHERE pid = $1 AND tick <= tick() AND ( fid IN (SELECT fid FROM fleet_scans) ) AND ( mission = 'Full fleet' @@ -141,9 +157,9 @@ sub planet : Local { ) UNION ( SELECT DISTINCT ON (tick,x,y,z,mission,name,amount) NULL as fid, i.mission, i.name, i.tick,eta - , i.amount, coords(x,y,z), t.id AS planet, back + , i.amount, coords(x,y,z), pid AS planet, back FROM intel i - LEFT OUTER JOIN current_planet_stats t ON i.target = t.id + LEFT OUTER JOIN current_planet_stats t ON i.target = pid WHERE uid = -1 AND i.sender = $1 AND i.tick > tick() - 14 AND i.tick < tick() + 14 ORDER BY i.tick,x,y,z,mission,name,amount,back ) @@ -168,16 +184,16 @@ sub planet : Local { $c->stash(outgoings => \@missions); $query = $dbh->prepare(q{ - SELECT DISTINCT ON (i.tick,x,y,z,s.id,i.name,i.amount) i.id,i.mission, i.name, i.tick,eta - , i.amount, coords(x,y,z) AS coords, s.id AS planet + SELECT DISTINCT ON (i.tick,x,y,z,pid,i.name,i.mission,i.amount) i.id,i.mission, i.name, i.tick,eta + , i.amount, coords(x,y,z) AS coords, pid AS planet FROM intel i LEFT OUTER JOIN (planets - NATURAL JOIN planet_stats) s ON i.sender = s.id + NATURAL JOIN planet_stats) s ON i.sender = pid AND s.tick = ( SELECT MAX(tick) FROM planet_stats) WHERE i.uid = -1 AND i.target = ? AND i.tick > tick() - 3 - ORDER BY i.tick,x,y,z,s.id,i.name,i.amount,i.eta + ORDER BY i.tick,x,y,z,pid,i.name,i.mission,i.amount,i.eta }); $query->execute($id); my @incomings; @@ -197,7 +213,7 @@ sub planet : Local { if ($c->check_user_roles(qw/stats_scans/)){ my $query = $dbh->prepare(q{SELECT type,scan_id, tick FROM scans - WHERE planet = ? AND tick > tick() - 168 + WHERE pid = ? AND tick > tick() - 168 ORDER BY tick,type DESC }); $query->execute($id); @@ -206,18 +222,18 @@ sub planet : Local { if ($c->check_user_roles(qw/stats_planetdata/)){ $c->stash(planetscan => $dbh->selectrow_hashref(q{SELECT * - FROM current_planet_scans WHERE planet = $1},undef,$id)); + FROM current_planet_scans WHERE pid = $1},undef,$id)); $c->stash(devscan => $dbh->selectrow_hashref(q{SELECT * - FROM current_development_scans WHERE planet = $1},undef,$id)); + FROM current_development_scans WHERE pid = $1},undef,$id)); } - my $query = $dbh->prepare(q{SELECT value,value_gain AS gain,tick FROM planet_stats - WHERE id = ? AND tick > tick() - 24}); + my $query = $dbh->prepare(q{SELECT value,value_gain AS gain,tick FROM planet_stats + WHERE pid = ? AND tick > tick() - 24}); $query->execute($id); $c->stash(values => $query->fetchall_arrayref({}) ); $query = $dbh->prepare(q{SELECT x,y,z,tick FROM planet_stats - WHERE id = ? ORDER BY tick ASC}); + WHERE pid = ? ORDER BY tick ASC}); $query->execute($id); my @coords; my $co = {x => 0, y => 0, z => 0}; @@ -245,7 +261,7 @@ sub find : Local { }elsif (/(\d+)(?: |:)(\d+)/){ $c->res->redirect($c->uri_for('galaxy',$1,$2)); }elsif($c->check_user_roles(qw/stats_find_nick/)) { - my $query = $dbh->prepare(q{SELECT id,coords(x,y,z),nick + my $query = $dbh->prepare(q{SELECT pid AS id,coords(x,y,z),nick FROM current_planet_stats p WHERE nick ilike $1 }); @@ -259,6 +275,45 @@ sub find : Local { } } +sub tags : Local { + my ( $self, $c ) = @_; + my $dbh = $c->model; + + my @tags = $c->req->param('tags'); + $c->stash(tags => \@tags); + my $query = $dbh->prepare(q{ +SELECT tag, count(*) +FROM planet_tags pt +WHERE tag <> ALL($1) + AND ($3 OR uid = $2) +GROUP BY tag + }); + $query->execute(\@tags, $c->user->id, $c->check_user_roles('stats_tags_all') // 0); + my $cloud = HTML::TagCloud->new; + while (my $tag = $query->fetchrow_hashref){ + my @t = @tags; + push @t, $tag->{tag}; + my %param = (tags => \@t); + $cloud->add($tag->{tag}, $c->uri_for('tags',\%param), $tag->{count}); + } + $c->stash(cloud => $cloud->html); + $c->stash(css => $cloud->css); + + $query = $dbh->prepare(q{ +WITH p AS (SELECT pid, coords(x,y,z) FROM current_planet_stats +), t AS (SELECT pid,tag,bool_or(uid = $2) AS own,max(time) AS time + FROM planet_tags + WHERE ($3 OR uid = $2) + GROUP BY pid,tag + ORDER BY time DESC +), tags AS (SELECT pid, array_agg(tag) AS tags + FROM t GROUP BY pid +) +SELECT p.*k,array_to_string(tags,', ') AS tags FROM p JOIN tags USING (pid) WHERE tags @> $1; + }); + $query->execute(\@tags, $c->user->id, $c->check_user_roles('stats_tags_all') // 0); + $c->stash(planets => $query->fetchall_arrayref({})); +} =head1 AUTHOR