package org.neodatis.odb.impl.core.btree;

import org.neodatis.btree.BTreeError;
import org.neodatis.btree.BTreeIteratorSingleValuePerKey;
import org.neodatis.btree.IBTree;
import org.neodatis.odb.ODBRuntimeException;
import org.neodatis.odb.OID;
import org.neodatis.odb.core.OrderByConstants;
import org.neodatis.odb.core.layers.layer2.meta.NonNativeObjectInfo;
import org.neodatis.odb.core.layers.layer3.IStorageEngine;

/**
 * A Lazy BTree Iterator : It iterate on the object OIDs and lazy load objects from them (OIDs) 
 * Used by the LazyBTreeCollection
 * @author osmadja
 *
 */
public class LazyODBBTreeIteratorSIngle extends BTreeIteratorSingleValuePerKey{
	private IStorageEngine storageEngine;
    private boolean returnObjects;
	
    
    /**
     * 
     * @param tree
     * @param orderByType
     * @param storageEngine
     * @param returnObjects
     */
    public LazyODBBTreeIteratorSIngle(IBTree tree, OrderByConstants orderByType, IStorageEngine storageEngine, boolean returnObjects) {
		super(tree, orderByType);
		this.storageEngine = storageEngine;
		this.returnObjects = returnObjects;
	}
	public Object next() {
		OID oid = (OID) super.next();
		try {
			return loadObject(oid);
		} catch (Exception e) {
			throw new ODBRuntimeException(BTreeError.LAZY_LOADING_NODE.addParameter(oid),e);
		}
	}
    
	private Object loadObject(OID oid) throws Exception {
        // true = to use cache
		NonNativeObjectInfo nnoi = (NonNativeObjectInfo) storageEngine.getObjectReader().readNonNativeObjectInfoFromOid(null,oid,true,returnObjects); 
        if(returnObjects){
        	Object o = nnoi.getObject();
        	if(o!=null){
        		return o;
        	}
        	return storageEngine.getObjectReader().buildOneInstance(nnoi);
        }
        return nnoi;
	}


}

 

Ads help maintain this website.