package com.hubspot.blazar.data.dao; import java.util.List; import java.util.Set; import org.skife.jdbi.v2.sqlobject.Bind; import org.skife.jdbi.v2.sqlobject.GetGeneratedKeys; import org.skife.jdbi.v2.sqlobject.SqlQuery; import org.skife.jdbi.v2.sqlobject.SqlUpdate; import org.skife.jdbi.v2.sqlobject.customizers.SingleValueResult; import com.google.common.base.Optional; import com.hubspot.blazar.base.Module; import com.hubspot.blazar.base.ModuleBuild; import com.hubspot.blazar.base.ModuleBuild.State; import com.hubspot.blazar.base.ModuleBuildInfo; import com.hubspot.rosetta.jdbi.BindWithRosetta; public interface ModuleBuildDao { @SingleValueResult @SqlQuery("SELECT * FROM module_builds WHERE id = :id") Optional<ModuleBuild> get(@Bind("id") long id); @SqlQuery("SELECT * FROM module_builds WHERE repoBuildId = :repoBuildId") Set<ModuleBuild> getByRepositoryBuild(@Bind("repoBuildId") long repoBuildId); @SqlQuery("SELECT * FROM module_builds WHERE state = :state") Set<ModuleBuild> getByState(@Bind("state") State state); @SqlQuery("" + "SELECT moduleBuild.*, branchBuild.* FROM module_builds AS moduleBuild " + "JOIN repo_builds AS branchBuild ON moduleBuild.repoBuildId = branchBuild.id " + "WHERE moduleId = :moduleId " + "AND moduleBuild.buildNumber <= :buildNumber " + "ORDER BY moduleBuild.buildNumber DESC " + "LIMIT :limit") List<ModuleBuildInfo> getLimitedModuleBuildHistory(@Bind("moduleId") int moduleId, @Bind("buildNumber") int buildNumber, @Bind("limit") int limit); @SqlQuery("" + "SELECT moduleBuild.*, branchBuild.* FROM module_builds AS moduleBuild " + "JOIN repo_builds AS branchBuild ON moduleBuild.repoBuildId = branchBuild.id " + "WHERE moduleId = :moduleId " + "ORDER BY moduleBuild.buildNumber DESC " + "LIMIT :limit") List<ModuleBuildInfo> getLatestLimitedModuleBuildHistory(@Bind("moduleId") int moduleId, @Bind("limit") int limit); @SingleValueResult @SqlQuery("" + "SELECT COUNT(*) AS count FROM module_builds AS moduleBuild " + "WHERE moduleId = :moduleId " + "AND moduleBuild.buildNumber < :buildNumberForPageStart") Optional<Integer> getRemainingBuildCountForPagedHistory(@Bind("moduleId") int moduleId, @Bind("buildNumberForPageStart") int buildNumberForPageStart); @SingleValueResult @SqlQuery("SELECT * FROM module_builds WHERE moduleId = :moduleId AND buildNumber = :buildNumber") Optional<ModuleBuild> getByModuleAndNumber(@Bind("moduleId") int moduleId, @Bind("buildNumber") int buildNumber); @SingleValueResult @SqlQuery("SELECT * FROM module_builds WHERE moduleId = :moduleId AND buildNumber < :buildNumber AND state != 'SKIPPED' ORDER BY buildNumber DESC LIMIT 1") Optional<ModuleBuild> getPreviousBuild(@BindWithRosetta ModuleBuild build); @SingleValueResult @SqlQuery("SELECT * FROM module_builds WHERE moduleId = :id AND state != 'SKIPPED' ORDER BY buildNumber DESC LIMIT 1") Optional<ModuleBuild> getPreviousBuild(@BindWithRosetta Module module); @GetGeneratedKeys @SqlUpdate("INSERT INTO module_builds (repoBuildId, moduleId, buildNumber, state) VALUES (:repoBuildId, :moduleId, :buildNumber, :state)") long skip(@BindWithRosetta ModuleBuild build); @GetGeneratedKeys @SqlUpdate("INSERT INTO module_builds (repoBuildId, moduleId, buildNumber, state, buildConfig, resolvedConfig) VALUES (:repoBuildId, :moduleId, :buildNumber, :state, :buildConfig, :resolvedConfig)") long enqueue(@BindWithRosetta ModuleBuild build); @SqlUpdate("UPDATE module_builds SET startTimestamp = :startTimestamp, state = :state WHERE id = :id AND state IN ('QUEUED', 'WAITING_FOR_UPSTREAM_BUILD')") int begin(@BindWithRosetta ModuleBuild build); @SqlUpdate("UPDATE module_builds SET taskId = :taskId, state = :state WHERE id = :id AND state IN ('QUEUED', 'WAITING_FOR_UPSTREAM_BUILD', 'LAUNCHING', 'IN_PROGRESS')") int update(@BindWithRosetta ModuleBuild build); @SqlUpdate("UPDATE module_builds SET buildClusterName = :buildClusterName WHERE id = :moduleBuildId AND state IN ('QUEUED', 'WAITING_FOR_UPSTREAM_BUILD', 'LAUNCHING')") int updateBuildClusterName(@Bind("moduleBuildId") long moduleBuildId, @Bind("buildClusterName") String buildClusterName); @SqlUpdate("UPDATE module_builds SET endTimestamp = :endTimestamp, taskId = :taskId, state = :state WHERE id = :id AND state IN ('QUEUED', 'WAITING_FOR_UPSTREAM_BUILD', 'LAUNCHING', 'IN_PROGRESS')") int complete(@BindWithRosetta ModuleBuild build); }