package org.rakam.presto.collection; import com.amazonaws.util.Base64; import com.google.common.collect.ImmutableMap; import io.netty.util.CharsetUtil; import org.rakam.plugin.CopyEvent; import org.rakam.plugin.EventStore; import org.rakam.presto.analysis.PrestoConfig; import org.rakam.presto.analysis.PrestoQueryExecutor; import org.rakam.report.QueryExecution; import org.rakam.util.JsonHelper; import org.rakam.util.RakamException; import org.rakam.util.ValidationUtil; import javax.inject.Inject; import java.net.URL; import java.util.List; import java.util.Map; import static io.netty.handler.codec.http.HttpResponseStatus.BAD_REQUEST; import static java.lang.String.format; public class PrestoCopyEvent implements CopyEvent { private final PrestoConfig prestoConfig; private final PrestoQueryExecutor prestoQueryExecutor; @Inject public PrestoCopyEvent(PrestoConfig prestoConfig, PrestoQueryExecutor prestoQueryExecutor) { this.prestoConfig = prestoConfig; this.prestoQueryExecutor = prestoQueryExecutor; } @Override public QueryExecution copy(String project, String collection, List<URL> urls, EventStore.CopyType type, EventStore.CompressionType compressionType, Map<String, String> options) { if (type == null) { throw new RakamException("source type is missing", BAD_REQUEST); } ImmutableMap.Builder<String, String> builder = ImmutableMap.builder(); builder.put(format("%s.urls", prestoConfig.getBulkConnector()), Base64.encodeAsString(JsonHelper.encodeAsBytes(urls))); builder.put(format("%s.source_type", prestoConfig.getBulkConnector()), type.name()); if (options != null) { builder.put(format("%s.source_options", prestoConfig.getBulkConnector()), Base64.encodeAsString(JsonHelper.encode(options).getBytes(CharsetUtil.UTF_8))); } if (compressionType != null) { builder.put(format("%s.compression", prestoConfig.getBulkConnector()), type.name()); } return prestoQueryExecutor.executeRawStatement(format("insert into %s.%s.%s select * from %s.%s.%s", prestoConfig.getColdStorageConnector(), project, ValidationUtil.checkCollection(collection), prestoConfig.getBulkConnector(), project, ValidationUtil.checkCollection(collection)), builder.build(), "middleware"); } }