1 21 package com.db4o.cs; 22 23 import com.db4o.foundation.*; 24 import com.db4o.inside.query.*; 25 26 29 class ClientQueryResultIterator implements Iterator4 { 30 31 private Object [] _prefetchedObjects; 32 private int _remainingObjects; 33 private int _prefetchRight; 34 private final AbstractQueryResult _client; 35 private final IntIterator4 _ids; 36 37 public ClientQueryResultIterator(AbstractQueryResult client) { 38 _client = client; 39 _ids = client.iterateIDs(); 40 } 41 42 public Object current() { 43 synchronized (streamLock()) { 44 return _client.activate(prefetchedCurrent()); 45 } 46 } 47 48 private Object streamLock() { 49 return _client.streamLock(); 50 } 51 52 public void reset() { 53 _remainingObjects = 0; 54 _ids.reset(); 55 } 56 57 public boolean moveNext() { 58 synchronized (streamLock()) { 59 if (_remainingObjects > 0) { 60 --_remainingObjects; 61 return skipNulls(); 62 } 63 64 prefetch(); 65 66 --_remainingObjects; 67 if(_remainingObjects < 0){ 68 return false; 69 } 70 return skipNulls(); 71 } 72 } 73 74 private boolean skipNulls() { 75 if (prefetchedCurrent() == null){ 77 return moveNext(); 78 } 79 return true; 80 } 81 82 private void prefetch() { 83 ensureObjectCacheAllocated(prefetchCount()); 84 _remainingObjects = stream().prefetchObjects(_ids, _prefetchedObjects, prefetchCount()); 85 _prefetchRight=_remainingObjects; 86 } 87 88 private int prefetchCount() { 89 return stream().config().prefetchObjectCount(); 90 } 91 92 private YapClient stream() { 93 return (YapClient) _client.stream(); 94 } 95 96 private Object prefetchedCurrent() { 97 return _prefetchedObjects[_prefetchRight-_remainingObjects-1]; 98 } 99 100 102 116 private void ensureObjectCacheAllocated(int prefetchObjectCount) { 117 if(_prefetchedObjects==null) { 118 _prefetchedObjects = new Object [prefetchObjectCount]; 119 return; 120 } 121 if(prefetchObjectCount>_prefetchedObjects.length) { 122 Object [] newPrefetchedObjects=new Object [prefetchObjectCount]; 123 System.arraycopy(_prefetchedObjects, 0, newPrefetchedObjects, 0, _prefetchedObjects.length); 124 _prefetchedObjects=newPrefetchedObjects; 125 } 126 } 127 128 129 } 130 | Popular Tags |