package org.rakam.presto.analysis; import com.google.common.base.Throwables; import com.google.common.collect.ImmutableSet; import com.google.common.eventbus.EventBus; import com.google.inject.name.Named; import org.rakam.analysis.JDBCPoolDataSource; import org.rakam.config.ProjectConfig; import org.rakam.util.ProjectCollection; import org.skife.jdbi.v2.DBI; import org.skife.jdbi.v2.Handle; import org.skife.jdbi.v2.TransactionStatus; import org.skife.jdbi.v2.util.StringMapper; import javax.annotation.PostConstruct; import javax.inject.Inject; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import java.util.Set; import static org.rakam.util.ValidationUtil.checkProject; public class PrestoRaptorMetastore extends PrestoAbstractMetastore { private final DBI dbi; @Inject public PrestoRaptorMetastore(ProjectConfig projectConfig, @Named("presto.metastore.jdbc") JDBCPoolDataSource dataSource, PrestoConfig config, EventBus eventBus) { super(projectConfig, config, eventBus); dbi = new DBI(dataSource); } @PostConstruct public void setup() { dbi.inTransaction((Handle handle, TransactionStatus transactionStatus) -> { handle.createStatement("CREATE TABLE IF NOT EXISTS project (" + " name TEXT NOT NULL,\n" + " PRIMARY KEY (name))") .execute(); return null; }); } @Override public void createProject(String project) { checkProject(project); try (Handle handle = dbi.open()) { handle.createStatement("INSERT INTO project (name) VALUES(:name)") .bind("name", project) .execute(); } super.onCreateProject(project); } @Override public Set<String> getProjects() { try (Handle handle = dbi.open()) { return ImmutableSet.copyOf( handle.createQuery("select name from project") .map(StringMapper.FIRST).iterator()); } } @Override public void deleteProject(String project) { try (Handle handle = dbi.open()) { handle.createStatement("delete from project where name = :project") .bind("project", project).execute(); } Set<String> collectionNames = getCollectionNames(project); try (Connection connection = prestoConnectionFactory.openConnection()) { Statement statement = connection.createStatement(); while (!collectionNames.isEmpty()) { for (String collectionName : collectionNames) { statement.execute(String.format("drop table %s.%s.%s", config.getColdStorageConnector(), project, collectionName)); schemaCache.invalidate(new ProjectCollection(project, collectionName)); } collectionCache.refresh(project); collectionNames = collectionCache.getUnchecked(project); } } catch (SQLException e) { throw Throwables.propagate(e); } collectionCache.invalidate(project); super.onDeleteProject(project); } }