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.memory;
21
22
23 import java.io.IOException;
24 import java.lang.ref.SoftReference;
25 import java.util.UUID;
26
27
28
29
30
31
32
33
34
35
36
37 public class MultipleMemoryHolder<K, V> implements ElementHolder<V, K, V>
38 {
39
40 private BTree<K, V> btree;
41
42
43 private long valContainerOffset = -1;
44
45
46 private BTree<V, V> valueContainer;
47
48
49 private SoftReference<BTree<V, V>> reference;
50
51
52 private V singleValue;
53
54
55
56
57
58
59
60
61 public MultipleMemoryHolder( BTree<K, V> btree, V value )
62 {
63 this.btree = btree;
64 this.singleValue = value;
65 }
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80 MultipleMemoryHolder( BTree<K, V> btree, BTree<V, V> valueContainer )
81 {
82 this.btree = btree;
83 this.valueContainer = valueContainer;
84 }
85
86
87
88
89
90 @Override
91 public V getValue( BTree<K, V> btree )
92 {
93 if ( valueContainer != null )
94 {
95
96 return ( V ) valueContainer;
97 }
98 else
99 {
100 return singleValue;
101 }
102 }
103
104
105 void switchToSingleValMode()
106 {
107 if ( ( valueContainer == null ) || ( reference == null ) )
108 {
109 return;
110 }
111
112 try
113 {
114
115 singleValue = valueContainer.rootPage.getLeftMostKey();
116 valueContainer = null;
117 }
118 catch ( IOException e )
119 {
120 throw new RuntimeException( e );
121 }
122 }
123
124
125 BTree<V, V> createAndSwitchToSubTree()
126 {
127 if ( reference != null )
128 {
129 throw new IllegalStateException( "Subtree was already created with offset " + valContainerOffset );
130 }
131
132 try
133 {
134 BTree<V, V> valueContainer = new BTree<V, V>( UUID.randomUUID().toString(), btree.getValueSerializer(),
135 btree.getValueSerializer() );
136
137 this.valueContainer = valueContainer;
138
139 valueContainer.insert( singleValue, null, 0 );
140 }
141 catch ( IOException e )
142 {
143 throw new RuntimeException( e );
144 }
145
146 return valueContainer;
147 }
148
149
150
151
152
153
154
155 public boolean isSingleValue()
156 {
157 return ( valueContainer == null );
158 }
159
160
161
162
163
164 public String toString()
165 {
166 StringBuilder sb = new StringBuilder();
167
168 sb.append( "'" );
169
170 V value = getValue( btree );
171
172 sb.append( value );
173
174 sb.append( "'" );
175
176 return sb.toString();
177 }
178 }