/* This file is part of the db4o object database http://www.db4o.com
Copyright (C) 2004 - 2011 Versant Corporation http://www.versant.com
db4o is free software; you can redistribute it and/or modify it under
the terms of version 3 of the GNU General Public License as published
by the Free Software Foundation.
db4o is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License along
with this program. If not, see http://www.gnu.org/licenses/. */
package com.db4o.internal;
import com.db4o.*;
import com.db4o.config.*;
import com.db4o.foundation.*;
public class Config4Field extends Config4Abstract implements ObjectField, DeepClone {
private final Config4Class _configClass;
private boolean _used;
private final static KeySpec INDEXED_KEY=new KeySpec(TernaryBool.UNSPECIFIED);
protected Config4Field(Config4Class a_class, KeySpecHashtable4 config) {
super(config);
_configClass = a_class;
}
Config4Field(Config4Class a_class, String a_name) {
_configClass = a_class;
setName(a_name);
}
private Config4Class classConfig() {
return _configClass;
}
String className() {
return classConfig().getName();
}
public Object deepClone(Object param) {
return new Config4Field((Config4Class)param, _config);
}
public void rename(String newName) {
classConfig().config().rename(Renames.forField(className(), getName(), newName));
setName(newName);
}
public void indexed(boolean flag) {
putThreeValued(INDEXED_KEY, flag);
}
public void initOnUp(Transaction systemTrans, FieldMetadata fieldMetadata) {
ObjectContainerBase anyStream = systemTrans.container();
if (!anyStream.maintainsIndices()) {
return;
}
if(Debug4.indexAllFields){
indexed(true);
}
if (! fieldMetadata.supportsIndex()) {
indexed(false);
}
TernaryBool indexedFlag=_config.getAsTernaryBool(INDEXED_KEY);
if (indexedFlag.definiteNo()) {
fieldMetadata.dropIndex((LocalTransaction)systemTrans);
return;
}
if (useExistingIndex(systemTrans, fieldMetadata)) {
return;
}
if (!indexedFlag.definiteYes()) {
return;
}
fieldMetadata.createIndex();
}
private boolean useExistingIndex(Transaction systemTrans, FieldMetadata fieldMetadata) {
return fieldMetadata.getIndex(systemTrans) != null;
}
public void used(boolean flag) {
_used = flag;
}
public boolean used(){
return _used;
}
}