package jef.database.meta;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.OneToMany;
import jef.database.IQueryableEntity;
import jef.database.annotation.DynamicKeyValueExtension;
import jef.database.annotation.JoinType;
import jef.database.dialect.ColumnType;
import jef.database.dialect.type.ColumnMapping;
import jef.database.meta.extension.KvEntensionProperty;
public final class KvExtensionImpl extends AbstractExtensionConfig implements ExtensionConfigFactory {
private DynamicKeyValueExtension config;
private TupleMetadata kvTable;
private JoinPath joinPath;
public KvExtensionImpl(DynamicKeyValueExtension dkv, Class<?> entityClass,AbstractMetadata parent) {
super(dkv.metadata(),parent);
this.config=dkv;
// 创建KV表
TupleMetadata tuple = new TupleMetadata(config.table());
List<JoinKey> joinkeys=new ArrayList<JoinKey>();
for (ColumnMapping m : parent.getPKFields()) {
ColumnType ct = m.get();
if (ct instanceof ColumnType.GUID) {
ct = ((ColumnType.GUID) ct).toNormalType();
} else if (ct instanceof ColumnType.AutoIncrement) {
ct = ((ColumnType.AutoIncrement) ct).toNormalType();
}
tuple.addColumn(m.fieldName(),m.rawColumnName(), ct,true);
joinkeys.add(new JoinKey(m.field(),tuple.getField(m.fieldName())));
}
tuple.addColumn(config.keyColumn(),config.keyColumn(), new ColumnType.Varchar(64).setNullable(false),true);
tuple.addColumn(config.valueColumn(), new ColumnType.Varchar(4000));
this.kvTable=tuple;
this.joinPath=new JoinPath(JoinType.INNER,joinkeys.toArray(new JoinKey[joinkeys.size()]));
}
@Override
public boolean isDynamicTable() {
return false;
}
public DynamicKeyValueExtension getConfig(){
return config;
}
public TupleMetadata getContainerTuple() {
return kvTable;
}
@Override
public ExtensionConfig getDefault() {
return this;
}
@Override
public ExtensionConfig getExtension(String extensionName) {
return this;
}
@Override
public ExtensionConfig getExtension(IQueryableEntity q) {
return this;
}
@Override
protected AbstractMetadata merge() {
if(parent instanceof TableMetadata){
TableMetadata tm=(TableMetadata)parent;
tm.extendContainer=getContainerTuple();
tm.extendMeta=getExtensionMeta();
return tm;
}else{
throw new IllegalArgumentException(parent.getClass().getName());
}
}
public ITableMetadata getRawMetadata() {
return parent;
}
public void initMeta() {
TableMetadata tm=(TableMetadata)parent;
CascadeConfig config=new CascadeConfig(null,(OneToMany)null);
config.path=joinPath;
KvEntensionProperty property=new KvEntensionProperty("attributes",kvTable,parent,this.getExtensionMeta(),this.config);
ReferenceObject ref=tm.innerAdd(property,kvTable, config);
ref.setPriority(5);
// tm.addRefField_1vsN(Map.class, , tm.extendContainer, config);
}
}