/* 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.foundation.*;
import com.db4o.internal.*;
import com.db4o.internal.classindex.*;
import com.db4o.internal.fieldindex.*;
/**
* @exclude
*/
public class QueryResultCandidates {
private QCandidateBase _candidates;
private QCandidates _qCandidates;
IntVisitable _candidateIds;
public QueryResultCandidates(QCandidates qCandidates){
_qCandidates = qCandidates;
}
public void add(InternalCandidate candidate) {
toQCandidates();
_candidates = Tree.add(_candidates, (QCandidateBase)candidate);
}
private void toQCandidates() {
if(_candidateIds == null){
return;
}
_candidateIds.traverse(new IntVisitor() {
public void visit(int id) {
_candidates = Tree.add(_candidates, new QCandidate(_qCandidates, null, id));
}
});
_candidateIds = null;
}
public void fieldIndexProcessorResult(FieldIndexProcessorResult result) {
_candidateIds = result;
}
public void singleCandidate(QCandidateBase candidate) {
_candidates = candidate;
_candidateIds = null;
}
boolean filter(Visitor4 visitor) {
toQCandidates();
if (_candidates != null) {
_candidates.traverse(visitor);
_candidates = (QCandidateBase) _candidates.filter(new Predicate4() {
public boolean match(Object a_candidate) {
return ((QCandidateBase) a_candidate)._include;
}
});
}
return _candidates != null;
}
boolean filter(final QField field, final FieldFilterable filterable) {
toQCandidates();
if (_candidates != null) {
_candidates.traverse(new Visitor4() {
@Override
public void visit(Object candidate) {
filterable.filter(field, (ParentCandidate)candidate);
}
});
_candidates = (QCandidateBase) _candidates.filter(new Predicate4() {
public boolean match(Object a_candidate) {
return ((QCandidateBase) a_candidate)._include;
}
});
}
return _candidates != null;
}
public void loadFromClassIndex(ClassIndexStrategy index) {
_candidateIds = index.idVisitable(_qCandidates.transaction());
}
void traverse(Visitor4 visitor) {
toQCandidates();
if(_candidates != null){
_candidates.traverse(visitor);
}
}
public void traverseIds(final IntVisitor visitor) {
if(_candidateIds != null){
_candidateIds.traverse(visitor);
return;
}
traverse(new Visitor4() {
public void visit(Object obj) {
QCandidateBase candidate = (QCandidateBase) obj;
if(candidate.include()){
visitor.visit(candidate._key);
}
}
});
}
}