create index IndexJobsetEvalMembersOnEval on JobsetEvalMembers(eval);

-- Inputs of jobset evals.
create table JobsetEvalInputs (
    eval          integer not null references JobsetEvals(id) on delete cascade,
    name          text not null,
    altNr         integer not null,

    -- Copied from the jobsetinputs from which the build was created.
    type          text not null,
    uri           text,
    revision      text,
    value         text,
    dependency    integer, -- build ID of the input, for type == 'build'

    path          text,

    sha256hash    text,

    primary key   (eval, name, altNr),
    foreign key   (dependency) references Builds(id)
);

-- Reconstruct the repository inputs for pre-existing evals.  This is
-- tricky (and not entirely possible) because builds are not uniquely
-- part of a single eval, so they may have different inputs.

-- For Subversion or Bazaar inputs, pick the highest revision for each
-- input.
insert into JobsetEvalInputs (eval, name, altNr, type, uri, revision)
    select e.id, b.name, 0, max(b.type), max(b.uri), max(b.revision)
    from (select id from JobsetEvals where hasNewBuilds = 1) e
    join JobsetEvalMembers m on e.id = m.eval
    join BuildInputs b on b.build = m.build
    where (b.type = 'svn' or b.type = 'svn-checkout' or b.type = 'bzr' or b.type = 'bzr-checkout')
    group by e.id, b.name
    having count(distinct type) = 1 and count(distinct uri) = 1;

-- For other inputs there is no "best" revision to pick, so only do
-- the conversion if there is only one.
insert into JobsetEvalInputs (eval, name, altNr, type, uri, revision)
    select e.id, b.name, 0, max(b.type), max(uri), max(revision)
    from (select id from JobsetEvals where hasNewBuilds = 1) e
    join JobsetEvalMembers m on e.id = m.eval
    join BuildInputs b on b.build = m.build
    where (b.type != 'svn' and b.type != 'svn-checkout' and b.type != 'bzr' and b.type != 'bzr-checkout')
          and b.uri is not null and b.revision is not null
          and not exists(select 1 from JobsetEvalInputs i where e.id = i.eval and b.name = i.name)
    group by e.id, b.name
    having count(distinct type) = 1 and count(distinct uri) = 1 and count(distinct revision) = 1;