use utf8;
package Hydra::Schema::Result::Builds;
use strict;
use warnings;
use base 'DBIx::Class::Core';
__PACKAGE__->load_components("+Hydra::Component::ToJSON");
__PACKAGE__->table("builds");
__PACKAGE__->add_columns(
"id",
{
data_type => "integer",
is_auto_increment => 1,
is_nullable => 0,
sequence => "builds_id_seq",
},
"finished",
{ data_type => "integer", is_nullable => 0 },
"timestamp",
{ data_type => "integer", is_nullable => 0 },
"jobset_id",
{ data_type => "integer", is_foreign_key => 1, is_nullable => 0 },
"job",
{ data_type => "text", is_nullable => 0 },
"nixname",
{ data_type => "text", is_nullable => 1 },
"description",
{ data_type => "text", is_nullable => 1 },
"drvpath",
{ data_type => "text", is_nullable => 0 },
"system",
{ data_type => "text", is_nullable => 0 },
"license",
{ data_type => "text", is_nullable => 1 },
"homepage",
{ data_type => "text", is_nullable => 1 },
"maintainers",
{ data_type => "text", is_nullable => 1 },
"maxsilent",
{ data_type => "integer", default_value => 3600, is_nullable => 1 },
"timeout",
{ data_type => "integer", default_value => 36000, is_nullable => 1 },
"ischannel",
{ data_type => "integer", default_value => 0, is_nullable => 0 },
"iscurrent",
{ data_type => "integer", default_value => 0, is_nullable => 1 },
"priority",
{ data_type => "integer", default_value => 0, is_nullable => 0 },
"globalpriority",
{ data_type => "integer", default_value => 0, is_nullable => 0 },
"starttime",
{ data_type => "integer", is_nullable => 1 },
"stoptime",
{ data_type => "integer", is_nullable => 1 },
"iscachedbuild",
{ data_type => "integer", is_nullable => 1 },
"buildstatus",
{ data_type => "integer", is_nullable => 1 },
"size",
{ data_type => "bigint", is_nullable => 1 },
"closuresize",
{ data_type => "bigint", is_nullable => 1 },
"releasename",
{ data_type => "text", is_nullable => 1 },
"keep",
{ data_type => "integer", default_value => 0, is_nullable => 0 },
"notificationpendingsince",
{ data_type => "integer", is_nullable => 1 },
);
__PACKAGE__->set_primary_key("id");
__PACKAGE__->has_many(
"aggregateconstituents_aggregates",
"Hydra::Schema::Result::AggregateConstituents",
{ "foreign.aggregate" => "self.id" },
undef,
);
__PACKAGE__->has_many(
"aggregateconstituents_constituents",
"Hydra::Schema::Result::AggregateConstituents",
{ "foreign.constituent" => "self.id" },
undef,
);
__PACKAGE__->has_many(
"buildinputs_builds",
"Hydra::Schema::Result::BuildInputs",
{ "foreign.build" => "self.id" },
undef,
);
__PACKAGE__->has_many(
"buildinputs_dependencies",
"Hydra::Schema::Result::BuildInputs",
{ "foreign.dependency" => "self.id" },
undef,
);
__PACKAGE__->has_many(
"buildmetrics",
"Hydra::Schema::Result::BuildMetrics",
{ "foreign.build" => "self.id" },
undef,
);
__PACKAGE__->has_many(
"buildoutputs",
"Hydra::Schema::Result::BuildOutputs",
{ "foreign.build" => "self.id" },
undef,
);
__PACKAGE__->has_many(
"buildproducts",
"Hydra::Schema::Result::BuildProducts",
{ "foreign.build" => "self.id" },
undef,
);
__PACKAGE__->has_many(
"buildstepoutputs",
"Hydra::Schema::Result::BuildStepOutputs",
{ "foreign.build" => "self.id" },
undef,
);
__PACKAGE__->has_many(
"buildsteps",
"Hydra::Schema::Result::BuildSteps",
{ "foreign.build" => "self.id" },
undef,
);
__PACKAGE__->has_many(
"buildsteps_propagatedfroms",
"Hydra::Schema::Result::BuildSteps",
{ "foreign.propagatedfrom" => "self.id" },
undef,
);
__PACKAGE__->belongs_to(
"jobset",
"Hydra::Schema::Result::Jobsets",
{ id => "jobset_id" },
{ is_deferrable => 0, on_delete => "CASCADE", on_update => "NO ACTION" },
);
__PACKAGE__->has_many(
"jobsetevalinputs",
"Hydra::Schema::Result::JobsetEvalInputs",
{ "foreign.dependency" => "self.id" },
undef,
);
__PACKAGE__->has_many(
"jobsetevalmembers",
"Hydra::Schema::Result::JobsetEvalMembers",
{ "foreign.build" => "self.id" },
undef,
);
__PACKAGE__->has_many(
"runcommandlogs",
"Hydra::Schema::Result::RunCommandLogs",
{ "foreign.build_id" => "self.id" },
undef,
);
__PACKAGE__->many_to_many(
"aggregates",
"aggregateconstituents_constituents",
"aggregate",
);
__PACKAGE__->many_to_many(
"constituents",
"aggregateconstituents_aggregates",
"constituent",
);
__PACKAGE__->has_many(
"dependents",
"Hydra::Schema::Result::BuildInputs",
{ "foreign.dependency" => "self.id" },
);
__PACKAGE__->many_to_many(dependentBuilds => 'dependents', 'build');
__PACKAGE__->has_many(
"inputs",
"Hydra::Schema::Result::BuildInputs",
{ "foreign.build" => "self.id" },
);
__PACKAGE__->has_one(
"actualBuildStep",
"Hydra::Schema::Result::BuildSteps",
{ 'foreign.drvpath' => 'self.drvpath'
, 'foreign.build' => 'self.id'
},
);
__PACKAGE__->many_to_many("jobsetevals", "jobsetevalmembers", "eval");
__PACKAGE__->many_to_many("constituents_", "aggregateconstituents_aggregates", "constituent");
sub makeSource {
my ($name, $query) = @_;
my $source = __PACKAGE__->result_source_instance();
my $new_source = $source->new($source);
$new_source->source_name($name);
$new_source->name(\ "($query)");
Hydra::Schema->register_extra_source($name => $new_source);
}
sub makeQueries {
my ($name, $constraint) = @_;
my $activeJobs = "(select distinct jobset_id, job, system from Builds where isCurrent = 1 $constraint)";
makeSource(
"LatestSucceeded$name",
<<QUERY
select *
from
(select
(select max(b.id) from builds b
where
jobset_id = activeJobs.jobset_id
and job = activeJobs.job and system = activeJobs.system
and finished = 1 and buildstatus = 0
) as id
from $activeJobs as activeJobs
) as latest
join Builds using (id)
QUERY
);
}
makeQueries('', "");
makeQueries('ForProject', "and jobset_id in (select id from jobsets j where j.project = ?)");
makeQueries('ForJobset', "and jobset_id = ?");
makeQueries('ForJob', "and jobset_id = ? and job = ?");
makeQueries('ForJobName', "and jobset_id = (select id from jobsets j where j.name = ?) and job = ?");
my %hint = (
columns => [
'id',
'finished',
'timestamp',
'starttime',
'stoptime',
'job',
'nixname',
'system',
'priority',
'buildstatus',
'releasename',
'drvpath',
],
relations => {
jobsetevals => 'id'
},
eager_relations => {
buildoutputs => 'name',
buildproducts => 'productnr',
buildmetrics => 'name',
}
);
sub json_hint {
return \%hint;
}
sub project {
my ($self) = @_;
return $self->jobset->project;
}
1;