package org.rakam.clickhouse;
import com.google.common.collect.ImmutableMap;
import com.google.inject.Inject;
import org.rakam.analysis.ContinuousQueryService;
import org.rakam.analysis.metadata.QueryMetadataStore;
import org.rakam.collection.SchemaField;
import org.rakam.plugin.ContinuousQuery;
import org.rakam.report.QueryExecution;
import org.rakam.report.QueryExecutor;
import org.rakam.report.QueryResult;
import org.rakam.util.AlreadyExistsException;
import org.rakam.util.RakamException;
import org.rakam.util.ValidationUtil;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import static io.netty.handler.codec.http.HttpResponseStatus.BAD_REQUEST;
import static java.lang.String.format;
public class ClickHouseContinuousQueryService
extends ContinuousQueryService
{
private final QueryExecutor queryExecutor;
@Inject
public ClickHouseContinuousQueryService(QueryExecutor queryExecutor, QueryMetadataStore database)
{
super(database);
this.queryExecutor = queryExecutor;
}
@Override
public QueryExecution create(String project, ContinuousQuery report, boolean replayHistoricalData)
throws AlreadyExistsException
{
database.createContinuousQuery(project, report);
String.format("CREATE MATERIALIZED VIEW %s.%s ENGINE = AggregatingMergeTree(`$date`, (`$date`), 8192) AS %s");
return QueryExecution.completedQueryExecution(null, QueryResult.empty());
}
@Override
public CompletableFuture<Boolean> delete(String project, String tableName)
{
String prestoQuery = format("drop table %s.%s", project, ValidationUtil.checkCollection(tableName));
return queryExecutor.executeRawQuery(prestoQuery).getResult().thenApply(result -> {
if (result.getError() == null) {
database.deleteContinuousQuery(project, tableName);
return true;
} else {
throw new RakamException("Error while deleting continuous query:" + result.getError().message, BAD_REQUEST);
}
});
}
@Override
public Map<String, List<SchemaField>> getSchemas(String project)
{
return ImmutableMap.of();
}
@Override
public boolean test(String project, String query)
{
return false;
}
@Override
public QueryExecution refresh(String project, String tableName)
{
return null;
}
}