Skip to content

Commit ff8d06e

Browse files
authored
Merge pull request #214 from zhenlineo/1.1-with-default-value
Adding new API for accessing records and mapped values with a default value
2 parents 87d9615 + 85e0248 commit ff8d06e

File tree

7 files changed

+908
-4
lines changed

7 files changed

+908
-4
lines changed

driver/src/main/java/org/neo4j/driver/internal/InternalRecord.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
import org.neo4j.driver.internal.util.Extract;
2727
import org.neo4j.driver.internal.value.InternalValue;
28+
import org.neo4j.driver.internal.types.InternalMapAccessorWithDefaultValue;
2829
import org.neo4j.driver.v1.Record;
2930
import org.neo4j.driver.v1.Value;
3031
import org.neo4j.driver.v1.Values;
@@ -36,7 +37,7 @@
3637
import static org.neo4j.driver.v1.Values.ofObject;
3738
import static org.neo4j.driver.v1.Values.ofValue;
3839

39-
public class InternalRecord implements Record
40+
public class InternalRecord extends InternalMapAccessorWithDefaultValue implements Record
4041
{
4142
private final List<String> keys;
4243
private final Value[] values;
Lines changed: 344 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,344 @@
1+
/**
2+
* Copyright (c) 2002-2016 "Neo Technology,"
3+
* Network Engine for Objects in Lund AB [http://neotechnology.com]
4+
*
5+
* This file is part of Neo4j.
6+
*
7+
* Licensed under the Apache License, Version 2.0 (the "License");
8+
* you may not use this file except in compliance with the License.
9+
* You may obtain a copy of the License at
10+
*
11+
* http://www.apache.org/licenses/LICENSE-2.0
12+
*
13+
* Unless required by applicable law or agreed to in writing, software
14+
* distributed under the License is distributed on an "AS IS" BASIS,
15+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16+
* See the License for the specific language governing permissions and
17+
* limitations under the License.
18+
*/
19+
package org.neo4j.driver.internal.types;
20+
21+
import java.util.List;
22+
import java.util.Map;
23+
24+
import org.neo4j.driver.internal.AsValue;
25+
import org.neo4j.driver.v1.Value;
26+
import org.neo4j.driver.v1.Values;
27+
import org.neo4j.driver.v1.types.Entity;
28+
import org.neo4j.driver.v1.types.MapAccessorWithDefaultValue;
29+
import org.neo4j.driver.v1.types.Node;
30+
import org.neo4j.driver.v1.types.Path;
31+
import org.neo4j.driver.v1.types.Relationship;
32+
import org.neo4j.driver.v1.util.Function;
33+
34+
public abstract class InternalMapAccessorWithDefaultValue implements MapAccessorWithDefaultValue
35+
{
36+
public abstract Value get( String key );
37+
38+
@Override
39+
public Value get( String key, Value defaultValue )
40+
{
41+
return get( get( key ), defaultValue );
42+
}
43+
44+
private Value get( Value value, Value defaultValue )
45+
{
46+
if( value.equals( Values.NULL ) )
47+
{
48+
return defaultValue;
49+
}
50+
else
51+
{
52+
return ((AsValue) value).asValue();
53+
}
54+
}
55+
56+
@Override
57+
public Object get( String key, Object defaultValue )
58+
{
59+
return get( get( key ), defaultValue );
60+
}
61+
62+
private Object get(Value value, Object defaultValue )
63+
{
64+
if( value.equals( Values.NULL ) )
65+
{
66+
return defaultValue;
67+
}
68+
else
69+
{
70+
return value.asObject();
71+
}
72+
}
73+
74+
@Override
75+
public Number get( String key, Number defaultValue )
76+
{
77+
return get( get( key ), defaultValue );
78+
}
79+
80+
private Number get( Value value, Number defaultValue )
81+
{
82+
if( value.equals( Values.NULL ) )
83+
{
84+
return defaultValue;
85+
}
86+
else
87+
{
88+
return value.asNumber();
89+
}
90+
}
91+
92+
@Override
93+
public Entity get( String key, Entity defaultValue )
94+
{
95+
return get( get( key ), defaultValue );
96+
}
97+
98+
private Entity get( Value value, Entity defaultValue )
99+
{
100+
if( value.equals( Values.NULL ) )
101+
{
102+
return defaultValue;
103+
}
104+
else
105+
{
106+
return value.asEntity();
107+
}
108+
}
109+
110+
@Override
111+
public Node get( String key, Node defaultValue )
112+
{
113+
return get( get( key ), defaultValue );
114+
}
115+
116+
private Node get( Value value, Node defaultValue )
117+
{
118+
if( value.equals( Values.NULL ) )
119+
{
120+
return defaultValue;
121+
}
122+
else
123+
{
124+
return value.asNode();
125+
}
126+
}
127+
128+
@Override
129+
public Path get( String key, Path defaultValue )
130+
{
131+
return get( get( key ), defaultValue );
132+
}
133+
134+
private Path get( Value value, Path defaultValue )
135+
{
136+
if( value.equals( Values.NULL ) )
137+
{
138+
return defaultValue;
139+
}
140+
else
141+
{
142+
return value.asPath();
143+
}
144+
}
145+
146+
@Override
147+
public Relationship get( String key, Relationship defaultValue )
148+
{
149+
return get( get( key ), defaultValue );
150+
}
151+
152+
private Relationship get( Value value, Relationship defaultValue )
153+
{
154+
if( value.equals( Values.NULL ) )
155+
{
156+
return defaultValue;
157+
}
158+
else
159+
{
160+
return value.asRelationship();
161+
}
162+
}
163+
164+
@Override
165+
public List<Object> get( String key, List<Object> defaultValue )
166+
{
167+
return get( get( key ), defaultValue );
168+
}
169+
170+
private List<Object> get( Value value, List<Object> defaultValue )
171+
{
172+
if( value.equals( Values.NULL ) )
173+
{
174+
return defaultValue;
175+
}
176+
else
177+
{
178+
return value.asList();
179+
}
180+
}
181+
182+
@Override
183+
public <T> List<T> get( String key, List<T> defaultValue, Function<Value,T> mapFunc )
184+
{
185+
return get( get( key ), defaultValue, mapFunc );
186+
}
187+
188+
private <T> List<T> get( Value value, List<T> defaultValue, Function<Value, T> mapFunc )
189+
{
190+
if( value.equals( Values.NULL ) )
191+
{
192+
return defaultValue;
193+
}
194+
else
195+
{
196+
return value.asList( mapFunc );
197+
}
198+
}
199+
200+
@Override
201+
public Map<String, Object> get( String key, Map<String,Object> defaultValue )
202+
{
203+
return get( get( key ), defaultValue );
204+
}
205+
206+
private Map<String, Object> get( Value value, Map<String, Object> defaultValue )
207+
{
208+
if( value.equals( Values.NULL ) )
209+
{
210+
return defaultValue;
211+
}
212+
else
213+
{
214+
return value.asMap();
215+
}
216+
}
217+
218+
@Override
219+
public <T> Map<String, T> get( String key, Map<String,T> defaultValue, Function<Value,T> mapFunc )
220+
{
221+
return get( get( key ), defaultValue, mapFunc );
222+
}
223+
224+
private <T>Map<String, T> get( Value value, Map<String, T> defaultValue, Function<Value, T> mapFunc )
225+
{
226+
if( value.equals( Values.NULL ) )
227+
{
228+
return defaultValue;
229+
}
230+
else
231+
{
232+
return value.asMap( mapFunc );
233+
}
234+
}
235+
236+
@Override
237+
public int get( String key, int defaultValue )
238+
{
239+
return get( get( key ), defaultValue );
240+
}
241+
242+
private int get( Value value, int defaultValue )
243+
{
244+
if( value.equals( Values.NULL ) )
245+
{
246+
return defaultValue;
247+
}
248+
else
249+
{
250+
return value.asInt();
251+
}
252+
}
253+
254+
@Override
255+
public long get( String key, long defaultValue )
256+
{
257+
return get( get( key ), defaultValue );
258+
}
259+
260+
private long get( Value value, long defaultValue )
261+
{
262+
if( value.equals( Values.NULL ) )
263+
{
264+
return defaultValue;
265+
}
266+
else
267+
{
268+
return value.asLong();
269+
}
270+
}
271+
272+
@Override
273+
public boolean get( String key, boolean defaultValue )
274+
{
275+
return get( get( key ), defaultValue );
276+
}
277+
278+
private boolean get( Value value, boolean defaultValue )
279+
{
280+
if( value.equals( Values.NULL ) )
281+
{
282+
return defaultValue;
283+
}
284+
else
285+
{
286+
return value.asBoolean();
287+
}
288+
}
289+
290+
@Override
291+
public String get( String key, String defaultValue )
292+
{
293+
return get( get( key ), defaultValue );
294+
}
295+
296+
private String get( Value value, String defaultValue )
297+
{
298+
if( value.equals( Values.NULL ) )
299+
{
300+
return defaultValue;
301+
}
302+
else
303+
{
304+
return value.asString();
305+
}
306+
}
307+
308+
@Override
309+
public float get( String key, float defaultValue )
310+
{
311+
return get( get( key ), defaultValue );
312+
}
313+
314+
private float get( Value value, float defaultValue )
315+
{
316+
if( value.equals( Values.NULL ) )
317+
{
318+
return defaultValue;
319+
}
320+
else
321+
{
322+
return value.asFloat();
323+
}
324+
}
325+
326+
@Override
327+
public double get( String key, double defaultValue )
328+
{
329+
return get( get( key ), defaultValue );
330+
}
331+
332+
private double get( Value value, double defaultValue )
333+
{
334+
if( value.equals( Values.NULL ) )
335+
{
336+
return defaultValue;
337+
}
338+
else
339+
{
340+
return value.asDouble();
341+
}
342+
}
343+
344+
}

driver/src/main/java/org/neo4j/driver/internal/value/ValueAdapter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.List;
2222
import java.util.Map;
2323

24+
import org.neo4j.driver.internal.types.InternalMapAccessorWithDefaultValue;
2425
import org.neo4j.driver.internal.types.TypeConstructor;
2526
import org.neo4j.driver.internal.types.TypeRepresentation;
2627
import org.neo4j.driver.v1.Value;
@@ -40,7 +41,7 @@
4041
import static org.neo4j.driver.v1.Values.ofValue;
4142
import static org.neo4j.driver.v1.Values.ofObject;
4243

43-
public abstract class ValueAdapter implements InternalValue
44+
public abstract class ValueAdapter extends InternalMapAccessorWithDefaultValue implements InternalValue
4445
{
4546
@Override
4647
public Value asValue()

driver/src/main/java/org/neo4j/driver/v1/Record.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.neo4j.driver.internal.value.NullValue;
2525
import org.neo4j.driver.v1.exceptions.ClientException;
2626
import org.neo4j.driver.v1.exceptions.NoSuchRecordException;
27+
import org.neo4j.driver.v1.types.MapAccessorWithDefaultValue;
2728
import org.neo4j.driver.v1.util.Function;
2829
import org.neo4j.driver.v1.util.Immutable;
2930
import org.neo4j.driver.v1.util.Pair;
@@ -39,7 +40,7 @@
3940
* @since 1.0
4041
*/
4142
@Immutable
42-
public interface Record
43+
public interface Record extends MapAccessorWithDefaultValue
4344
{
4445
/**
4546
* Retrieve the keys of the underlying map

0 commit comments

Comments
 (0)