package com.hubspot.blazar.data.dao;
import java.util.Set;
import org.skife.jdbi.v2.sqlobject.Bind;
import org.skife.jdbi.v2.sqlobject.SqlBatch;
import org.skife.jdbi.v2.sqlobject.SqlQuery;
import org.skife.jdbi.v2.sqlobject.SqlUpdate;
import org.skife.jdbi.v2.sqlobject.stringtemplate.UseStringTemplate3StatementLocator;
import org.skife.jdbi.v2.unstable.BindIn;
import com.hubspot.blazar.base.Dependency;
import com.hubspot.blazar.base.GitInfo;
import com.hubspot.blazar.base.ModuleDependency;
import com.hubspot.blazar.base.ModuleDependency.Source;
import com.hubspot.blazar.base.graph.Edge;
import com.hubspot.rosetta.jdbi.BindWithRosetta;
@UseStringTemplate3StatementLocator
public interface DependenciesDao {
@SqlQuery("SELECT module_provides.moduleId AS source, module_depends.moduleId AS target " +
"FROM module_provides " +
"INNER JOIN module_depends ON (module_provides.name = module_depends.name) " +
"INNER JOIN modules ON (module_depends.moduleId = modules.id) " +
"INNER JOIN branches ON (modules.branchId = branches.id) " +
"LEFT JOIN branch_settings on (branches.id = branch_settings.branchId) " +
"WHERE module_provides.moduleId IN (<moduleIds>) " +
"AND branches.active = 1 " +
"AND (" +
" branch_settings.interProjectBuildOptIn = 1 " +
" OR (branches.branch = 'master' AND branch_settings.interProjectBuildOptIn IS NULL) " +
" OR branches.id = :branchId" +
")")
Set<Edge> getEdges(@Bind("branchId") int branchId, @BindIn("moduleIds") Set<Integer> moduleIds);
@SqlQuery("SELECT * FROM module_provides WHERE moduleId = :moduleId")
Set<Dependency> getProvidedDependencies(@Bind("moduleId") int moduleId);
@SqlQuery("" +
"SELECT COUNT(*) FROM module_provides " +
"INNER JOIN modules ON (module_provides.moduleId = modules.id) " +
"INNER JOIN branches ON (modules.branchId = branches.id) " +
"WHERE branches.id = :branchId AND modules.active=1 AND module_provides.source = 'UNKNOWN'")
int getCountOfProvidedDependenciesWithoutSourceByBranchId(@Bind("branchId") int branchId);
@SqlQuery("SELECT * FROM module_depends WHERE moduleId = :moduleId")
Set<Dependency> getDependencies(@Bind("moduleId") int moduleId);
@SqlQuery("" +
"SELECT COUNT(*) FROM module_depends " +
"INNER JOIN modules ON (module_depends.moduleId = modules.id) " +
"INNER JOIN branches ON (modules.branchId = branches.id) " +
"WHERE branches.id = :branchId AND modules.active=1 AND module_depends.source = 'UNKNOWN'")
int getCountOfDependenciesWithoutSourceByBranchId(@Bind("branchId") int branchId);
@SqlQuery("SELECT gitInfo.* " +
"FROM modules AS module " +
" join branches AS gitInfo ON (gitInfo.id = module.branchId) " +
" join module_provides AS provides ON (module.id = provides.moduleId) " +
" join module_depends AS depends ON (module.id = depends.moduleId) " +
"WHERE (provides.version IS NULL OR depends.version IS NULL) AND gitInfo.active = 1 " +
"GROUP BY gitInfo.id")
Set<GitInfo> getBranchesWithNonVersionedDependencies();
@SqlBatch("INSERT INTO module_provides (moduleId, name, version, source) VALUES (:moduleId, :name, :version, :source)")
void insertProvidedDependencies(@BindWithRosetta Set<ModuleDependency> dependencies);
@SqlBatch("INSERT INTO module_depends (moduleId, name, version, source) VALUES (:moduleId, :name, :version, :source)")
void insertDependencies(@BindWithRosetta Set<ModuleDependency> dependencies);
@SqlUpdate("DELETE FROM module_provides WHERE moduleId = :moduleId")
void deleteProvidedDependencies(@Bind("moduleId") int moduleId);
@SqlUpdate("DELETE FROM module_provides WHERE moduleId = :moduleId AND source = :source")
void deleteProvidedDependenciesBySource(@Bind("moduleId") int moduleId, @Bind("source") Source source);
@SqlUpdate("DELETE FROM module_depends WHERE moduleId = :moduleId")
void deleteDependencies(@Bind("moduleId") int moduleId);
@SqlUpdate("DELETE FROM module_depends WHERE moduleId = :moduleId AND source = :source")
void deleteDependenciesBySource(@Bind("moduleId") int moduleId, @Bind("source") Source source);
}