Java tutorial
/** * Copyright 2016 Palantir Technologies * * Licensed under the BSD-3 License (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://opensource.org/licenses/BSD-3-Clause * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.palantir.atlasdb.keyvalue.jdbc.impl; import java.util.Arrays; import java.util.Collection; import java.util.Map; import java.util.Map.Entry; import javax.annotation.Nullable; import org.jooq.InsertValuesStep4; import org.jooq.Record; import org.jooq.Result; import org.jooq.Row3; import org.jooq.impl.DSL; import com.google.common.base.Function; import com.google.common.collect.Collections2; import com.google.common.collect.Maps; import com.palantir.atlasdb.keyvalue.api.Cell; public class SingleTimestampPutBatch implements PutBatch { private final Map<Cell, byte[]> data; private final Long timestamp; public SingleTimestampPutBatch(Map<Cell, byte[]> data, Long timestamp) { this.data = data; this.timestamp = timestamp; } @Override public InsertValuesStep4<Record, byte[], byte[], Long, byte[]> addValuesForInsert( InsertValuesStep4<Record, byte[], byte[], Long, byte[]> query) { for (Entry<Cell, byte[]> entry : data.entrySet()) { query = query.values(entry.getKey().getRowName(), entry.getKey().getColumnName(), timestamp, entry.getValue()); } return query; } @Override public Collection<Row3<byte[], byte[], Long>> getRowsForSelect() { return Collections2.transform(data.keySet(), new Function<Cell, Row3<byte[], byte[], Long>>() { @Override public Row3<byte[], byte[], Long> apply(Cell cell) { return DSL.row(cell.getRowName(), cell.getColumnName(), timestamp); } }); } @Override @Nullable public PutBatch getNextBatch(Result<? extends Record> existingRecords) { Map<Cell, byte[]> existing = Maps.newHashMapWithExpectedSize(existingRecords.size()); for (Record record : existingRecords) { existing.put(Cell.create(record.getValue(JdbcConstants.A_ROW_NAME), record.getValue(JdbcConstants.A_COL_NAME)), record.getValue(JdbcConstants.A_VALUE)); } Map<Cell, byte[]> nextBatch = Maps.newHashMap(); for (Entry<Cell, byte[]> entry : data.entrySet()) { Cell cell = entry.getKey(); byte[] newValue = entry.getValue(); byte[] oldValue = existing.get(cell); if (oldValue == null) { nextBatch.put(cell, newValue); } else if (!Arrays.equals(oldValue, newValue)) { return null; } } return new SingleTimestampPutBatch(nextBatch, timestamp); } }