The NrBuilds table tracks the value of ‘select count(*) from Builds where finished = 0’, keeping it up to date via a trigger. This is necessary to make the /all page fast, since otherwise it needs to do a sequential scan on the Builds table.
FANTYCR7X2TYLJKGO3E5CU4PVXPSOMQZELEFQCZ6E7GEJOPYXQUAC AVOPQAF7SL5PXYEQ3Q42AX5U4LSCBDHPYRAGX3BNKKMQB4P4FQBAC PT5XCF2NZMSKB3O6DNV5XNKOSXRUDTATTBMBP2FAUIREUM6X246AC 32MXC7NNZKN5KFZNMS6J22LHLL4WQJFKTWHBKAJVDM6NBORIKAEAC S5NPXZG34PZZ5FIIAQ2IO72G6PAQC4JZ2WS2CVKTO623BNQKGMHAC 4HPT4SDDNU24OX2P4FDP2KXKINDCJLZEBN2VIEEKWFEVT4TNWXZAC QL55ECJ6KMMBUOWQ6LKSOVN7L43CH4S6SPE2AQ3VX3KSGC32RP4AC FPK5LF53CFUEKFYJ3IYXT4UTVC6IITWJOCFATMC4PLHEUP5SIEAAC U4TD3AIQXBJFFUORTMIC4IHZTVBORRKL2TZ2FSP4G665ECZOEMNAC AKAZKCR6GFCZQBR2ZJSZEI3SXW4S25V7X7JGHUYNUITQQSAVAF5AC QNYIOH25K2MONMRRCSIJVAPZCAIRAMXG7KYE2WMV4PQEOAZJR5ZAC J5UVLXOK6EDIL5I7VKWH4V2QDS4DPD7FHRK6XBWSXFRQS4JKXFZQC D5QIOJGPKQJIYBUCSC3MFJ3TXLPNZ2XMI37GXMFRVRFWWR2VMTFAC AMFMXR52JXHUOWWG4VZ5DHQGLF4F7H7XSJRLX5XNEXOCCWYLDQOAC ZWCTAZGLJZQNTYWTC2XQUKMILJF6JGDL5IND6QNYWK4FIGMLRFXAC SMCOU72FKTPFNCDXFJAILVUWFE4DY33CJJE4436H5POKENFFDFFAC N22GPKYTOLZLBGTGDATQDVZ4R5APZEAOIA7L32X4UXBH4XNI7MWAC 4MBKR4XMMBQLYXZ7DN2MF7P7DIJCFOOHEDTRUGHCQFAV4TE2YCLAC 6QRHXIM3XHCDLSIIBEGETDV67V6LTV55QMHC64ZPBMLTAECM5N3QC 2I2ZX6JBPIM5D57G52MGHKUD66CJMOYAYNYN6CSHNUHAFA46A5YQC G2ZB6464XGPBIMSZIPSB24EIXSCCGV4XWC3IWPS2CXYPDSUZSU5QC use utf8;package Hydra::Schema::NrBuilds;# Created by DBIx::Class::Schema::Loader# DO NOT MODIFY THE FIRST PART OF THIS FILE=head1 NAMEHydra::Schema::NrBuilds=cutuse strict;use warnings;use base 'DBIx::Class::Core';=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON");=head1 TABLE: C<NrBuilds>=cut__PACKAGE__->table("NrBuilds");=head1 ACCESSORS=head2 whatdata_type: 'text'is_nullable: 0=head2 countdata_type: 'integer'is_nullable: 0=cut__PACKAGE__->add_columns("what",{ data_type => "text", is_nullable => 0 },"count",{ data_type => "integer", is_nullable => 0 },);=head1 PRIMARY KEY=over 4=item * L</what>=back=cut__PACKAGE__->set_primary_key("what");# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-08-12 17:59:18# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:CK8eJGC803nGj0wnete9xg# You can replace this text with custom code or comments, and it will be preserved on regeneration1;
insert into NrBuilds(what, count) values('finished', 0);#ifdef POSTGRESQLcreate function modifyNrBuildsFinished() returns trigger as $$beginif ((tg_op = 'INSERT' and new.finished = 1) or(tg_op = 'UPDATE' and old.finished = 0 and new.finished = 1)) thenupdate NrBuilds set count = count + 1 where what = 'finished';elsif ((tg_op = 'DELETE' and old.finished = 1) or(tg_op = 'UPDATE' and old.finished = 1 and new.finished = 0)) thenupdate NrBuilds set count = count - 1 where what = 'finished';end if;return null;end;$$ language plpgsql;create trigger NrBuildsFinished after insert or update or delete on Buildsfor each rowexecute procedure modifyNrBuildsFinished();#endif
create table NrBuilds (what text primary key not null,count integer not null);create function modifyNrBuildsFinished() returns trigger as $$beginif ((tg_op = 'INSERT' and new.finished = 1) or(tg_op = 'UPDATE' and old.finished = 0 and new.finished = 1)) thenupdate NrBuilds set count = count + 1 where what = 'finished';elsif ((tg_op = 'DELETE' and old.finished = 1) or(tg_op = 'UPDATE' and old.finished = 1 and new.finished = 0)) thenupdate NrBuilds set count = count - 1 where what = 'finished';end if;return null;end;$$ language plpgsql;create trigger NrBuildsFinished after insert or update or delete on Buildsfor each rowexecute procedure modifyNrBuildsFinished();insert into NrBuilds(what, count) select 'finished', count(*) from Builds where finished = 1;