1 21 package com.db4o.inside.fieldindex; 22 23 import com.db4o.*; 24 import com.db4o.foundation.*; 25 26 public class FieldIndexProcessor { 27 28 private final QCandidates _candidates; 29 30 public FieldIndexProcessor(QCandidates candidates) { 31 _candidates = candidates; 32 } 33 34 public FieldIndexProcessorResult run() { 35 IndexedNode bestIndex = selectBestIndex(); 36 if (null == bestIndex) { 37 return FieldIndexProcessorResult.NO_INDEX_FOUND; 38 } 39 if (bestIndex.resultSize() > 0) { 40 IndexedNode resolved = resolveFully(bestIndex); 41 if (null == resolved) { 42 return FieldIndexProcessorResult.NO_INDEX_FOUND; 43 } 44 return new FieldIndexProcessorResult(resolved); 45 } 46 return FieldIndexProcessorResult.FOUND_INDEX_BUT_NO_MATCH; 47 } 48 49 private IndexedNode resolveFully(IndexedNode bestIndex) { 50 if (null == bestIndex) { 51 return null; 52 } 53 if (bestIndex.isResolved()) { 54 return bestIndex; 55 } 56 return resolveFully(bestIndex.resolve()); 57 } 58 59 public IndexedNode selectBestIndex() { 60 final Iterator4 i = collectIndexedNodes(); 61 if (!i.moveNext()) { 62 return null; 63 } 64 65 IndexedNode best = (IndexedNode)i.current(); 66 while (i.moveNext()) { 67 IndexedNode leaf = (IndexedNode)i.current(); 68 if (leaf.resultSize() < best.resultSize()) { 69 best = leaf; 70 } 71 } 72 return best; 73 } 74 75 public Iterator4 collectIndexedNodes() { 76 return new IndexedNodeCollector(_candidates).getNodes(); 77 } 78 } 79 | Popular Tags |