com.flipkart.hbaseobjectmapper.WrappedHBColumn Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of hbase-object-mapper Show documentation
Show all versions of hbase-object-mapper Show documentation
HBase ORM is a light-weight, thread-safe and performant library that enables:
[1] object-oriented access of HBase rows (Data Access Object) with minimal code and good testability.
[2] reading from and/or writing to HBase tables in Hadoop MapReduce jobs.
This can also be used as an ORM for Bigtable.
The newest version!
package com.flipkart.hbaseobjectmapper;
import com.flipkart.hbaseobjectmapper.exceptions.BothHBColumnAnnotationsPresentException;
import com.flipkart.hbaseobjectmapper.exceptions.DuplicateCodecFlagForColumnException;
import org.apache.hadoop.hbase.util.Bytes;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
/**
* A wrapper class for {@link HBColumn} and {@link HBColumnMultiVersion} annotations (for internal use only)
*/
class WrappedHBColumn {
private final String family, column;
private final boolean multiVersioned, singleVersioned;
private final Class extends Annotation> annotationClass;
private final Map codecFlags;
private final Field field;
WrappedHBColumn(Field field) {
this.field = field;
HBColumn hbColumn = field.getAnnotation(HBColumn.class);
HBColumnMultiVersion hbColumnMultiVersion = field.getAnnotation(HBColumnMultiVersion.class);
if (hbColumn != null && hbColumnMultiVersion != null) {
throw new BothHBColumnAnnotationsPresentException(field);
}
if (hbColumn != null) {
family = hbColumn.family();
column = hbColumn.column();
singleVersioned = true;
multiVersioned = false;
annotationClass = HBColumn.class;
codecFlags = toMap(hbColumn.codecFlags());
} else if (hbColumnMultiVersion != null) {
family = hbColumnMultiVersion.family();
column = hbColumnMultiVersion.column();
singleVersioned = false;
multiVersioned = true;
annotationClass = HBColumnMultiVersion.class;
codecFlags = toMap(hbColumnMultiVersion.codecFlags());
} else {
family = null;
column = null;
singleVersioned = false;
multiVersioned = false;
annotationClass = null;
codecFlags = null;
}
}
private Map toMap(Flag[] codecFlags) {
Map flagsMap = new HashMap<>(codecFlags.length, 1.0f);
for (Flag flag : codecFlags) {
String previousValue = flagsMap.put(flag.name(), flag.value());
if (previousValue != null) {
throw new DuplicateCodecFlagForColumnException(field.getDeclaringClass(), field.getName(), annotationClass, flag.name());
}
}
return flagsMap;
}
public String family() {
return family;
}
public byte[] familyBytes() {
return Bytes.toBytes(family);
}
public String column() {
return column;
}
public byte[] columnBytes() {
return Bytes.toBytes(column);
}
public Map codecFlags() {
return codecFlags;
}
public boolean isPresent() {
return singleVersioned || multiVersioned;
}
public boolean isMultiVersioned() {
return multiVersioned;
}
public boolean isSingleVersioned() {
return singleVersioned;
}
public String getName() {
return annotationClass.getName();
}
@Override
public String toString() {
return String.format("%s:%s", family, column);
}
}