/* 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.query.processor;
import com.db4o.*;
import com.db4o.foundation.*;
import com.db4o.internal.*;
import com.db4o.marshall.*;
import com.db4o.reflect.*;
import com.db4o.types.*;
/**
* @exclude
*/
public class QField implements Unversioned{
transient Transaction i_trans;
@decaf.Public
private String i_name;
transient FieldMetadata _fieldMetadata;
@decaf.Public
private int i_classMetadataID;
@decaf.Public
private int _fieldHandle;
public QField(){
// C/S only
}
public QField(Transaction a_trans, String name, FieldMetadata fieldMetadata, int classMetadataID, int a_index){
i_trans = a_trans;
i_name = name;
_fieldMetadata = fieldMetadata;
i_classMetadataID = classMetadataID;
_fieldHandle = a_index;
if(_fieldMetadata != null){
if(! _fieldMetadata.alive()){
_fieldMetadata = null;
}
}
}
public String name() {
return i_name;
}
Object coerce(Object a_object){
ReflectClass claxx = null;
if(a_object != null){
if(a_object instanceof ReflectClass){
claxx = (ReflectClass)a_object;
}else{
claxx = i_trans.reflector().forObject(a_object);
}
}else{
// TODO: Review this line for NullableArrayHandling
if(Deploy.csharp){
return a_object;
}
}
if(_fieldMetadata == null){
return a_object;
}
return _fieldMetadata.coerce(claxx, a_object);
}
ClassMetadata getFieldType(){
if(_fieldMetadata != null){
return _fieldMetadata.fieldType();
}
return null;
}
public FieldMetadata getFieldMetadata() {
return _fieldMetadata;
}
boolean isArray(){
return _fieldMetadata != null && Handlers4.handlesArray(_fieldMetadata.getHandler());
}
boolean isClass(){
return _fieldMetadata == null || Handlers4.handlesClass(_fieldMetadata.getHandler());
}
boolean isQueryLeaf(){
return _fieldMetadata != null && Handlers4.isQueryLeaf(_fieldMetadata.getHandler());
}
PreparedComparison prepareComparison(Context context, Object obj){
if(_fieldMetadata != null){
return _fieldMetadata.prepareComparison(context, obj);
}
if(obj == null){
return Null.INSTANCE;
}
ClassMetadata yc = i_trans.container().produceClassMetadata(i_trans.reflector().forObject(obj));
FieldMetadata yf = yc.fieldMetadataForName(name());
if(yf != null){
return yf.prepareComparison(context, obj);
}
return null;
}
void unmarshall(Transaction a_trans){
if(i_classMetadataID != 0){
ClassMetadata yc = a_trans.container().classMetadataForID(i_classMetadataID);
_fieldMetadata = (FieldMetadata) yc._aspects[_fieldHandle];
}
}
public String toString() {
if(_fieldMetadata != null){
return "QField " + _fieldMetadata.toString();
}
return super.toString();
}
}