1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.directory.mavibot.btree.managed;
21
22
23 import java.io.IOException;
24 import java.util.LinkedList;
25
26 import org.apache.directory.mavibot.btree.Page;
27 import org.apache.directory.mavibot.btree.ParentPos;
28 import org.apache.directory.mavibot.btree.serializer.ElementSerializer;
29
30
31
32
33
34
35
36
37
38
39 public class BTreeFactory
40 {
41
42
43
44
45
46 public static <K, V> BTree<K, V> createBTree()
47 {
48 BTree<K, V> btree = new BTree<K, V>();
49
50 return btree;
51 }
52
53
54
55
56
57
58
59
60
61
62 public static <K, V> Node<K, V> createNode( BTree<K, V> btree, long revision, int nbElems )
63 {
64 Node<K, V> node = new Node<K, V>( btree, revision, nbElems );
65
66 return node;
67 }
68
69
70
71
72
73
74
75
76
77
78 public static <K, V> Leaf<K, V> createLeaf( BTree<K, V> btree, long revision, int nbElems )
79 {
80 Leaf<K, V> leaf = new Leaf<K, V>( btree, revision, nbElems );
81
82 return leaf;
83 }
84
85
86
87
88
89
90
91
92 public static <K, V> void setRoot( BTree<K, V> btree, Page<K, V> root )
93 {
94 btree.setRoot( root );
95 }
96
97
98
99
100
101
102
103
104 public static <K, V> Page<K, V> getRoot( BTree<K, V> btree )
105 {
106 return btree.rootPage;
107 }
108
109
110
111
112
113 public static <K, V> void setNbElems( BTree<K, V> btree, long nbElems )
114 {
115 btree.setNbElems( nbElems );
116 }
117
118
119
120
121
122 public static <K, V> void setRevision( BTree<K, V> btree, long revision )
123 {
124 btree.setRevision( revision );
125 }
126
127
128
129
130
131 public static <K, V> void setRootPageOffset( BTree<K, V> btree, long rootPageOffset )
132 {
133 btree.setRootPageOffset( rootPageOffset );
134 }
135
136
137
138
139
140 public static <K, V> void setNextBTreeOffset( BTree<K, V> btree, long nextBTreeOffset )
141 {
142 btree.setNextBTreeOffset( nextBTreeOffset );
143 }
144
145
146
147
148
149 public static <K, V> void setName( BTree<K, V> btree, String name )
150 {
151 btree.setName( name );
152 }
153
154
155
156
157
158
159
160
161
162
163
164 public static <K, V> void setKeySerializer( BTree<K, V> btree, String keySerializerFqcn )
165 throws ClassNotFoundException, IllegalAccessException, InstantiationException
166 {
167 Class<?> keySerializer = Class.forName( keySerializerFqcn );
168 @SuppressWarnings("unchecked")
169 ElementSerializer<K> instance = ( ElementSerializer<K> ) keySerializer.newInstance();
170 btree.setKeySerializer( instance );
171 }
172
173
174
175
176
177
178
179
180
181
182
183 public static <K, V> void setValueSerializer( BTree<K, V> btree, String valueSerializerFqcn )
184 throws ClassNotFoundException, IllegalAccessException, InstantiationException
185 {
186 Class<?> valueSerializer = Class.forName( valueSerializerFqcn );
187 @SuppressWarnings("unchecked")
188 ElementSerializer<V> instance = ( ElementSerializer<V> ) valueSerializer.newInstance();
189 btree.setValueSerializer( instance );
190 }
191
192
193
194
195
196
197
198 public static <K, V> void setPageSize( BTree<K, V> btree, int pageSize )
199 {
200 btree.setPageSize( pageSize );
201 }
202
203
204
205
206
207
208
209 public static <K, V> void setRecordManager( BTree<K, V> btree, RecordManager recordManager )
210 {
211 btree.setRecordManager( recordManager );
212 }
213
214
215
216
217
218
219
220 public static <K, V> void setKey( Page<K, V> page, int pos, K key )
221 {
222 ( ( AbstractPage<K, V> ) page ).setKey( pos, key );
223 }
224
225
226
227
228
229
230
231
232 public static <K, V> void setKey( Page<K, V> page, int pos, byte[] buffer )
233 {
234 ( ( AbstractPage<K, V> ) page ).setKey( pos, buffer );
235 }
236
237
238
239
240
241
242
243 public static <K, V> void setValue( Leaf<K, V> page, int pos, ValueHolder<V> value )
244 {
245 page.setValue( pos, value );
246 }
247
248
249
250
251
252
253
254 public static <K, V> void setValue( Node<K, V> page, int pos, PageHolder<K, V> value )
255 {
256 page.setValue( pos, value );
257 }
258
259
260
261
262
263
264
265
266
267 public static <K, V> LinkedList<ParentPos<K, V>> getPathToRightMostLeaf( BTree<K, V> btree ) throws IOException
268 {
269 LinkedList<ParentPos<K, V>> stack = new LinkedList<ParentPos<K, V>>();
270
271 ParentPos<K, V> last = new ParentPos<K, V>( btree.rootPage, btree.rootPage.getNbElems() );
272 stack.push( last );
273
274 if ( btree.rootPage instanceof Leaf )
275 {
276 Leaf<K, V> leaf = ( Leaf<K, V> ) ( btree.rootPage );
277 ValueHolder<V> valueHolder = leaf.values[last.pos];
278 last.valueCursor = valueHolder.getCursor();
279 }
280 else
281 {
282 Node<K, V> node = ( Node<K, V> ) btree.rootPage;
283
284 while ( true )
285 {
286 Page<K, V> p = node.children[node.getNbElems()].getValue( btree );
287
288 last = new ParentPos<K, V>( p, p.getNbElems() );
289 stack.push( last );
290
291 if ( p instanceof Leaf )
292 {
293 Leaf<K, V> leaf = ( Leaf<K, V> ) ( last.page );
294 ValueHolder<V> valueHolder = leaf.values[last.pos];
295 last.valueCursor = valueHolder.getCursor();
296 break;
297 }
298 }
299 }
300
301 return stack;
302 }
303
304
305
306
307
308
309
310
311
312 public static <K, V> LinkedList<ParentPos<K, V>> getPathToLeftMostLeaf( BTree<K, V> btree ) throws IOException
313 {
314 LinkedList<ParentPos<K, V>> stack = new LinkedList<ParentPos<K, V>>();
315
316 ParentPos<K, V> first = new ParentPos<K, V>( btree.rootPage, 0 );
317 stack.push( first );
318
319 if ( btree.rootPage instanceof Leaf )
320 {
321 Leaf<K, V> leaf = ( Leaf<K, V> ) ( btree.rootPage );
322 ValueHolder<V> valueHolder = leaf.values[first.pos];
323 first.valueCursor = valueHolder.getCursor();
324 }
325 else
326 {
327 Node<K, V> node = ( Node<K, V> ) btree.rootPage;
328
329 while ( true )
330 {
331 Page<K, V> page = node.children[0].getValue( btree );
332
333 first = new ParentPos<K, V>( page, 0 );
334 stack.push( first );
335
336 if ( page instanceof Leaf )
337 {
338 Leaf<K, V> leaf = ( Leaf<K, V> ) ( page );
339 ValueHolder<V> valueHolder = leaf.values[first.pos];
340 first.valueCursor = valueHolder.getCursor();
341 break;
342 }
343 }
344 }
345
346 return stack;
347 }
348 }