blob: fba872b7dc1aa6fe41a3cd1a299cf29b5db355d4 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License. You may obtain a
* copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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 org.apache.fluo.accumulo.iterators;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.function.LongPredicate;
import org.apache.accumulo.core.data.Key;
import org.apache.accumulo.core.data.PartialKey;
import org.apache.accumulo.core.data.Value;
/**
* This class buffers Keys that all have the same row+column. Internally it only stores one Key, a
* list of timestamps and a list of values. At iteration time it materializes each Key+Value.
*/
class ColumnBuffer {
private Key key;
private ArrayList<Long> timeStamps;
private ArrayList<byte[]> values;
public ColumnBuffer() {
this.key = null;
this.timeStamps = new ArrayList<>();
this.values = new ArrayList<>();
}
/**
* @param timestamp Timestamp to be added to buffer
* @param v Value to be added to buffer
*/
private void add(long timestamp, byte[] v) {
timeStamps.add(timestamp);
values.add(v);
}
/**
* When empty, the first key added sets the row+column. After this all keys added must have the
* same row+column.
*
* @param k Key to be added to buffer
* @param vByte Value to be added to buffer
*/
public void add(Key k, byte[] vByte) throws IllegalArgumentException {
vByte = Arrays.copyOf(vByte, vByte.length);
if (key == null) {
key = new Key(k);
add(k.getTimestamp(), vByte);
} else if (key.equals(k, PartialKey.ROW_COLFAM_COLQUAL_COLVIS)) {
add(k.getTimestamp(), vByte);
} else {
throw new IllegalArgumentException();
}
}
/**
* When empty, the first key added sets the row+column. After this all keys added must have the
* same row+column.
*
* @param k Key to be added to buffer
* @param v Value to be added to buffer
*/
public void add(Key k, Value v) throws IllegalArgumentException {
add(k, v.get());
}
/**
* Clears the dest ColumnBuffer and inserts all entries in dest where the timestamp passes the
* timestampTest.
*
* @param dest Destination ColumnBuffer
* @param timestampTest Test to determine which timestamps get added to dest
*/
public void copyTo(ColumnBuffer dest, LongPredicate timestampTest) {
dest.clear();
if (key != null) {
dest.key = new Key(key);
}
for (int i = 0; i < timeStamps.size(); i++) {
long time = timeStamps.get(i);
if (timestampTest.test(time)) {
dest.add(time, values.get(i));
}
}
}
public void clear() {
timeStamps.clear();
values.clear();
key = null;
}
/**
* @return the size of the current buffer
*/
public int size() {
return timeStamps.size();
}
/**
* @param pos Position of the Key that will be retrieved
* @return The key at a given position
*/
public Key getKey(int pos) {
Key tmpKey = new Key(key);
tmpKey.setTimestamp(timeStamps.get(pos));
return tmpKey;
}
/**
* @param pos Position of the Value that will be retrieved
* @return The value at a given position
*/
public Value getValue(int pos) {
return new Value(values.get(pos));
}
}