package com.alvazan.orm.impl.meta.data;
import java.lang.reflect.Field;
import java.util.List;
import com.alvazan.orm.api.z5api.NoSqlSession;
import com.alvazan.orm.api.z8spi.Row;
import com.alvazan.orm.api.z8spi.action.Column;
import com.alvazan.orm.api.z8spi.conv.Converters.IntConverter;
import com.alvazan.orm.api.z8spi.meta.DboColumnMeta;
import com.alvazan.orm.api.z8spi.meta.DboColumnTTLMeta;
import com.alvazan.orm.api.z8spi.meta.DboTableMeta;
import com.alvazan.orm.api.z8spi.meta.IndexData;
import com.alvazan.orm.api.z8spi.meta.InfoForIndex;
import com.alvazan.orm.api.z8spi.meta.ReflectionUtil;
public class MetaTTLField<OWNER> extends MetaAbstractField<OWNER> {
private DboColumnTTLMeta metaDbo = new DboColumnTTLMeta();
protected Field field;
protected String columnName;
private IntConverter converter = new IntConverter();
public void setup(DboTableMeta owner, Field field, String colName, boolean indexed) {
metaDbo.setup(owner, colName, indexed);
this.field = field;
this.field.setAccessible(true);
this.columnName = colName;
}
@Override
public DboColumnMeta getMetaDbo() {
return metaDbo;
}
@Override
public String toString() {
return "MetaTTL ["+ field.getDeclaringClass().getName()+"."+field.getName()+"]";
}
@Override
public void translateFromColumn(Row row, OWNER entity, NoSqlSession session) {
if( row.getColumns().isEmpty() )
ReflectionUtil.putFieldValue(entity, field, new Integer(0));
else {
Column col = row.getColumns().iterator().next();
ReflectionUtil.putFieldValue(entity, field, col.getTtl());
}
}
@Override
public void translateToColumn(InfoForIndex<OWNER> info) {
OWNER entity = info.getEntity();
Object value = ReflectionUtil.fetchFieldValue(entity, field);
info.getRow().setTtl((Integer)value);
}
@Override
public void removingEntity(InfoForIndex<OWNER> info,
List<IndexData> indexRemoves, byte[] rowKey) {
// we do not allow index on TTL, nothing needs be done
}
@Override
public byte[] translateValue(Object value) {
return converter.convertToNoSql(value);
}
@Override
public Object fetchField(Object entity) {
return ReflectionUtil.fetchFieldValue(entity, field);
}
@Override
public String translateToString(Object fieldsValue) {
return fieldsValue.toString();
}
@Override
protected Object unwrapIfNeeded(Object value) {
return value;
}
}