package org.neodatis.odb.impl.core.query.values;
import java.util.Iterator;
import org.neodatis.odb.OID;
import org.neodatis.odb.ObjectValues;
import org.neodatis.odb.Objects;
import org.neodatis.odb.Values;
import org.neodatis.odb.core.layers.layer2.instance.IInstanceBuilder;
import org.neodatis.odb.core.layers.layer2.meta.AttributeValuesMap;
import org.neodatis.odb.core.layers.layer2.meta.ClassInfo;
import org.neodatis.odb.core.layers.layer3.IStorageEngine;
import org.neodatis.odb.core.query.IValuesQuery;
import org.neodatis.odb.core.query.execution.IMatchingObjectAction;
import org.neodatis.odb.core.query.execution.IQueryFieldAction;
import org.neodatis.odb.impl.core.oid.OdbObjectOID;
import org.neodatis.odb.impl.core.query.list.values.DefaultObjectValues;
import org.neodatis.odb.impl.core.query.list.values.InMemoryBTreeCollectionForValues;
import org.neodatis.odb.impl.core.query.list.values.SimpleListForValues;
import org.neodatis.tool.wrappers.OdbComparable;
public class ValuesQueryResultAction implements IMatchingObjectAction {
private IValuesQuery query;
/** A copy of the query object actions */
private IQueryFieldAction[] queryFieldActions;
private long nbObjects;
private Values result;
private boolean queryHasOrderBy;
/** An object to build instances */
protected IInstanceBuilder instanceBuilder;
protected ClassInfo classInfo;
private int returnArraySize;
private IStorageEngine engine;
public ValuesQueryResultAction(IValuesQuery query, IStorageEngine storageEngine, IInstanceBuilder instanceBuilder) {
super();
this.engine = storageEngine;
this.query = query;
this.queryHasOrderBy = query.hasOrderBy();
this.instanceBuilder = instanceBuilder;
this.returnArraySize = query.getObjectActions().size();
Iterator iterator = query.getObjectActions().iterator();
IQueryFieldAction qfa = null;
queryFieldActions = new IQueryFieldAction[returnArraySize];
int i = 0;
while (iterator.hasNext()) {
qfa = (IQueryFieldAction) iterator.next();
queryFieldActions[i] = qfa.copy();
queryFieldActions[i].setReturnInstance(query.returnInstance());
queryFieldActions[i].setInstanceBuilder(instanceBuilder);
i++;
}
}
public void objectMatch(OID oid, OdbComparable orderByKey) {
// This method os not used in Values Query API
/*
* if (queryHasOrderBy) { result.addWithKey(orderByKey, oid); } else {
* result.add(oid); }
*/
}
public void objectMatch(OID oid, Object object, OdbComparable orderByKey) {
if (query.isMultiRow()) {
ObjectValues values = convertObject((AttributeValuesMap) object);
if (queryHasOrderBy) {
result.addWithKey(orderByKey, values);
} else {
result.add(values);
}
} else {
compute((AttributeValuesMap) object);
}
}
private void compute(AttributeValuesMap values) {
for (int i = 0; i < returnArraySize; i++) {
queryFieldActions[i].execute(values.getObjectInfoHeader().getOid(), values);
}
}
private ObjectValues convertObject(AttributeValuesMap values) {
DefaultObjectValues dov = new DefaultObjectValues(returnArraySize);
IQueryFieldAction qfa = null;
for (int i = 0; i < returnArraySize; i++) {
qfa = queryFieldActions[i];
qfa.execute(values.getObjectInfoHeader().getOid(), values);
Object o = qfa.getValue();
// When Values queries return objects, they actually return the oid of the object
// So we must load it here
if (o != null && o instanceof OID) {
OdbObjectOID oid = (OdbObjectOID) o;
o = engine.getObjectFromOid(oid);
}
dov.set(i, qfa.getAlias(), o);
}
return dov;
}
public void start() {
if (query != null && query.hasOrderBy()) {
result = new InMemoryBTreeCollectionForValues((int) nbObjects, query.getOrderByType());
} else {
result = new SimpleListForValues((int) nbObjects);
}
IQueryFieldAction qfa = null;
for (int i = 0; i < returnArraySize; i++) {
qfa = queryFieldActions[i];
qfa.start();
}
}
public void end() {
IQueryFieldAction qfa = null;
DefaultObjectValues dov = null;
if (!query.isMultiRow()) {
dov = new DefaultObjectValues(returnArraySize);
}
for (int i = 0; i < returnArraySize; i++) {
qfa = queryFieldActions[i];
qfa.end();
if (!query.isMultiRow()) {
Object o = qfa.getValue();
// When Values queries return objects, they actually return the oid of the object
// So we must load it here
if (o != null && o instanceof OID) {
OdbObjectOID oid = (OdbObjectOID) o;
o = engine.getObjectFromOid(oid);
}
// Sets the values now
dov.set(i, qfa.getAlias(), o);
}
}
if (!query.isMultiRow()) {
result.add(dov);
}
}
public Values getValues() {
return result;
}
public Objects getObjects() {
return (Objects) result;
}
}
Ads help maintain this website.