Merge lp:~yshavit/akiban-persistit/bug1042960 into lp:akiban-persistit

Proposed by Yuval Shavit
Status: Rejected
Rejected by: Yuval Shavit
Proposed branch: lp:~yshavit/akiban-persistit/bug1042960
Merge into: lp:akiban-persistit
Diff against target: 360 lines (+57/-36)
10 files modified
src/main/java/com/persistit/Value.java (+24/-3)
src/test/java/com/persistit/stress/unit/Stress10.java (+1/-1)
src/test/java/com/persistit/stress/unit/Stress11.java (+1/-1)
src/test/java/com/persistit/stress/unit/Stress2.java (+1/-1)
src/test/java/com/persistit/stress/unit/Stress2txn.java (+1/-1)
src/test/java/com/persistit/stress/unit/Stress3.java (+5/-5)
src/test/java/com/persistit/stress/unit/Stress3txn.java (+5/-5)
src/test/java/com/persistit/stress/unit/Stress9.java (+1/-1)
src/test/java/com/persistit/stress/unit/StressBase.java (+1/-1)
src/test/java/com/persistit/unit/ValueTest2.java (+17/-17)
To merge this branch: bzr merge lp:~yshavit/akiban-persistit/bug1042960
Reviewer Review Type Date Requested Status
Akiban Technologies Pending
Review via email: mp+121714@code.launchpad.net

Description of the change

Adding an argument to Value#isNull, to specify whether the Value should skip to the next field if the result is null. See attached bug for reasoning. This branch is just a suggestion, so feel free to reject if you don't like the idea.

This constitutes an API change, so it shouldn't go in until we're ready to do a version bump. Or I can add a version bump with the branch.

To post a comment you must log in.

Unmerged revisions

359. By Yuval Shavit

update isNull to take a flag specifying whether it should skip on null

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/main/java/com/persistit/Value.java'
2--- src/main/java/com/persistit/Value.java 2012-08-15 16:11:36 +0000
3+++ src/main/java/com/persistit/Value.java 2012-08-28 21:41:21 +0000
4@@ -954,13 +954,34 @@
5 }
6
7 /**
8- * Tests whether the data held by this <code>Value</code> is null.
9+ * Tests whether the data held by this <code>Value</code> is null. If the data
10+ * is null, and the <code>Value</code> is in stream mode, this method
11+ * optionally skips to the next field. This can be useful in a loop such as:
12+ * <pre>
13+ * for (int i = 0; i < segments; ++i) {
14+ * if (persistitValue.isNull(true)) {
15+ * handleNull();
16+ * }
17+ * else {
18+ * int intValueu = persistitValue.getInt();
19+ * handleInt(intValue);
20+ * }
21+ * }
22+ * </pre>
23+ *
24+ * @param skipIfNull
25+ * whether to skip to the next element. This flag obeys the
26+ * contract of {@link #skip()}, which is a no-op when not in
27+ * stream mode.
28 *
29 * @return <code>true</code> if the current state of this <code>Value</code>
30 * represents <i>null</i>.
31 */
32- public boolean isNull() {
33- return getTypeHandle() == TYPE_NULL;
34+ public boolean isNull(boolean skipIfNull) {
35+ boolean result = getTypeHandle() == TYPE_NULL;
36+ if (result && skipIfNull)
37+ skip();
38+ return result;
39 }
40
41 boolean isAntiValue() {
42
43=== modified file 'src/test/java/com/persistit/stress/unit/Stress10.java'
44--- src/test/java/com/persistit/stress/unit/Stress10.java 2012-08-15 16:11:36 +0000
45+++ src/test/java/com/persistit/stress/unit/Stress10.java 2012-08-28 21:41:21 +0000
46@@ -114,7 +114,7 @@
47 addWork(1);
48
49 int size1 = 0;
50- if (_ex.getValue().isDefined() && !_ex.getValue().isNull()) {
51+ if (_ex.getValue().isDefined() && !_ex.getValue().isNull(false)) {
52 size1 = _ex.getValue().getInt();
53 }
54 _exs.fetch();
55
56=== modified file 'src/test/java/com/persistit/stress/unit/Stress11.java'
57--- src/test/java/com/persistit/stress/unit/Stress11.java 2012-08-15 16:11:36 +0000
58+++ src/test/java/com/persistit/stress/unit/Stress11.java 2012-08-28 21:41:21 +0000
59@@ -119,7 +119,7 @@
60 addWork(1);
61
62 int size1 = 0;
63- if (_ex.getValue().isDefined() && !_ex.getValue().isNull()) {
64+ if (_ex.getValue().isDefined() && !_ex.getValue().isNull(false)) {
65 size1 = _ex.getValue().getInt();
66 }
67 _exs.fetch();
68
69=== modified file 'src/test/java/com/persistit/stress/unit/Stress2.java'
70--- src/test/java/com/persistit/stress/unit/Stress2.java 2012-08-15 16:11:36 +0000
71+++ src/test/java/com/persistit/stress/unit/Stress2.java 2012-08-28 21:41:21 +0000
72@@ -115,7 +115,7 @@
73 addWork(1);
74
75 int size1 = 0;
76- if (_ex.getValue().isDefined() && !_ex.getValue().isNull()) {
77+ if (_ex.getValue().isDefined() && !_ex.getValue().isNull(false)) {
78 size1 = _ex.getValue().getInt();
79 }
80 _exs.fetch(value2);
81
82=== modified file 'src/test/java/com/persistit/stress/unit/Stress2txn.java'
83--- src/test/java/com/persistit/stress/unit/Stress2txn.java 2012-08-15 16:11:36 +0000
84+++ src/test/java/com/persistit/stress/unit/Stress2txn.java 2012-08-28 21:41:21 +0000
85@@ -150,7 +150,7 @@
86 addWork(1);
87
88 int size1 = 0;
89- if (_ex.getValue().isDefined() && !_ex.getValue().isNull()) {
90+ if (_ex.getValue().isDefined() && !_ex.getValue().isNull(false)) {
91 size1 = _ex.getValue().getInt();
92 }
93 _exs.fetch(value2);
94
95=== modified file 'src/test/java/com/persistit/stress/unit/Stress3.java'
96--- src/test/java/com/persistit/stress/unit/Stress3.java 2012-08-15 16:11:36 +0000
97+++ src/test/java/com/persistit/stress/unit/Stress3.java 2012-08-28 21:41:21 +0000
98@@ -148,7 +148,7 @@
99 ex1.clear().append("byName").append(s).fetch();
100 addWork(1);
101
102- if (!ex1.getValue().isDefined() || ex1.getValue().isNull()) {
103+ if (!ex1.getValue().isDefined() || ex1.getValue().isNull(false)) {
104 atomic = _counter.incrementAndGet();
105 ex1.getValue().put(atomic);
106 ex1.store();
107@@ -192,7 +192,7 @@
108 ex1.clear().append("byName").append(s).fetch();
109 addWork(1);
110
111- if (!ex1.getValue().isDefined() || ex1.getValue().isNull()) {
112+ if (!ex1.getValue().isDefined() || ex1.getValue().isNull(false)) {
113 throw new RuntimeException("Expected filename <" + s + "> was not found - key="
114 + ex1.getKey());
115 }
116@@ -202,7 +202,7 @@
117 ex2.clear().append("byCounter").append(atomic).fetch(value2);
118 addWork(1);
119
120- if (!value2.isDefined() || value2.isNull()) {
121+ if (!value2.isDefined() || value2.isNull(false)) {
122 throw new RuntimeException("Expected value for byCounter " + atomic
123 + " was not found - key=" + ex2.getKey());
124 }
125@@ -221,7 +221,7 @@
126 ex3.clear().append("byReversedName").append(_sb1).fetch();
127 addWork(1);
128
129- if (!ex3.getValue().isDefined() || ex3.getValue().isNull()
130+ if (!ex3.getValue().isDefined() || ex3.getValue().isNull(false)
131 || (ex3.getValue().getLong() != atomic)) {
132 throw new RuntimeException("Missing or incorrect value " + ex3.getValue() + " should be "
133 + atomic + " key=" + ex3.getKey());
134@@ -271,7 +271,7 @@
135 ex1.clear().append("byName").append(s).fetch();
136 addWork(1);
137
138- if (!ex1.getValue().isDefined() || ex1.getValue().isNull()) {
139+ if (!ex1.getValue().isDefined() || ex1.getValue().isNull(false)) {
140 fail("Expected filename <" + s + "> was not found - key=" + ex1.getKey()
141 + " keyInteger=" + keyInteger + " at counter=" + _count);
142 break;
143
144=== modified file 'src/test/java/com/persistit/stress/unit/Stress3txn.java'
145--- src/test/java/com/persistit/stress/unit/Stress3txn.java 2012-08-15 16:11:36 +0000
146+++ src/test/java/com/persistit/stress/unit/Stress3txn.java 2012-08-28 21:41:21 +0000
147@@ -135,7 +135,7 @@
148 txn.begin();
149 try {
150 ex1.clear().append("byName").append(s).fetch();
151- if (!ex1.getValue().isDefined() || ex1.getValue().isNull()) {
152+ if (!ex1.getValue().isDefined() || ex1.getValue().isNull(false)) {
153 atomic = _counter.incrementAndGet();
154 ex1.getValue().put(atomic);
155 ex1.store();
156@@ -193,7 +193,7 @@
157 ex1.clear().append("byName").append(s).fetch();
158 addWork(1);
159
160- if (!ex1.getValue().isDefined() || ex1.getValue().isNull()) {
161+ if (!ex1.getValue().isDefined() || ex1.getValue().isNull(false)) {
162 throw new RuntimeException("Expected filename <" + s + "> was not found - key="
163 + ex1.getKey());
164 }
165@@ -203,7 +203,7 @@
166 ex2.clear().append("byCounter").append(atomic).fetch(value2);
167 addWork(1);
168
169- if (!value2.isDefined() || value2.isNull()) {
170+ if (!value2.isDefined() || value2.isNull(false)) {
171 throw new RuntimeException("Expected value for byCounter " + atomic
172 + " was not found - key=" + ex2.getKey());
173 }
174@@ -222,7 +222,7 @@
175 ex3.clear().append("byReversedName").append(_sb1).fetch();
176 addWork(1);
177
178- if (!ex3.getValue().isDefined() || ex3.getValue().isNull()
179+ if (!ex3.getValue().isDefined() || ex3.getValue().isNull(false)
180 || (ex3.getValue().getLong() != atomic)) {
181 throw new RuntimeException("Missing or incorrect value " + ex3.getValue() + " should be "
182 + atomic + " key=" + ex3.getKey());
183@@ -272,7 +272,7 @@
184 ex1.clear().append("byName").append(s).fetch();
185 addWork(1);
186
187- if (!ex1.getValue().isDefined() || ex1.getValue().isNull()) {
188+ if (!ex1.getValue().isDefined() || ex1.getValue().isNull(false)) {
189 fail("Expected filename <" + s + "> was not found - key=" + ex1.getKey()
190 + " keyInteger=" + keyInteger + " at counter=" + _count);
191 break;
192
193=== modified file 'src/test/java/com/persistit/stress/unit/Stress9.java'
194--- src/test/java/com/persistit/stress/unit/Stress9.java 2012-08-15 16:11:36 +0000
195+++ src/test/java/com/persistit/stress/unit/Stress9.java 2012-08-28 21:41:21 +0000
196@@ -126,7 +126,7 @@
197 addWork(1);
198
199 int size1 = 0;
200- if (_ex.getValue().isDefined() && !_ex.getValue().isNull()) {
201+ if (_ex.getValue().isDefined() && !_ex.getValue().isNull(false)) {
202 size1 = _ex.getValue().getInt();
203 }
204 _exs.fetch(value2);
205
206=== modified file 'src/test/java/com/persistit/stress/unit/StressBase.java'
207--- src/test/java/com/persistit/stress/unit/StressBase.java 2012-08-15 16:11:36 +0000
208+++ src/test/java/com/persistit/stress/unit/StressBase.java 2012-08-28 21:41:21 +0000
209@@ -85,7 +85,7 @@
210
211 protected void compareValues(final Value value1, final Value value2) {
212 boolean ok = true;
213- if (!value2.isDefined() || value2.isNull()) {
214+ if (!value2.isDefined() || value2.isNull(false)) {
215 fail("value not expected to be null");
216 ok = false;
217 } else if (!value1.equals(value2)) {
218
219=== modified file 'src/test/java/com/persistit/unit/ValueTest2.java'
220--- src/test/java/com/persistit/unit/ValueTest2.java 2012-08-15 16:11:36 +0000
221+++ src/test/java/com/persistit/unit/ValueTest2.java 2012-08-28 21:41:21 +0000
222@@ -95,21 +95,21 @@
223 value.put(null);
224 value.trim();
225 assertEquals(Void.TYPE, value.getType());
226- assertEquals(true, value.isNull());
227+ assertEquals(true, value.isNull(false));
228 assertEquals(true, value.isDefined());
229 assertEquals(value.get(), null);
230
231 value.put(true);
232 value.trim();
233 assertEquals(value.getType(), Boolean.TYPE);
234- assertEquals(value.isNull(), false);
235+ assertEquals(value.isNull(false), false);
236 assertEquals(value.isDefined(), true);
237 assertEquals(value.getBoolean(), true);
238 assertEquals(value.get(), Boolean.TRUE);
239
240 value.put(false);
241 assertEquals(value.getType(), Boolean.TYPE);
242- assertEquals(value.isNull(), false);
243+ assertEquals(value.isNull(false), false);
244 assertEquals(value.isDefined(), true);
245 assertEquals(value.getBoolean(), false);
246 assertEquals(value.get(), Boolean.FALSE);
247@@ -117,70 +117,70 @@
248 value.put(Boolean.TRUE);
249 value.trim();
250 assertEquals(value.getType(), Boolean.class);
251- assertEquals(value.isNull(), false);
252+ assertEquals(value.isNull(false), false);
253 assertEquals(value.isDefined(), true);
254 assertEquals(value.getBoolean(), true);
255 assertEquals(value.get(), Boolean.TRUE);
256
257 value.put(Boolean.FALSE);
258 assertEquals(value.getType(), Boolean.class);
259- assertEquals(value.isNull(), false);
260+ assertEquals(value.isNull(false), false);
261 assertEquals(value.isDefined(), true);
262 assertEquals(value.getBoolean(), false);
263 assertEquals(value.get(), Boolean.FALSE);
264
265 value.put((byte) 123);
266 assertEquals(value.getType(), Byte.TYPE);
267- assertEquals(value.isNull(), false);
268+ assertEquals(value.isNull(false), false);
269 assertEquals(value.isDefined(), true);
270 assertEquals(value.getByte(), (byte) 123);
271 assertEquals(value.get(), new Byte((byte) 123));
272
273 value.put(new Byte((byte) 123));
274 assertEquals(value.getType(), Byte.class);
275- assertEquals(value.isNull(), false);
276+ assertEquals(value.isNull(false), false);
277 assertEquals(value.isDefined(), true);
278 assertEquals(value.getByte(), (byte) 123);
279 assertEquals(value.get(), new Byte((byte) 123));
280
281 value.put((short) 234);
282 assertEquals(value.getType(), Short.TYPE);
283- assertEquals(value.isNull(), false);
284+ assertEquals(value.isNull(false), false);
285 assertEquals(value.isDefined(), true);
286 assertEquals(value.getShort(), (short) 234);
287 assertEquals(value.get(), new Short((short) 234));
288
289 value.put(new Short((short) 234));
290 assertEquals(value.getType(), Short.class);
291- assertEquals(value.isNull(), false);
292+ assertEquals(value.isNull(false), false);
293 assertEquals(value.isDefined(), true);
294 assertEquals(value.getShort(), (short) 234);
295 assertEquals(value.get(), new Short((short) 234));
296
297 value.put((char) 345);
298 assertEquals(value.getType(), Character.TYPE);
299- assertEquals(value.isNull(), false);
300+ assertEquals(value.isNull(false), false);
301 assertEquals(value.isDefined(), true);
302 assertEquals(value.getChar(), (char) 345);
303 assertEquals(value.get(), new Character((char) 345));
304
305 value.put(new Character((char) 345));
306 assertEquals(value.getType(), Character.class);
307- assertEquals(value.isNull(), false);
308+ assertEquals(value.isNull(false), false);
309 assertEquals(value.isDefined(), true);
310 assertEquals(value.getChar(), (char) 345);
311 assertEquals(value.get(), new Character((char) 345));
312
313 value.put(456);
314 assertEquals(value.getType(), Integer.TYPE);
315- assertEquals(value.isNull(), false);
316+ assertEquals(value.isNull(false), false);
317 assertEquals(value.isDefined(), true);
318 assertEquals(value.getInt(), 456);
319 assertEquals(value.get(), new Integer(456));
320
321 value.put(new Integer(456));
322 assertEquals(value.getType(), Integer.class);
323- assertEquals(value.isNull(), false);
324+ assertEquals(value.isNull(false), false);
325 assertEquals(value.isDefined(), true);
326 value.trim();
327 assertEquals(value.getInt(), 456);
328@@ -188,28 +188,28 @@
329
330 value.put((float) 567);
331 assertEquals(value.getType(), Float.TYPE);
332- assertEquals(value.isNull(), false);
333+ assertEquals(value.isNull(false), false);
334 assertEquals(value.isDefined(), true);
335 assertEquals(value.getFloat(), 567, 0.0001f);
336 assertEquals(value.get(), new Float(567));
337
338 value.put(new Float(567));
339 assertEquals(value.getType(), Float.class);
340- assertEquals(value.isNull(), false);
341+ assertEquals(value.isNull(false), false);
342 assertEquals(value.isDefined(), true);
343 assertEquals(value.getFloat(), 567, 0.0001f);
344 assertEquals(value.get(), new Float(567));
345
346 value.put((double) 678);
347 assertEquals(value.getType(), Double.TYPE);
348- assertEquals(value.isNull(), false);
349+ assertEquals(value.isNull(false), false);
350 assertEquals(value.isDefined(), true);
351 assertEquals(value.getDouble(), 678, 0.0001f);
352 assertEquals(value.get(), new Double(678));
353
354 value.put(new Double(678));
355 assertEquals(value.getType(), Double.class);
356- assertEquals(value.isNull(), false);
357+ assertEquals(value.isNull(false), false);
358 assertEquals(value.isDefined(), true);
359 value.trim(100);
360 assertEquals(value.getDouble(), 678, 0.0001f);

Subscribers

People subscribed via source and target branches