KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > db4o > inside > btree > BTreeRangeSingle


1 /* Copyright (C) 2004 - 2006 db4objects Inc. http://www.db4o.com
2
3 This file is part of the db4o open source object database.
4
5 db4o is free software; you can redistribute it and/or modify it under
6 the terms of version 2 of the GNU General Public License as published
7 by the Free Software Foundation and as clarified by db4objects' GPL
8 interpretation policy, available at
9 http://www.db4o.com/about/company/legalpolicies/gplinterpretation/
10 Alternatively you can write to db4objects, Inc., 1900 S Norfolk Street,
11 Suite 350, San Mateo, CA 94403, USA.
12
13 db4o is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License along
19 with this program; if not, write to the Free Software Foundation, Inc.,
20 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */

21 package com.db4o.inside.btree;
22
23 import com.db4o.Transaction;
24 import com.db4o.foundation.*;
25 import com.db4o.inside.btree.algebra.*;
26
27 /**
28  * @exclude
29  */

30 public class BTreeRangeSingle implements BTreeRange {
31     
32     public static final Comparison4 COMPARISON = new Comparison4() {
33         public int compare(Object JavaDoc x, Object JavaDoc y) {
34             BTreeRangeSingle xRange = (BTreeRangeSingle)x;
35             BTreeRangeSingle yRange = (BTreeRangeSingle)y;
36             return xRange.first().compareTo(yRange.first());
37         }
38     };
39     
40     private final Transaction _transaction;
41
42     private final BTree _btree;
43     
44     private final BTreePointer _first;
45     
46     private final BTreePointer _end;
47
48     public BTreeRangeSingle(Transaction transaction, BTree btree, BTreePointer first, BTreePointer end) {
49         if (transaction == null || btree == null) {
50             throw new ArgumentNullException();
51         }
52         _transaction = transaction;
53         _btree = btree;
54         _first = first;
55         _end = end;
56     }
57     
58     public void accept(BTreeRangeVisitor visitor) {
59         visitor.visit(this);
60     }
61     
62     public boolean isEmpty() {
63         return BTreePointer.equals(_first, _end);
64     }
65     
66     public int size(){
67         if(isEmpty()){
68             return 0;
69         }
70         
71 // TODO: This was an attempt to improve size calculation.
72
// Since all nodes are read, there is no improvement.
73

74 // BTreeNode currentNode = _first.node();
75
// int sizeOnFirst = currentNode.count() - _first.index();
76
//
77
// BTreeNode endNode = _end == null ? null : _end.node();
78
// int substractForEnd =
79
// (endNode == null) ? 0 : (endNode.count() - _end.index());
80
//
81
// int size = sizeOnFirst - substractForEnd;
82
// while(! currentNode.equals(endNode)){
83
// currentNode = currentNode.nextNode();
84
// if(currentNode == null){
85
// break;
86
// }
87
// currentNode.prepareRead(transaction());
88
// size += currentNode.count();
89
// }
90
// return size;
91

92         int size = 0;
93         final Iterator4 i = keys();
94         while (i.moveNext()) {
95             ++size;
96         }
97         return size;
98     }
99     
100     public Iterator4 pointers() {
101         return new BTreeRangePointerIterator(this);
102     }
103
104     public Iterator4 keys() {
105         return new BTreeRangeKeyIterator(this);
106     }
107
108     public final BTreePointer end() {
109         return _end;
110     }
111
112     public Transaction transaction() {
113         return _transaction;
114     }
115
116     public BTreePointer first() {
117         return _first;
118     }
119
120     public BTreeRange greater() {
121         return newBTreeRangeSingle(_end, null);
122     }
123     
124     public BTreeRange union(BTreeRange other) {
125         if (null == other) {
126             throw new ArgumentNullException();
127         }
128         return new BTreeRangeSingleUnion(this).dispatch(other);
129     }
130     
131     public boolean adjacent(BTreeRangeSingle range) {
132         return BTreePointer.equals(_end, range._first)
133             || BTreePointer.equals(range._end, _first);
134     }
135
136     public boolean overlaps(BTreeRangeSingle range) {
137         return firstOverlaps(this, range) || firstOverlaps(range, this);
138     }
139
140     private boolean firstOverlaps(BTreeRangeSingle x, BTreeRangeSingle y) {
141         return BTreePointer.lessThan(y._first, x._end)
142             && BTreePointer.lessThan(x._first, y._end);
143     }
144
145     public BTreeRange extendToFirst() {
146         return newBTreeRangeSingle(firstBTreePointer(), _end);
147     }
148
149     public BTreeRange extendToLast() {
150         return newBTreeRangeSingle(_first, null);
151     }
152
153     public BTreeRange smaller() {
154         return newBTreeRangeSingle(firstBTreePointer(), _first);
155     }
156
157     public BTreeRangeSingle newBTreeRangeSingle(BTreePointer first, BTreePointer end) {
158         return new BTreeRangeSingle(transaction(), _btree, first, end);
159     }
160     
161     public BTreeRange newEmptyRange() {
162         return newBTreeRangeSingle(null, null);
163     }
164
165     private BTreePointer firstBTreePointer() {
166         return btree().firstPointer(transaction());
167     }
168
169     private BTree btree() {
170         return _btree;
171     }
172
173     public BTreeRange intersect(BTreeRange range) {
174         if (null == range) {
175             throw new ArgumentNullException();
176         }
177         return new BTreeRangeSingleIntersect(this).dispatch(range);
178     }
179
180     public BTreeRange extendToLastOf(BTreeRange range) {
181         BTreeRangeSingle rangeImpl = checkRangeArgument(range);
182         return newBTreeRangeSingle(_first, rangeImpl._end);
183     }
184     
185     public String JavaDoc toString() {
186         return "BTreeRangeSingle(first=" + _first + ", end=" + _end + ")";
187     }
188
189     private BTreeRangeSingle checkRangeArgument(BTreeRange range) {
190         if (null == range) {
191             throw new ArgumentNullException();
192         }
193         BTreeRangeSingle rangeImpl = (BTreeRangeSingle)range;
194         if (btree() != rangeImpl.btree()) {
195             throw new IllegalArgumentException JavaDoc();
196         }
197         return rangeImpl;
198     }
199
200     public BTreePointer lastPointer() {
201         if(_end == null){
202             return btree().lastPointer(transaction());
203         }
204         return _end.previous();
205     }
206
207 }
208
Popular Tags