Changeset 19680
- Timestamp:
- 02/08/12 23:46:12 (4 months ago)
- Location:
- trunk/Jav_Orient
- Files:
-
- 4 added
- 16 edited
- 4 moved
-
src/eu/scenari/orient/recordstruct/IValueList.java (modified) (1 diff)
-
src/eu/scenari/orient/recordstruct/lib/base/ValueList.java (modified) (1 diff)
-
src/eu/scenari/orient/recordstruct/lib/tree/ITreeStorageConfig.java (modified) (1 diff)
-
src/eu/scenari/orient/recordstruct/lib/tree/TreeStorageConfig.java (modified) (3 diffs)
-
src/eu/scenari/orient/recordstruct/lib/tree/ValueTree.java (modified) (5 diffs)
-
src/eu/scenari/orient/recordstruct/lib/tree/ValueTreeNode.java (modified) (2 diffs)
-
src/eu/scenari/orient/recordstruct/lib/tree/ValueTreeRake.java (modified) (1 diff)
-
src/eu/scenari/orient/recordstruct/lib/tree/ValueTreeSlotKV.java (modified) (1 diff)
-
src/eu/scenari/orient/recordstruct/value/ValueListImmutableFixed.java (modified) (1 diff)
-
src/eu/scenari/orient/tree/impl/BalancedLayout.java (modified) (18 diffs)
-
src/eu/scenari/orient/tree/impl/IBalancingLayout.java (modified) (1 diff)
-
src/eu/scenari/orient/tree/impl/IRSTreeNodeVisitor.java (added)
-
src/eu/scenari/orient/tree/impl/RSTree.java (moved) (moved from trunk/Jav_Orient/src/eu/scenari/orient/tree/impl/Tree.java) (14 diffs)
-
src/eu/scenari/orient/tree/impl/RSTreeConcurrent.java (added)
-
src/eu/scenari/orient/tree/impl/RSTreeNode.java (moved) (moved from trunk/Jav_Orient/src/eu/scenari/orient/tree/impl/TreeNode.java) (10 diffs)
-
src/eu/scenari/orient/tree/impl/RSTreeRake.java (moved) (moved from trunk/Jav_Orient/src/eu/scenari/orient/tree/impl/TreeRake.java) (23 diffs)
-
src/eu/scenari/orient/tree/impl/RSTreeSlot.java (moved) (moved from trunk/Jav_Orient/src/eu/scenari/orient/tree/impl/TreeSlot.java) (4 diffs)
-
src/eu/scenari/orient/tree/provider/ITreeNodeProvider.java (modified) (2 diffs)
-
src/eu/scenari/orient/tree/provider/ITreeProvider.java (modified) (2 diffs)
-
src/eu/scenari/orient/tree/provider/ITreeRakeProvider.java (modified) (1 diff)
-
src/eu/scenari/orient/tree/provider/ITreeSlotProvider.java (modified) (1 diff)
-
test/eu/scenari/orient/tree/TreeBasicTest.java (modified) (3 diffs)
-
test/eu/scenari/orient/tree/TreeBigTest.java (added)
-
test/eu/scenari/orient/tree/TypesTreeTests.java (added)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Jav_Orient/src/eu/scenari/orient/recordstruct/IValueList.java
r19672 r19680 46 46 public interface IValueList<E> extends IValue<List<E>>, List<E> { 47 47 48 /** 49 * 50 */ 51 public boolean isConcurrentReadAccessAware(); 48 52 } -
trunk/Jav_Orient/src/eu/scenari/orient/recordstruct/lib/base/ValueList.java
r19672 r19680 252 252 } 253 253 254 public boolean isConcurrentReadAccessAware() { 255 return false; 256 } 257 254 258 @Override 255 259 public void onPersist(PersistStep pStep, IRecordStruct<?> pRecord, boolean pRemovedValue) { -
trunk/Jav_Orient/src/eu/scenari/orient/recordstruct/lib/tree/ITreeStorageConfig.java
r19672 r19680 60 60 61 61 /** 62 * Is tree is accessed by multi-thread. 63 */ 64 public boolean isTreeThreadSafe(); 65 66 /** 62 67 * The maximum number of entries a rake should contain. 63 68 */ -
trunk/Jav_Orient/src/eu/scenari/orient/recordstruct/lib/tree/TreeStorageConfig.java
r19672 r19680 54 54 //protected boolean fAverageCapacityStored = false; 55 55 56 protected boolean fTreeThreadSafe; 57 56 58 protected int fRakeCapacity = 64; 57 59 … … 82 84 public boolean isAverageCapacityStored() { 83 85 return false; 86 } 87 88 public boolean isTreeThreadSafe() { 89 return fTreeThreadSafe; 84 90 } 85 91 … … 133 139 // } 134 140 141 public <RET extends TreeStorageConfig> RET setTreeThreadSafe(boolean pTreeThreadSafe) { 142 fTreeThreadSafe = pTreeThreadSafe; 143 return (RET) this; 144 } 145 135 146 public <RET extends TreeStorageConfig> RET setRakeCapacity(int pRakeCapacity) { 136 147 fRakeCapacity = pRakeCapacity; -
trunk/Jav_Orient/src/eu/scenari/orient/recordstruct/lib/tree/ValueTree.java
r19678 r19680 58 58 import eu.scenari.orient.recordstruct.types.TypesBase; 59 59 import eu.scenari.orient.recordstruct.value.ValueUpdatableAbstract; 60 import eu.scenari.orient.tree.impl.Tree; 60 import eu.scenari.orient.tree.impl.RSTree; 61 import eu.scenari.orient.tree.impl.RSTreeConcurrent; 61 62 import eu.scenari.orient.tree.provider.ITreeNodeProvider; 62 63 import eu.scenari.orient.tree.provider.ITreeProvider; … … 70 71 protected StructTree fStruct; 71 72 72 protected Tree fPojo;73 protected RSTree fPojo; 73 74 74 75 protected ValueRID fRootEntry; 75 76 76 77 protected int fSize; 78 79 protected boolean fConcurrReadAccesAware; 77 80 78 81 protected ArrayList<IRecordStruct<?>> fNodesToSave; … … 85 88 fRootEntry = new ValueRID(); 86 89 fSize = 0; 87 fPojo = new Tree(this, getTreeStorageConfig().getKeyComparator(), getTreeStorageConfig().getBalancingLayout()); 90 if (getTreeStorageConfig().isTreeThreadSafe()) { 91 fPojo = new RSTreeConcurrent(this, getTreeStorageConfig().getKeyComparator(), getTreeStorageConfig().getBalancingLayout(), 5000); 92 } else { 93 fPojo = new RSTree(this, getTreeStorageConfig().getKeyComparator(), getTreeStorageConfig().getBalancingLayout()); 94 } 88 95 } 89 96 … … 94 101 fSize = pReader.getAsInteger(); 95 102 if (!getTreeStorageConfig().isSizeStored()) fSize = SIZE_UNKNOWN; 96 fPojo = new Tree(this, getTreeStorageConfig().getKeyComparator(), getTreeStorageConfig().getBalancingLayout());103 fPojo = new RSTree(this, getTreeStorageConfig().getKeyComparator(), getTreeStorageConfig().getBalancingLayout()); 97 104 } 98 105 … … 106 113 107 114 // ############# 115 116 public void setConcurrReadAccess(boolean pMultithreadContext) { 117 fConcurrReadAccesAware = pMultithreadContext; 118 } 108 119 109 120 public int getSize() { -
trunk/Jav_Orient/src/eu/scenari/orient/recordstruct/lib/tree/ValueTreeNode.java
r19678 r19680 70 70 71 71 public int getSize() { 72 if (fTree.fConcurrReadAccesAware && !fKeys.isConcurrentReadAccessAware()) { 73 synchronized (fKeys) { 74 return fKeys.size(); 75 } 76 } 72 77 return fKeys.size(); 73 78 } … … 75 80 public K getKey(int pOffset) { 76 81 assert (pOffset >= 0 && pOffset < getSize()) : "Out of bounds: " + pOffset + "/" + getSize(); 82 if (fTree.fConcurrReadAccesAware && !fKeys.isConcurrentReadAccessAware()) { 83 synchronized (fKeys) { 84 return fKeys.get(pOffset); 85 } 86 } 77 87 return fKeys.get(pOffset); 78 88 } -
trunk/Jav_Orient/src/eu/scenari/orient/recordstruct/lib/tree/ValueTreeRake.java
r19678 r19680 148 148 149 149 public ITreeNodeProvider<K, V> loadNode(int pOffset) { 150 ValueTreeNode<?, K, V> vNode = getDb().loadValue(fSubNodes.get(pOffset)); 150 ORID vId; 151 if (fTree.fConcurrReadAccesAware && !fSubNodes.isConcurrentReadAccessAware()) { 152 synchronized (fSubNodes) { 153 vId = fSubNodes.get(pOffset); 154 } 155 } else { 156 vId = fSubNodes.get(pOffset); 157 } 158 ValueTreeNode<?, K, V> vNode = getDb().loadValue(vId); 151 159 vNode.initNode(fTree); 152 160 return vNode; -
trunk/Jav_Orient/src/eu/scenari/orient/recordstruct/lib/tree/ValueTreeSlotKV.java
r19678 r19680 142 142 143 143 public V getValue(int pOffset) { 144 if (fTree.fConcurrReadAccesAware && !fValues.isConcurrentReadAccessAware()) { 145 synchronized (fValues) { 146 return fValues.get(pOffset); 147 } 148 } 144 149 return fValues.get(pOffset); 145 150 } -
trunk/Jav_Orient/src/eu/scenari/orient/recordstruct/value/ValueListImmutableFixed.java
r19678 r19680 383 383 } 384 384 385 public boolean isConcurrentReadAccessAware() { 386 return true; 387 } 388 385 389 //############# 386 390 -
trunk/Jav_Orient/src/eu/scenari/orient/tree/impl/BalancedLayout.java
r19678 r19680 22 22 protected float fTargetFillRateForNewRightNode = 0.5f; 23 23 24 protected class GcVisitor implements IRSTreeNodeVisitor { 25 26 protected int fCount = 0; 27 28 protected int fLimit = 0; 29 30 public GcVisitor(int pLimit) { 31 super(); 32 fLimit = pLimit; 33 } 34 35 public <K, V> Result visitNode(RSTreeNode<K, V> pNode) { 36 if (fLimit < fCount) { 37 if (pNode.getParent() != null) pNode.getParent().removeChildFromMemory(pNode); 38 return Result.skipChildren; 39 } else { 40 fCount++; 41 } 42 return Result.gotoNext; 43 } 44 45 } 46 24 47 public BalancedLayout() { 25 48 super(); … … 36 59 * @param pOffset replace position (if>=0) or insert position if negative value. 37 60 */ 38 public <K, V> void addSpaceAndPut( TreeSlot<K, V> pSlot, int pOffset, K pKey, V pValue) {39 Tree<K, V> vTree = pSlot.fTree;40 TreeSlot<K, V> vSlot = pSlot;61 public <K, V> void addSpaceAndPut(RSTreeSlot<K, V> pSlot, int pOffset, K pKey, V pValue) { 62 RSTree<K, V> vTree = pSlot.fTree; 63 RSTreeSlot<K, V> vSlot = pSlot; 41 64 ITreeSlotProvider<K, V> vSlotProvider = vSlot.getProvider(); 42 65 int vCurrentOffset = pOffset; 43 66 if (fFillingThreshold > 0) { 44 67 //First step : try to move entries in right slot. 45 TreeSlot<K, V> vRightSlot = vSlot.findRightSlot();68 RSTreeSlot<K, V> vRightSlot = vSlot.findRightSlot(); 46 69 if (vRightSlot != null && vRightSlot.getProvider().getFillRate() < fFillingThreshold) { 47 70 int vMoved = vRightSlot.adoptEntriesFromLeft(vSlot, (vRightSlot.getProvider().getFillRate() + vSlotProvider.getFillRate()) / 2); … … 69 92 //Second step : try to move entries in left slot if current slot has not change. 70 93 if (vSlot == pSlot) { 71 TreeSlot<K, V> vLeftSlot = vSlot.findLeftSlot();94 RSTreeSlot<K, V> vLeftSlot = vSlot.findLeftSlot(); 72 95 if (vLeftSlot != null && vLeftSlot.getProvider().getFillRate() < fFillingThreshold) { 73 96 ITreeSlotProvider<K, V> vLeftSlotProvider = vLeftSlot.getProvider(); … … 100 123 101 124 //Third step : need to insert new slot. 102 TreeSlot<K, V> vNewSlot;125 RSTreeSlot<K, V> vNewSlot; 103 126 if (vSlot.fParent == null) { 104 127 vTree.createRakeAsRoot(vSlot); 105 TreeRake<K, V> vParent = (TreeRake) vTree.fRoot;128 RSTreeRake<K, V> vParent = (RSTreeRake) vTree.fRoot; 106 129 vNewSlot = vParent.insertNewSlot(1); 107 130 } else { … … 146 169 } 147 170 148 public <K, V> void onRemovedEntry( TreeNode<K, V> pNode) {171 public <K, V> void onRemovedEntry(RSTreeNode<K, V> pNode) { 149 172 if (pNode.fParent != null && pNode.fProvider.getFillRate() < fOptimizeThreshold) { 150 173 //pNode become too empty, try to merge with a neighbour 151 174 if (pNode.isRake()) { 152 tryToDeleteRake(( TreeRake<K, V>) pNode);175 tryToDeleteRake((RSTreeRake<K, V>) pNode); 153 176 } else { 154 tryToDeleteSlot((TreeSlot<K, V>) pNode); 155 } 156 } 157 } 158 159 public <K, V> void onNewRoot(TreeNode<K, V> pNode) { 160 161 } 162 163 protected <K, V> void tryToDeleteSlot(TreeSlot<K, V> pNode) { 164 TreeSlot<K, V> vLeftNode = pNode.findLeftSlot(); 177 tryToDeleteSlot((RSTreeSlot<K, V>) pNode); 178 } 179 } 180 } 181 182 public <K, V> void freeMemory(RSTreeNode<K, V> pRoot, float pRate) { 183 int vCountNodes = pRoot.countNodesInMemory(); 184 int vLimit = vCountNodes / 2; 185 pRoot.accept(new GcVisitor(vLimit), true); 186 } 187 188 protected <K, V> void tryToDeleteSlot(RSTreeSlot<K, V> pNode) { 189 RSTreeSlot<K, V> vLeftNode = pNode.findLeftSlot(); 165 190 if (vLeftNode != null && vLeftNode.getProvider().getFillRate() < fFillingThreshold) { 166 191 //Try to merge … … 170 195 } 171 196 } 172 TreeSlot<K, V> vRightNode = pNode.findRightSlot();197 RSTreeSlot<K, V> vRightNode = pNode.findRightSlot(); 173 198 if (vRightNode != null && vRightNode.getProvider().getFillRate() < fFillingThreshold) { 174 199 //Try to merge … … 180 205 } 181 206 182 protected <K, V> void tryToDeleteRake( TreeRake<K, V> pNode) {183 TreeNode<K, V> vLeftNode = pNode.fParent.findLeftCousin(pNode.getOffsetInParent());207 protected <K, V> void tryToDeleteRake(RSTreeRake<K, V> pNode) { 208 RSTreeNode<K, V> vLeftNode = pNode.fParent.findLeftCousin(pNode.getOffsetInParent()); 184 209 if (vLeftNode != null && vLeftNode.getProvider().getFillRate() < fFillingThreshold && vLeftNode.isRake()) { 185 210 //Try to merge … … 189 214 } 190 215 } 191 TreeNode<K, V> vRightNode = pNode.fParent.findRightCousin(pNode.getOffsetInParent());216 RSTreeNode<K, V> vRightNode = pNode.fParent.findRightCousin(pNode.getOffsetInParent()); 192 217 if (vRightNode != null && vRightNode.getProvider().getFillRate() < fFillingThreshold && vRightNode.isRake()) { 193 218 //Try to merge … … 199 224 } 200 225 201 protected <K, V> int getDepthRake(Tree<K, V> pTree) { 202 return pTree.fRoot.getDepthRake(); 203 } 204 205 protected <K, V> TreeRake<K, V> splitRakeAndInsertNewRake(TreeRake<K, V> pRakeToSplit, int pInsertPoint) { 206 Tree<K, V> vTree = pRakeToSplit.fTree; 207 TreeRake<K, V> vRake = pRakeToSplit; 226 protected <K, V> RSTreeRake<K, V> splitRakeAndInsertNewRake(RSTreeRake<K, V> pRakeToSplit, int pInsertPoint) { 227 RSTree<K, V> vTree = pRakeToSplit.fTree; 228 RSTreeRake<K, V> vRake = pRakeToSplit; 208 229 ITreeRakeProvider<K, V> vRakeProvider = vRake.getProvider(); 209 230 int vInsertPoint = pInsertPoint; 210 231 if (fFillingThreshold > 0) { 211 232 //First step : try to move entries in right cousin rake. 212 TreeNode<K, V> vCousin = vRake.findRightCousin(vInsertPoint);233 RSTreeNode<K, V> vCousin = vRake.findRightCousin(vInsertPoint); 213 234 if (vCousin != null && vCousin.isRake() && vCousin.getProvider().getFillRate() < fFillingThreshold) { 214 TreeRake<K, V> vRightRake = (TreeRake) vCousin;235 RSTreeRake<K, V> vRightRake = (RSTreeRake) vCousin; 215 236 int vMoved = vRightRake.adoptEntriesFromLeft(vRake, (vRightRake.getProvider().getFillRate() + vRakeProvider.getFillRate()) / 2); 216 237 if (vMoved > 0) { … … 222 243 vRake = vRightRake; 223 244 } 224 TreeRake<K, V> vNewRake = vRake.insertNewRake(vInsertPoint);245 RSTreeRake<K, V> vNewRake = vRake.insertNewRake(vInsertPoint); 225 246 if (vNewRake != null) return vNewRake; 226 247 } … … 230 251 vCousin = vRake.findLeftCousin(vInsertPoint); 231 252 if (vCousin != null && vCousin.isRake() && vCousin.getProvider().getFillRate() < fFillingThreshold) { 232 TreeRake<K, V> vLeftRake = (TreeRake) vCousin;253 RSTreeRake<K, V> vLeftRake = (RSTreeRake) vCousin; 233 254 ITreeRakeProvider<K, V> vLeftProvider = vLeftRake.getProvider(); 234 255 int vMoved = vLeftRake.adoptEntriesFromRight(vRake, (vLeftProvider.getFillRate() + vRakeProvider.getFillRate()) / 2); … … 242 263 vRake = vLeftRake; 243 264 } 244 TreeRake<K, V> vNewRake = vRake.insertNewRake(vInsertPoint);265 RSTreeRake<K, V> vNewRake = vRake.insertNewRake(vInsertPoint); 245 266 if (vNewRake != null) return vNewRake; 246 267 } … … 250 271 251 272 //Third step : need to insert new rake in parent context. 252 TreeRake<K, V> vNewRake;273 RSTreeRake<K, V> vNewRake; 253 274 if (vRake.fParent == null) { 254 275 vTree.createRakeAsRoot(vRake); 255 TreeRake<K, V> vParent = (TreeRake) vTree.fRoot;276 RSTreeRake<K, V> vParent = (RSTreeRake) vTree.fRoot; 256 277 vNewRake = vParent.insertNewRake(1); 257 278 } else { … … 283 304 } 284 305 285 protected <K, V> TreeSlot<K, V> splitRakeAndInsertNewSlot(TreeRake<K, V> pRakeToSplit, int pInsertPoint) {286 Tree<K, V> vTree = pRakeToSplit.fTree;287 TreeRake<K, V> vRake = pRakeToSplit;306 protected <K, V> RSTreeSlot<K, V> splitRakeAndInsertNewSlot(RSTreeRake<K, V> pRakeToSplit, int pInsertPoint) { 307 RSTree<K, V> vTree = pRakeToSplit.fTree; 308 RSTreeRake<K, V> vRake = pRakeToSplit; 288 309 ITreeRakeProvider<K, V> vRakeProvider = vRake.getProvider(); 289 310 int vInsertPoint = pInsertPoint; 290 311 if (fFillingThreshold > 0) { 291 312 //First step : try to move entries in right cousin rake. 292 TreeNode<K, V> vCousin = vRake.findRightCousin(vInsertPoint);313 RSTreeNode<K, V> vCousin = vRake.findRightCousin(vInsertPoint); 293 314 if (vCousin != null && vCousin.isRake() && vCousin.getProvider().getFillRate() < fFillingThreshold) { 294 TreeRake<K, V> vRightRake = (TreeRake) vCousin;315 RSTreeRake<K, V> vRightRake = (RSTreeRake) vCousin; 295 316 int vMoved = vRightRake.adoptEntriesFromLeft(vRake, (vRightRake.getProvider().getFillRate() + vRakeProvider.getFillRate()) / 2); 296 317 if (vMoved > 0) { … … 302 323 vRake = vRightRake; 303 324 } 304 TreeSlot<K, V> vNewSlot = vRake.insertNewSlot(vInsertPoint);325 RSTreeSlot<K, V> vNewSlot = vRake.insertNewSlot(vInsertPoint); 305 326 if (vNewSlot != null) return vNewSlot; 306 327 } … … 310 331 vCousin = vRake.findLeftCousin(vInsertPoint); 311 332 if (vCousin != null && vCousin.isRake() && vCousin.getProvider().getFillRate() < fFillingThreshold) { 312 TreeRake<K, V> vLeftRake = (TreeRake) vCousin;333 RSTreeRake<K, V> vLeftRake = (RSTreeRake) vCousin; 313 334 ITreeRakeProvider<K, V> vLeftProvider = vLeftRake.getProvider(); 314 335 int vMoved = vLeftRake.adoptEntriesFromRight(vRake, (vLeftProvider.getFillRate() + vRakeProvider.getFillRate()) / 2); … … 322 343 vRake = vLeftRake; 323 344 } 324 TreeSlot<K, V> vNewSlot = vRake.insertNewSlot(vInsertPoint);345 RSTreeSlot<K, V> vNewSlot = vRake.insertNewSlot(vInsertPoint); 325 346 if (vNewSlot != null) return vNewSlot; 326 347 } … … 330 351 331 352 //Third step : need to insert new rake in parent context. 332 TreeRake<K, V> vNewRake;353 RSTreeRake<K, V> vNewRake; 333 354 if (vRake.fParent == null) { 334 355 vTree.createRakeAsRoot(vRake); 335 TreeRake<K, V> vParent = (TreeRake) vTree.fRoot;356 RSTreeRake<K, V> vParent = (RSTreeRake) vTree.fRoot; 336 357 vNewRake = vParent.insertNewRake(1); 337 358 } else { -
trunk/Jav_Orient/src/eu/scenari/orient/tree/impl/IBalancingLayout.java
r19675 r19680 8 8 9 9 /** Call on a put if the target slot is full. */ 10 public <K, V> void addSpaceAndPut( TreeSlot<K, V> pSlot, int pOffset, K pKey, V pValue);10 public <K, V> void addSpaceAndPut(RSTreeSlot<K, V> pSlot, int pOffset, K pKey, V pValue); 11 11 12 12 /** Call when an entry is removed from a node. */ 13 public <K, V> void onRemovedEntry( TreeNode<K, V> pNode);13 public <K, V> void onRemovedEntry(RSTreeNode<K, V> pNode); 14 14 15 /** Call when the root is changed. */ 16 public <K, V> void onNewRoot(TreeNode<K, V> pNode); 15 /** 16 * Free memory. 17 * 18 * @param pRate Example : 0.5 try to divide by 2 the memory used by this tree. 19 **/ 20 public <K, V> void freeMemory(RSTreeNode<K, V> pRoot, float pRate); 17 21 } -
trunk/Jav_Orient/src/eu/scenari/orient/tree/impl/RSTree.java
r19678 r19680 53 53 import eu.scenari.orient.tree.provider.ITreeSlotProvider; 54 54 55 public class Tree<K, V> extends AbstractMap<K, V> {55 public class RSTree<K, V> extends AbstractMap<K, V> { 56 56 57 57 protected static final Comparator DEFAULT_COMPARARTOR = new Comparator() { … … 65 65 protected ITreeProvider<K, V> fProvider; 66 66 67 protected TreeNode<K, V> fRoot;67 protected RSTreeNode<K, V> fRoot; 68 68 69 69 protected EntrySet fEntrySet; … … 85 85 protected abstract class IteratorBase<T> implements Iterator<T> { 86 86 87 protected TreeSlot<K, V> fSlot;87 protected RSTreeSlot<K, V> fSlot; 88 88 89 89 protected int fOffset = -1; … … 92 92 93 93 public IteratorBase() { 94 fExpectedModCount = Tree.this.fModCount;95 fSlot = Tree.this.findFirstSlot();94 fExpectedModCount = RSTree.this.fModCount; 95 fSlot = RSTree.this.findFirstSlot(); 96 96 } 97 97 … … 109 109 protected void check() { 110 110 if (fSlot == null) throw new NoSuchElementException(); 111 if ( Tree.this.fModCount != fExpectedModCount) throw new ConcurrentModificationException();111 if (RSTree.this.fModCount != fExpectedModCount) throw new ConcurrentModificationException(); 112 112 } 113 113 … … 142 142 } 143 143 144 protected class IteratorKey extends IteratorBase<K> {145 public K next() {146 check();147 return fSlot.getProvider().getKey(fOffset);148 }149 }150 151 protected class IteratorValue extends IteratorBase<V> {152 public V next() {153 check();154 return fSlot.getProvider().getValue(fOffset);155 }156 }144 // protected class IteratorKey extends IteratorBase<K> { 145 // public K next() { 146 // check(); 147 // return fSlot.getProvider().getKey(fOffset); 148 // } 149 // } 150 // 151 // protected class IteratorValue extends IteratorBase<V> { 152 // public V next() { 153 // check(); 154 // return fSlot.getProvider().getValue(fOffset); 155 // } 156 // } 157 157 158 158 /** … … 180 180 @Override 181 181 public int size() { 182 return Tree.this.size();182 return RSTree.this.size(); 183 183 } 184 184 185 185 @Override 186 186 public void clear() { 187 Tree.this.clear();188 } 189 } 190 191 public Tree(ITreeProvider<K, V> pProvider) {187 RSTree.this.clear(); 188 } 189 } 190 191 public RSTree(ITreeProvider<K, V> pProvider) { 192 192 this(pProvider, null, null); 193 193 } 194 194 195 public Tree(ITreeProvider<K, V> pProvider, Comparator<? super K> pComparator, IBalancingLayout pBalancingLayout) {195 public RSTree(ITreeProvider<K, V> pProvider, Comparator<? super K> pComparator, IBalancingLayout pBalancingLayout) { 196 196 super(); 197 197 fProvider = pProvider; 198 fProvider.setConcurrReadAccess(isThreadSafe()); 198 199 fComparator = pComparator != null ? pComparator : DEFAULT_COMPARARTOR; 199 200 fBalancingLayout = pBalancingLayout != null ? pBalancingLayout : new BalancedLayout(); … … 205 206 } 206 207 207 public Comparator<? super K> comparator() {208 public Comparator<? super K> getComparator() { 208 209 return fComparator; 210 } 211 212 public boolean isThreadSafe() { 213 return false; 209 214 } 210 215 … … 214 219 //Size unknown, we compute size. 215 220 vSize = 0; 216 for ( TreeSlot<K, V> vSlot = findFirstSlot(); vSlot != null; vSlot = vSlot.findRightSlot()) {221 for (RSTreeSlot<K, V> vSlot = findFirstSlot(); vSlot != null; vSlot = vSlot.findRightSlot()) { 217 222 vSize += vSlot.getSize(); 218 223 } … … 227 232 if (vSize == 0) return true; 228 233 //Size unknown 229 TreeSlot<K, V> vSlot = findFirstSlot();234 RSTreeSlot<K, V> vSlot = findFirstSlot(); 230 235 while (vSlot != null && vSlot.getSize() == 0) { 231 236 vSlot = vSlot.findRightSlot(); … … 235 240 236 241 public Set<Entry<K, V>> entrySet() { 237 finalEntrySet vResult = fEntrySet;242 EntrySet vResult = fEntrySet; 238 243 return (vResult != null) ? vResult : (fEntrySet = new EntrySet()); 239 244 } 240 245 241 246 public V get(Object pKey) { 242 TreeSlot<K, V> vSlot = fRoot.findSlot(pKey);247 RSTreeSlot<K, V> vSlot = fRoot.findSlot(pKey); 243 248 return vSlot != null ? vSlot.get(pKey) : null; 244 249 } 245 250 246 251 public boolean containsKey(Object pKey) { 247 TreeSlot<K, V> vSlot = fRoot.findSlot(pKey);252 RSTreeSlot<K, V> vSlot = fRoot.findSlot(pKey); 248 253 return vSlot != null ? vSlot.indexOf(pKey) >= 0 : false; 249 254 } 250 255 251 256 public V put(K pKey, V pValue) { 252 TreeSlot<K, V> vSlot = fRoot.findSlot(pKey);257 RSTreeSlot<K, V> vSlot = fRoot.findSlot(pKey); 253 258 if (vSlot == null) vSlot = fRoot.findFirstSlot(); 254 259 ITreeSlotProvider<K, V> vSlotProvider = vSlot.getProvider(); … … 273 278 274 279 public V remove(Object pKey) { 275 TreeSlot<K, V> vSlot = fRoot.findSlot(pKey);280 RSTreeSlot<K, V> vSlot = fRoot.findSlot(pKey); 276 281 if (vSlot == null) return null; 277 282 int vOffset = vSlot.indexOf(pKey); … … 284 289 } 285 290 286 protected TreeSlot<K, V> findFirstSlot() {291 protected RSTreeSlot<K, V> findFirstSlot() { 287 292 return fRoot.findFirstSlot(); 288 293 } 289 294 290 protected TreeSlot<K, V> findSlot(Object pKey) {295 protected RSTreeSlot<K, V> findSlot(Object pKey) { 291 296 return fRoot.findSlot(pKey); 292 297 } … … 305 310 } 306 311 307 protected void createRakeAsRoot( TreeNode<K, V> pChild) {312 protected void createRakeAsRoot(RSTreeNode<K, V> pChild) { 308 313 ITreeRakeProvider<K, V> vRoot = fProvider.createRakeAsRoot(pChild.getProvider()); 309 fRoot = new TreeRake<K, V>(this, vRoot, pChild);310 pChild.setParent(( TreeRake) fRoot, 0);314 fRoot = new RSTreeRake<K, V>(this, vRoot, pChild); 315 pChild.setParent((RSTreeRake) fRoot, 0); 311 316 } 312 317 313 318 protected void setRootNode(ITreeNodeProvider<K, V> pRootProvider) { 314 319 if (pRootProvider.isRake()) { 315 fRoot = new TreeRake<K, V>(this, (ITreeRakeProvider<K, V>) pRootProvider);320 fRoot = new RSTreeRake<K, V>(this, (ITreeRakeProvider<K, V>) pRootProvider); 316 321 } else { 317 fRoot = new TreeSlot<K, V>(this, (ITreeSlotProvider<K, V>) pRootProvider);318 } 319 } 320 321 protected void setRoot( TreeNode<K, V> pNode) {322 fRoot = new RSTreeSlot<K, V>(this, (ITreeSlotProvider<K, V>) pRootProvider); 323 } 324 } 325 326 protected void setRoot(RSTreeNode<K, V> pNode) { 322 327 fRoot = pNode; 323 328 fProvider.setRoot(pNode.getProvider()); 324 fBalancingLayout.onNewRoot(fRoot);325 329 } 326 330 } -
trunk/Jav_Orient/src/eu/scenari/orient/tree/impl/RSTreeNode.java
r19678 r19680 3 3 import eu.scenari.orient.tree.provider.ITreeNodeProvider; 4 4 5 public abstract class TreeNode<K, V> {5 public abstract class RSTreeNode<K, V> { 6 6 7 protected Tree<K, V> fTree;7 protected final RSTree<K, V> fTree; 8 8 9 protected TreeRake<K, V> fParent;9 protected RSTreeRake<K, V> fParent; 10 10 11 11 protected int fOffsetInParent; … … 13 13 protected ITreeNodeProvider<K, V> fProvider; 14 14 15 public TreeNode(Tree<K, V> pTree, ITreeNodeProvider<K, V> pProvider) {15 public RSTreeNode(RSTree<K, V> pTree, ITreeNodeProvider<K, V> pProvider) { 16 16 fTree = pTree; 17 17 fProvider = pProvider; 18 18 } 19 19 20 public TreeNode(TreeRake<K, V> pParent, int pOffsetInParent, ITreeNodeProvider<K, V> pProvider) {20 public RSTreeNode(RSTreeRake<K, V> pParent, int pOffsetInParent, ITreeNodeProvider<K, V> pProvider) { 21 21 fTree = pParent.getTree(); 22 22 fProvider = pProvider; … … 30 30 } 31 31 32 public Tree<K, V> getTree() {32 public RSTree<K, V> getTree() { 33 33 return fTree; 34 34 } 35 35 36 public TreeRake<K, V> getParent() {36 public RSTreeRake<K, V> getParent() { 37 37 return fParent; 38 38 } … … 46 46 } 47 47 48 public abstract TreeSlot<K, V> findFirstSlot();48 public abstract RSTreeSlot<K, V> findFirstSlot(); 49 49 50 public abstract TreeSlot<K, V> findLastSlot();50 public abstract RSTreeSlot<K, V> findLastSlot(); 51 51 52 public abstract TreeSlot<K, V> findSlot(Object pKey);52 public abstract RSTreeSlot<K, V> findSlot(Object pKey); 53 53 54 public abstract int getDepthRake(); 55 56 public void setParent(TreeRake<K, V> pParent, int pOffsetInParent) { 54 public void setParent(RSTreeRake<K, V> pParent, int pOffsetInParent) { 57 55 fParent = pParent; 58 56 fOffsetInParent = pOffsetInParent; … … 68 66 } 69 67 70 public int adoptEntriesFromLeft( TreeNode<K, V> pLeftNode, float pTargetFillRate) {68 public int adoptEntriesFromLeft(RSTreeNode<K, V> pLeftNode, float pTargetFillRate) { 71 69 ITreeNodeProvider<K, V> vLeftNodeProvider = pLeftNode.getProvider(); 72 70 int vMoved = fProvider.adoptEntriesFromLeft(vLeftNodeProvider, pTargetFillRate); … … 78 76 } 79 77 80 public int adoptEntriesFromRight( TreeNode<K, V> pRightNode, float pTargetFillRate) {78 public int adoptEntriesFromRight(RSTreeNode<K, V> pRightNode, float pTargetFillRate) { 81 79 ITreeNodeProvider<K, V> vRightSlotProvider = pRightNode.getProvider(); 82 80 int vOldSize = getProvider().getSize(); … … 84 82 if (vMoved > 0) { 85 83 //Some entries have been moved. 86 TreeRake<K, V> vParent = pRightNode.getParent();84 RSTreeRake<K, V> vParent = pRightNode.getParent(); 87 85 if (vParent != null) vParent.updateKey(pRightNode.getOffsetInParent(), vRightSlotProvider.getKey(0)); 88 86 if (vOldSize == 0 && fParent != null) fParent.updateKey(fOffsetInParent, getProvider().getKey(0)); … … 91 89 } 92 90 93 public boolean adoptAllEntriesFromLeft( TreeNode<K, V> pLeftNodeToKill) {91 public boolean adoptAllEntriesFromLeft(RSTreeNode<K, V> pLeftNodeToKill) { 94 92 if (fProvider.adoptAllEntriesFromLeft(pLeftNodeToKill.getProvider())) { 95 93 if (fParent != null) fParent.updateKey(fOffsetInParent, getKey(0)); … … 99 97 } 100 98 101 public boolean adoptAllEntriesFromRight( TreeNode<K, V> pRightNodeToKill) {99 public boolean adoptAllEntriesFromRight(RSTreeNode<K, V> pRightNodeToKill) { 102 100 if (fProvider.adoptAllEntriesFromRight(pRightNodeToKill.getProvider())) { 103 101 int vOldSize = getProvider().getSize(); … … 108 106 } 109 107 108 /** 109 * 110 */ 111 public abstract int countNodesInMemory(); 112 113 /** 114 * 115 */ 116 public abstract IRSTreeNodeVisitor.Result accept(IRSTreeNodeVisitor pVisitor, boolean pVisitOnlyInMemoryNodes); 117 110 118 } -
trunk/Jav_Orient/src/eu/scenari/orient/tree/impl/RSTreeRake.java
r19678 r19680 2 2 3 3 import eu.scenari.commons.util.lang.ScException; 4 import eu.scenari.orient.tree.impl.IRSTreeNodeVisitor.Result; 4 5 import eu.scenari.orient.tree.provider.ITreeNodeProvider; 5 6 import eu.scenari.orient.tree.provider.ITreeRakeProvider; 6 7 import eu.scenari.orient.tree.provider.ITreeSlotProvider; 7 8 8 public class TreeRake<K, V> extendsTreeNode<K, V> {9 10 protected TreeNode<K, V>[] fChildren;9 public class RSTreeRake<K, V> extends RSTreeNode<K, V> { 10 11 protected RSTreeNode<K, V>[] fChildren; 11 12 12 13 /** Constructor for root tree node. */ 13 public TreeRake(Tree<K, V> pTree, ITreeRakeProvider<K, V> pProvider) {14 public RSTreeRake(RSTree<K, V> pTree, ITreeRakeProvider<K, V> pProvider) { 14 15 super(pTree, pProvider); 15 16 setup(); … … 17 18 18 19 /** Constructor for root tree node in creation context. */ 19 public TreeRake(Tree<K, V> pTree, ITreeRakeProvider<K, V> pProvider,TreeNode<K, V> pFirstChild) {20 public RSTreeRake(RSTree<K, V> pTree, ITreeRakeProvider<K, V> pProvider, RSTreeNode<K, V> pFirstChild) { 20 21 super(pTree, pProvider); 21 22 setup(); … … 24 25 } 25 26 26 public TreeRake(TreeRake<K, V> pParent, int pOffset, ITreeRakeProvider<K, V> pProvider) {27 public RSTreeRake(RSTreeRake<K, V> pParent, int pOffset, ITreeRakeProvider<K, V> pProvider) { 27 28 super(pParent, pOffset, pProvider); 28 29 setup(); … … 30 31 31 32 protected void setup() { 32 fChildren = new TreeNode[Math.max(fTree.fProvider.getDefaultRakeCapacity(), getProvider().getSize())]; 33 //note : called only from constructor, no lock here. 34 fChildren = new RSTreeNode[Math.max(fTree.fProvider.getDefaultRakeCapacity(), getProvider().getSize())]; 33 35 } 34 36 … … 46 48 * @see #getLastNode() 47 49 */ 48 public TreeNode<K, V> getNode(int pOffset) { 49 assert (pOffset < getProvider().getSize()); 50 TreeNode<K, V> vResult = fChildren[pOffset]; 51 if (vResult == null) { 52 ITreeNodeProvider<K, V> vNode = getProvider().loadNode(pOffset); 53 vResult = createChildNode(vNode, pOffset); 54 fChildren[pOffset] = vResult; 55 } 56 return vResult; 57 } 58 59 /** 60 * Warning : bounds are not checked. 61 * @see #getFirstNode() 62 * @see #getLastNode() 63 */ 64 public TreeNode<K, V> getNodeIfLoaded(int pOffset) { 65 assert (pOffset < getProvider().getSize()); 66 return fChildren[pOffset]; 67 } 68 69 public TreeNode<K, V> getFirstNode() { 50 public RSTreeNode<K, V> getNode(int pOffset) { 51 if (fTree.isThreadSafe()) { 52 synchronized (this) { 53 assert (pOffset < getProvider().getSize()); 54 RSTreeNode<K, V> vResult = fChildren[pOffset]; 55 if (vResult == null) { 56 ITreeNodeProvider<K, V> vNode = getProvider().loadNode(pOffset); 57 vResult = createChildNode(vNode, pOffset); 58 fChildren[pOffset] = vResult; 59 } 60 return vResult; 61 } 62 } else { 63 assert (pOffset < getProvider().getSize()); 64 RSTreeNode<K, V> vResult = fChildren[pOffset]; 65 if (vResult == null) { 66 ITreeNodeProvider<K, V> vNode = getProvider().loadNode(pOffset); 67 vResult = createChildNode(vNode, pOffset); 68 fChildren[pOffset] = vResult; 69 } 70 return vResult; 71 } 72 } 73 74 public RSTreeNode<K, V> getFirstNode() { 70 75 int vSize = getProvider().getSize(); 71 76 return (vSize > 0) ? getNode(0) : null; 72 77 } 73 78 74 public TreeNode<K, V> getLastNode() {79 public RSTreeNode<K, V> getLastNode() { 75 80 int vSize = getProvider().getSize(); 76 81 return (vSize > 0) ? getNode(vSize - 1) : null; 77 82 } 78 83 79 public TreeRake<K, V> insertNewRake(int pOffset) {84 public RSTreeRake<K, V> insertNewRake(int pOffset) { 80 85 int vCurrentSize = getProvider().getSize(); 81 86 assert (pOffset <= vCurrentSize); … … 83 88 if (vNewRake == null) return null; 84 89 ensureSize(vCurrentSize + 1); 85 TreeRake vRake = (TreeRake) createChildNode(vNewRake, pOffset);90 RSTreeRake vRake = (RSTreeRake) createChildNode(vNewRake, pOffset); 86 91 int vCountToMove = vCurrentSize - pOffset - 1; 87 92 if (vCountToMove > 0) { 88 93 //move 94 //note : write access lock is held on tree, no lock here. 89 95 System.arraycopy(fChildren, pOffset, fChildren, pOffset + 1, vCountToMove); 90 96 } … … 93 99 } 94 100 95 public TreeSlot<K, V> insertNewSlot(int pOffset) {101 public RSTreeSlot<K, V> insertNewSlot(int pOffset) { 96 102 int vCurrentSize = getProvider().getSize(); 97 103 assert (pOffset <= getProvider().getSize()); … … 99 105 if (vNewSlot == null) return null; 100 106 ensureSize(vCurrentSize + 1); 101 TreeSlot vNode = (TreeSlot) createChildNode(vNewSlot, pOffset);107 RSTreeSlot vNode = (RSTreeSlot) createChildNode(vNewSlot, pOffset); 102 108 int vCountToMove = vCurrentSize - pOffset - 1; 103 109 if (vCountToMove > 0) { 104 110 //move 111 //note : write access lock is held on tree, no lock here. 105 112 System.arraycopy(fChildren, pOffset, fChildren, pOffset + 1, vCountToMove); 106 113 } … … 109 116 } 110 117 111 public int adoptEntriesFromRight( TreeNode<K, V> pRightNode, float pTargetFillRate) {118 public int adoptEntriesFromRight(RSTreeNode<K, V> pRightNode, float pTargetFillRate) { 112 119 int vMoved = super.adoptEntriesFromRight(pRightNode, pTargetFillRate); 113 120 if (vMoved > 0) { … … 115 122 int vNewSize = getProvider().getSize(); 116 123 ensureSize(vNewSize); 117 TreeRake<K, V> vRight = (TreeRake) pRightNode; 118 TreeNode<K, V>[] vRightChildren = vRight.fChildren; 124 RSTreeRake<K, V> vRight = (RSTreeRake) pRightNode; 125 //note : write access lock is held on tree, no lock here. 126 RSTreeNode<K, V>[] vRightChildren = vRight.fChildren; 119 127 System.arraycopy(vRightChildren, 0, fChildren, vNewSize - vMoved, vMoved); 120 128 System.arraycopy(vRightChildren, vMoved, vRightChildren, 0, vRightChildren.length - vMoved); … … 126 134 } 127 135 128 public int adoptEntriesFromLeft( TreeNode<K, V> pLeftNode, float pTargetFillRate) {136 public int adoptEntriesFromLeft(RSTreeNode<K, V> pLeftNode, float pTargetFillRate) { 129 137 int vMoved = super.adoptEntriesFromLeft(pLeftNode, pTargetFillRate); 130 138 if (vMoved > 0) { … … 132 140 int vNewSize = getProvider().getSize(); 133 141 ensureSize(vNewSize); 134 TreeRake<K, V> vLeft = (TreeRake) pLeftNode; 135 TreeNode<K, V>[] vLeftChildren = vLeft.fChildren; 142 RSTreeRake<K, V> vLeft = (RSTreeRake) pLeftNode; 143 //note : write access lock is held on tree, no lock here. 144 RSTreeNode<K, V>[] vLeftChildren = vLeft.fChildren; 136 145 System.arraycopy(fChildren, 0, fChildren, vMoved, vNewSize - vMoved); 137 146 System.arraycopy(vLeftChildren, vLeft.getProvider().getSize(), fChildren, 0, vMoved); … … 143 152 } 144 153 145 public boolean adoptAllEntriesFromRight( TreeNode<K, V> pRightNodeToKill) {154 public boolean adoptAllEntriesFromRight(RSTreeNode<K, V> pRightNodeToKill) { 146 155 int vOldSize = getProvider().getSize(); 147 156 if (super.adoptAllEntriesFromRight(pRightNodeToKill)) { … … 149 158 int vNewSize = getProvider().getSize(); 150 159 ensureSize(vNewSize); 151 TreeRake<K, V> vRight = (TreeRake) pRightNodeToKill; 152 TreeNode<K, V>[] vRightChildren = vRight.fChildren; 160 RSTreeRake<K, V> vRight = (RSTreeRake) pRightNodeToKill; 161 //note : write access lock is held on tree, no lock here. 162 RSTreeNode<K, V>[] vRightChildren = vRight.fChildren; 153 163 System.arraycopy(vRightChildren, 0, fChildren, vOldSize, vNewSize - vOldSize); 154 164 for (int i = vOldSize; i < vNewSize; i++) { … … 160 170 } 161 171 162 public boolean adoptAllEntriesFromLeft( TreeNode<K, V> pLeftNodeToKill) {172 public boolean adoptAllEntriesFromLeft(RSTreeNode<K, V> pLeftNodeToKill) { 163 173 int vMoved = pLeftNodeToKill.getProvider().getSize(); 164 174 if (super.adoptAllEntriesFromLeft(pLeftNodeToKill)) { … … 166 176 int vNewSize = getProvider().getSize(); 167 177 ensureSize(vNewSize); 168 TreeRake<K, V> vLeft = (TreeRake) pLeftNodeToKill; 169 TreeNode<K, V>[] vLeftChildren = vLeft.fChildren; 178 RSTreeRake<K, V> vLeft = (RSTreeRake) pLeftNodeToKill; 179 //note : write access lock is held on tree, no lock here. 180 RSTreeNode<K, V>[] vLeftChildren = vLeft.fChildren; 170 181 System.arraycopy(fChildren, 0, fChildren, vMoved, vNewSize - vMoved); 171 182 System.arraycopy(vLeftChildren, 0, fChildren, 0, vMoved); … … 178 189 } 179 190 180 public TreeSlot<K, V> findFirstSlot() {191 public RSTreeSlot<K, V> findFirstSlot() { 181 192 return getNode(0).findFirstSlot(); 182 193 } 183 194 184 public TreeSlot<K, V> findLastSlot() {195 public RSTreeSlot<K, V> findLastSlot() { 185 196 return getNode(fProvider.getSize() - 1).findLastSlot(); 186 197 } 187 198 188 public TreeSlot<K, V> findSlot(Object pKey) {199 public RSTreeSlot<K, V> findSlot(Object pKey) { 189 200 int vLast = -1; 190 201 int vLow = 0; … … 207 218 } 208 219 209 public TreeSlot<K, V> findRightSlot(int pFrom) {220 public RSTreeSlot<K, V> findRightSlot(int pFrom) { 210 221 if (pFrom < getProvider().getSize() - 1) return getNode(pFrom + 1).findFirstSlot(); 211 222 return fParent != null ? fParent.findRightSlot(fOffsetInParent) : null; 212 223 } 213 224 214 public TreeSlot<K, V> findLeftSlot(int pFrom) {225 public RSTreeSlot<K, V> findLeftSlot(int pFrom) { 215 226 if (pFrom > 0) return getNode(pFrom - 1).findLastSlot(); 216 227 return fParent != null ? fParent.findLeftSlot(fOffsetInParent) : null; … … 218 229 219 230 /** Find the right next node (slot or rake) with the same level. */ 220 public TreeNode<K, V> findRightCousin(int pFrom) {231 public RSTreeNode<K, V> findRightCousin(int pFrom) { 221 232 if (pFrom < getProvider().getSize() - 1) return getNode(pFrom + 1); 222 233 if (fParent == null) return null; 223 TreeNode<K, V> vParentCousin = fParent.findRightCousin(fOffsetInParent);224 return vParentCousin != null && vParentCousin.isRake() ? (( TreeRake) vParentCousin).getFirstNode() : null;234 RSTreeNode<K, V> vParentCousin = fParent.findRightCousin(fOffsetInParent); 235 return vParentCousin != null && vParentCousin.isRake() ? ((RSTreeRake) vParentCousin).getFirstNode() : null; 225 236 } 226 237 227 238 /** Find the left previous node (slot or rake) with the same level. */ 228 public TreeNode<K, V> findLeftCousin(int pFrom) {239 public RSTreeNode<K, V> findLeftCousin(int pFrom) { 229 240 if (pFrom > 0) return getNode(pFrom - 1); 230 241 if (fParent == null) return null; 231 TreeNode<K, V> vParentCousin = fParent.findLeftCousin(fOffsetInParent); 232 return vParentCousin != null && vParentCousin.isRake() ? ((TreeRake) vParentCousin).getLastNode() : null; 233 } 234 235 public int getDepthRake() { 236 return 1 + findAnyLoadedEntry().getDepthRake(); 237 } 238 239 protected TreeNode<K, V> findAnyLoadedEntry() { 240 for (TreeNode<K, V> vEntry : fChildren) { 241 if (vEntry != null) return vEntry; 242 } 243 return getNode(0); 242 RSTreeNode<K, V> vParentCousin = fParent.findLeftCousin(fOffsetInParent); 243 return vParentCousin != null && vParentCousin.isRake() ? ((RSTreeRake) vParentCousin).getLastNode() : null; 244 244 } 245 245 … … 255 255 } 256 256 257 public void removeChildNode( TreeNode pEntry) {257 public void removeChildNode(RSTreeNode pEntry) { 258 258 assert (pEntry.fParent == this); 259 259 int vOldSize = fProvider.getSize(); … … 265 265 } else { 266 266 // We are the root, no more entries, we ref the last empty slot as root. 267 TreeSlot<K, V> vSlot = pEntry.findFirstSlot();267 RSTreeSlot<K, V> vSlot = pEntry.findFirstSlot(); 268 268 vSlot.setParent(null, 0); 269 vSlot.clear ();269 vSlot.clearChildren(); 270 270 fTree.setRoot(vSlot); 271 271 } … … 274 274 int vOffsetEntry = pEntry.getOffsetInParent(); 275 275 assert (vOffsetEntry < vOldSize); 276 //note : write access lock is held on tree, no lock here. 276 277 for (int i = vOffsetEntry; i < vOldSize - 1; i++) { 277 TreeNode<K, V> vNext = fChildren[i + 1];278 RSTreeNode<K, V> vNext = fChildren[i + 1]; 278 279 fChildren[i] = vNext; 279 280 vNext.setParent(this, i); … … 290 291 } 291 292 292 protected TreeNode<K, V> createChildNode(ITreeNodeProvider<K, V> pNode, int pOffset) { 293 public int countNodesInMemory() { 294 int vCount = 1; 295 synchronized (this) { 296 for (int i = 0; i < fChildren.length; i++) { 297 if (fChildren[i] != null) { 298 vCount += fChildren[i].countNodesInMemory(); 299 } 300 } 301 } 302 return vCount; 303 } 304 305 public Result accept(IRSTreeNodeVisitor pVisitor, boolean pVisitOnlyInMemoryNodes) { 306 IRSTreeNodeVisitor.Result vResult = pVisitor.visitNode(this); 307 if (vResult == Result.gotoNext) { 308 if (pVisitOnlyInMemoryNodes) { 309 synchronized (this) { 310 for (int i = 0; i < fChildren.length; i++) { 311 if (fChildren[i] != null) { 312 if (fChildren[i].accept(pVisitor, pVisitOnlyInMemoryNodes) == Result.stopVisiting) return Result.stopVisiting; 313 } 314 } 315 } 316 } else { 317 for (int i = 0, s = fProvider.getSize(); i < s; i++) { 318 if (getNode(i).accept(pVisitor, pVisitOnlyInMemoryNodes) == Result.stopVisiting) return Result.stopVisiting; 319 if (fTree.isThreadSafe() && ((RSTreeConcurrent) fTree).fNeedGC) { 320 ((RSTreeConcurrent) fTree).freeMemory(); 321 } 322 } 323 } 324 } 325 return vResult.returnResult(); 326 } 327 328 public void removeChildFromMemory(RSTreeNode<K, V> pNode) { 329 synchronized (this) { 330 fChildren[pNode.fOffsetInParent] = null; 331 pNode.setParent(null, 0); 332 } 333 } 334 335 protected RSTreeNode<K, V> createChildNode(ITreeNodeProvider<K, V> pNode, int pOffset) { 293 336 if (pNode.isRake()) { 294 return new TreeRake<K, V>(this, pOffset, (ITreeRakeProvider<K, V>) pNode);337 return new RSTreeRake<K, V>(this, pOffset, (ITreeRakeProvider<K, V>) pNode); 295 338 } else { 296 return new TreeSlot<K, V>(this, pOffset, (ITreeSlotProvider<K, V>) pNode);339 return new RSTreeSlot<K, V>(this, pOffset, (ITreeSlotProvider<K, V>) pNode); 297 340 } 298 341 } 299 342 300 343 protected void ensureSize(int pTargetSize) { 344 //note : write access lock is held on tree, no lock here. 301 345 if (fChildren.length < pTargetSize) { 302 TreeNode<K, V>[] vNew = newTreeNode[pTargetSize + 10];346 RSTreeNode<K, V>[] vNew = new RSTreeNode[pTargetSize + 10]; 303 347 System.arraycopy(fChildren, 0, vNew, 0, fChildren.length); 304 348 fChildren = vNew; -
trunk/Jav_Orient/src/eu/scenari/orient/tree/impl/RSTreeSlot.java
r19678 r19680 1 1 package eu.scenari.orient.tree.impl; 2 2 3 import eu.scenari.orient.tree.impl.IRSTreeNodeVisitor.Result; 3 4 import eu.scenari.orient.tree.provider.ITreeSlotProvider; 4 5 5 public class TreeSlot<K, V> extendsTreeNode<K, V> {6 public class RSTreeSlot<K, V> extends RSTreeNode<K, V> { 6 7 7 public TreeSlot(Tree<K, V> pTree, ITreeSlotProvider<K, V> pProvider) {8 public RSTreeSlot(RSTree<K, V> pTree, ITreeSlotProvider<K, V> pProvider) { 8 9 super(pTree, pProvider); 9 10 } 10 11 11 public TreeSlot(TreeRake<K, V> pParent, int pOffset, ITreeSlotProvider<K, V> pProvider) {12 public RSTreeSlot(RSTreeRake<K, V> pParent, int pOffset, ITreeSlotProvider<K, V> pProvider) { 12 13 super(pParent, pOffset, pProvider); 13 14 } … … 66 67 } 67 68 68 public TreeSlot<K, V> findFirstSlot() {69 public RSTreeSlot<K, V> findFirstSlot() { 69 70 return this; 70 71 } 71 72 72 public TreeSlot<K, V> findLastSlot() {73 public RSTreeSlot<K, V> findLastSlot() { 73 74 return this; 74 75 } 75 76 76 public TreeSlot<K, V> findSlot(Object pKey) {77 public RSTreeSlot<K, V> findSlot(Object pKey) { 77 78 return this; 78 79 } 79 80 80 public TreeSlot<K, V> findRightSlot() {81 public RSTreeSlot<K, V> findRightSlot() { 81 82 if (fParent == null) return null; 82 83 return fParent.findRightSlot(fOffsetInParent); 83 84 } 84 85 85 public TreeSlot<K, V> findLeftSlot() {86 public RSTreeSlot<K, V> findLeftSlot() { 86 87 if (fParent == null) return null; 87 88 return fParent.findLeftSlot(fOffsetInParent); 88 }89 90 public int getDepthRake() {91 return 0;92 89 } 93 90 … … 107 104 108 105 /** Called when this is last slot and setted on tree root. */ 109 public void clear () {106 public void clearChildren() { 110 107 for (int i = getSize() - 1; i >= 0; i--) { 111 108 fProvider.remove(i); … … 135 132 } 136 133 134 public int countNodesInMemory() { 135 return 1; 136 } 137 138 public Result accept(IRSTreeNodeVisitor pVisitor, boolean pVisitOnlyInMemoryNodes) { 139 return pVisitor.visitNode(this).returnResult(); 140 } 137 141 } -
trunk/Jav_Orient/src/eu/scenari/orient/tree/provider/ITreeNodeProvider.java
r19672 r19680 6 6 public boolean isRake(); 7 7 8 /** Count entries. */ 8 /** 9 * Count entries in this node. 10 * 11 * <p>Warning : this method <b>must</b> be aware of {@link ITreeProvider#setConcurrReadAccess(boolean)} 12 * parameter.</p> 13 **/ 9 14 public int getSize(); 10 15 11 /** */ 16 /** 17 * Return a key. 18 * 19 * <p>Warning : this method <b>must</b> be aware of {@link ITreeProvider#setConcurrReadAccess(boolean)} 20 * parameter.</p> 21 */ 12 22 public K getKey(int pOffset); 23 24 /** 25 * Fill rate : 0 the node is empty, 1, the node is full. 26 * 27 */ 28 public float getFillRate(); 13 29 14 30 /** … … 18 34 */ 19 35 public void remove(int pOffset); 20 21 /**22 * Fill rate : 0 the node is empty, 1, the node is full.23 */24 public float getFillRate();25 36 26 37 /** -
trunk/Jav_Orient/src/eu/scenari/orient/tree/provider/ITreeProvider.java
r19678 r19680 5 5 public static int SIZE_UNKNOWN = -1; 6 6 7 /** 8 * This method is called on setup, before any other method. 9 * If set to <code>true</code>, all read methods can be called by multiple threads. 10 * Implementations <b>must</b> take care of this if they used lazyloading datas. 11 */ 12 public void setConcurrReadAccess(boolean pMultithreadContext); 13 7 14 /** 8 15 * Tree size (number of entries). 9 16 * A provider can not store the current size and then return -1. 10 17 * 18 * <p>Warning : this method <b>must</b> be aware of {@link #setConcurrReadAccess(boolean)} parameter.</p> 19 * 11 20 * @return tree size or {@link #SIZE_UNKNOWN} if size unknown. 12 21 */ 13 22 public int getSize(); 23 24 /** 25 * Load root node. 26 * Should always return a new and fresh node instance. 27 * 28 * <p>Warning : this method <b>must</b> be aware of {@link #setConcurrReadAccess(boolean)} parameter.</p> 29 **/ 30 public ITreeNodeProvider<K, V> loadRoot(); 14 31 15 32 /** … … 25 42 */ 26 43 public void setSize(int pComputedSize); 27 28 /** Load root node. */29 public ITreeNodeProvider<K, V> loadRoot();30 44 31 45 /** Update root node. */ -
trunk/Jav_Orient/src/eu/scenari/orient/tree/provider/ITreeRakeProvider.java
r19672 r19680 3 3 public interface ITreeRakeProvider<K, V> extends ITreeNodeProvider<K, V> { 4 4 5 /** 6 * Load a child node. 7 * Should always return a new and fresh node instance. 8 * 9 * <p>Warning : this method <b>must</b> be aware of {@link ITreeProvider#setConcurrReadAccess(boolean)} 10 * parameter.</p> 11 */ 5 12 public ITreeNodeProvider<K, V> loadNode(int pOffset); 6 13 -
trunk/Jav_Orient/src/eu/scenari/orient/tree/provider/ITreeSlotProvider.java
r19672 r19680 5 5 /** 6 6 * Get a value. 7 * 8 * <p>Warning : this method <b>must</b> be aware of {@link ITreeProvider#setConcurrReadAccess(boolean)} 9 * parameter.</p> 7 10 * 8 11 * @return <code>null</code> for a Set implementation. -
trunk/Jav_Orient/test/eu/scenari/orient/tree/TreeBasicTest.java
r19678 r19680 49 49 50 50 import eu.scenari.orient.recordstruct.IRecordStruct; 51 import eu.scenari.orient.recordstruct.lib.tree.StructTree;52 import eu.scenari.orient.recordstruct.lib.tree.TreeStorageConfig;53 51 import eu.scenari.orient.recordstruct.lib.tree.ValueTree; 54 import eu.scenari.orient.recordstruct.struct.ExtendedStructId;55 import eu.scenari.orient.recordstruct.types.TypesBase;56 52 import eu.scenari.orient.test.TestDbAbstract; 57 import eu.scenari.orient.tree.impl.IBalancingLayout;58 53 59 54 public class TreeBasicTest extends TestDbAbstract { 60 55 61 56 public static int MAP_SIZE = 2000; 62 63 public static boolean STORE_SIZE = false;64 65 public static final TreeStorageConfig TREECONFIG = new TreeStorageConfig().setKeysStruct(TypesBase.LIST_LONG).setValuesStruct(TypesBase.LIST_LONG).setSizeStored(STORE_SIZE).setBalancingLayout(IBalancingLayout.DEFAULT_BALANCED_INCREMENTAL_INSERT)66 .setRakeCapacity(32).setSlotCapacity(32);67 68 public static final StructTree TREE_LONG_LONG = new StructTree(new ExtendedStructId(1, 1), "trreeLongLong").setTreeConfig(TREECONFIG);69 57 70 58 protected FactorySequentialLong fFactorySeqLong = new FactorySequentialLong(); … … 79 67 fDatabase = fDbDriver.acquireDatabase(); 80 68 IRecordStruct<ValueTree<Long, Long>> vRecord = fDatabase.newInstance(); 81 vRecord.setValue((ValueTree) T REE_LONG_LONG.toValue(null, vRecord));69 vRecord.setValue((ValueTree) TypesTreeTests.TREE_LONG_LONG.toValue(null, vRecord)); 82 70 vRecord.save(); 83 71 ORID vId = vRecord.getIdentity(); … … 131 119 132 120 protected void checkSize(Map<Long, Long> pTree, int pSize) { 133 if ( STORE_SIZE) {121 if (TypesTreeTests.STORE_SIZE) { 134 122 Assert.assertEquals(pTree.size(), pSize); 135 123 }
Note: See TracChangeset
for help on using the changeset viewer.