package com.netflix.astyanax.cql.reads;
import java.util.Iterator;
import com.google.common.util.concurrent.ListenableFuture;
import com.netflix.astyanax.MutationBatch;
import com.netflix.astyanax.RowCopier;
import com.netflix.astyanax.connectionpool.OperationResult;
import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
import com.netflix.astyanax.cql.CqlKeyspaceImpl;
import com.netflix.astyanax.cql.CqlKeyspaceImpl.KeyspaceContext;
import com.netflix.astyanax.cql.reads.model.CqlColumnImpl;
import com.netflix.astyanax.cql.writes.CqlColumnListMutationImpl;
import com.netflix.astyanax.model.Column;
import com.netflix.astyanax.model.ColumnFamily;
import com.netflix.astyanax.model.ColumnList;
import com.netflix.astyanax.query.RowQuery;
/**
* Impl for {@link RowCopier}
*
* @author poberai
*
* @param <K>
* @param <C>
*/
public class CqlRowCopier<K,C> implements RowCopier<K,C> {
private boolean useOriginalTimestamp = false;
private final RowQuery<K,C> rowQuery;
private final ColumnFamily<K,C> cf;
private final K rowKey;
private final KeyspaceContext ksContext;
public CqlRowCopier(ColumnFamily<K,C> cf, K rowKey, RowQuery<K,C> query, KeyspaceContext ksContext) {
this.cf = cf;
this.rowKey = rowKey;
this.rowQuery = query;
this.ksContext = ksContext;
}
@Override
public OperationResult<Void> execute() throws ConnectionException {
return getMutationBatch().execute();
}
@Override
public ListenableFuture<OperationResult<Void>> executeAsync() throws ConnectionException {
return getMutationBatch().executeAsync();
}
@Override
public RowCopier<K, C> withOriginalTimestamp(boolean useTimestamp) {
this.useOriginalTimestamp = useTimestamp;
return this;
}
private MutationBatch getMutationBatch() throws ConnectionException {
ColumnList<C> columnList = rowQuery.execute().getResult();
CqlKeyspaceImpl ksImpl = new CqlKeyspaceImpl(ksContext);
MutationBatch mBatch = ksImpl.prepareMutationBatch();
CqlColumnListMutationImpl<K,C> colListMutation = (CqlColumnListMutationImpl<K, C>)mBatch.withRow(cf, rowKey);
Iterator<Column<C>> iter = columnList.iterator();
boolean first = true;
while(iter.hasNext()) {
CqlColumnImpl<C> col = (CqlColumnImpl<C>) iter.next();
if (first && useOriginalTimestamp) {
colListMutation.setTimestamp(col.getTimestamp());
first = false;
}
colListMutation.putColumnWithGenericValue(col.getName(), col.getGenericValue(), null);
}
return mBatch;
}
}