package eu.fbk.knowledgestore.datastore.hbase.utils;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import com.google.common.base.Preconditions;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.filter.FilterBase;
import org.openrdf.model.URI;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import eu.fbk.knowledgestore.data.Dictionary;
import eu.fbk.knowledgestore.data.Record;
import eu.fbk.knowledgestore.data.XPath;
public class HBaseFilter extends FilterBase {
static final Logger LOGGER = LoggerFactory.getLogger(HBaseFilter.class);
/** The condition to be applied to filter out records. */
private XPath condition;
/** The serializer to be used to decode stored byte arrays into records. */
private AvroSerializer serializer;
/**
* Default constructor for exclusive use by HBase. This constructor is used for
* deserialization of an {@code HBaseFilter} on a region server; initialization of the object
* is done by {@link #readFields(DataInput)}.
*/
public HBaseFilter() {
}
/**
* Constructor for normal use.
*
* @param condition
* the condition to be evaluated for each Node.
* @param serializer
* the serializer for decoding stored byte arrays into records
*/
public HBaseFilter(final XPath condition, final AvroSerializer serializer) {
Preconditions.checkNotNull(condition);
Preconditions.checkNotNull(serializer);
this.condition = condition;
this.serializer = serializer;
}
@Override
public ReturnCode filterKeyValue(final KeyValue keyValue) {
final Record record = (Record) this.serializer.fromBytes(keyValue.getValue());
return this.condition.evalBoolean(record) ? ReturnCode.INCLUDE : ReturnCode.NEXT_ROW;
}
@Override
public void readFields(final DataInput dataIn) throws IOException {
final String conditionString = dataIn.readUTF();
final String dictionaryURL = dataIn.readUTF();
this.condition = XPath.parse(conditionString);
this.serializer = new AvroSerializer(Dictionary.createHadoopDictionary(URI.class, dictionaryURL));
}
@Override
public void write(final DataOutput dataOut) throws IOException {
dataOut.writeUTF(this.condition.toString());
dataOut.writeUTF(this.serializer.getDictionary().getDictionaryURL());
}
}