/* 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.result; import com.db4o.foundation.*; import com.db4o.internal.*; import com.db4o.internal.classindex.*; import com.db4o.reflect.*; /** * @exclude */ public abstract class AbstractLateQueryResult extends AbstractQueryResult { protected Iterable4 _iterable; public AbstractLateQueryResult(Transaction transaction) { super(transaction); } public AbstractQueryResult supportSize(){ return toIdTree(); } public AbstractQueryResult supportSort(){ return toIdList(); } public AbstractQueryResult supportElementAccess(){ return toIdList(); } protected int knownSize(){ return 0; } public IntIterator4 iterateIDs() { if(_iterable == null){ throw new IllegalStateException(); } return new IntIterator4Adaptor(_iterable); } public AbstractQueryResult toIdList(){ return toIdTree().toIdList(); } public boolean skipClass(ClassMetadata classMetadata){ if (classMetadata.getName() == null) { return true; } ReflectClass claxx = classMetadata.classReflector(); if (stream()._handlers.ICLASS_INTERNAL.isAssignableFrom(claxx)){ return true; } return false; } protected Iterable4 classIndexesIterable(final ClassMetadataIterator classCollectionIterator) { return Iterators.concatMap(Iterators.iterable(classCollectionIterator), new Function4() { public Object apply(Object current) { final ClassMetadata classMetadata = (ClassMetadata)current; if(skipClass(classMetadata)){ return Iterators.SKIP; } return classIndexIterable(classMetadata); } }); } protected Iterable4 classIndexIterable(final ClassMetadata clazz) { return new Iterable4() { public Iterator4 iterator() { return classIndexIterator(clazz); } }; } public Iterator4 classIndexIterator(ClassMetadata clazz) { return BTreeClassIndexStrategy.iterate(clazz, transaction()); } }