Skip to content

Commit 85b8404

Browse files
committed
Merge pull request #140 from pontusmelke/1.0-order-keys
Preserve order in Extract.map
2 parents 22abd62 + eb3ad53 commit 85b8404

File tree

3 files changed

+55
-9
lines changed

3 files changed

+55
-9
lines changed

driver/src/main/java/org/neo4j/driver/internal/util/Extract.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,16 @@
2020

2121
import java.util.ArrayList;
2222
import java.util.Arrays;
23-
import java.util.HashMap;
23+
import java.util.LinkedHashMap;
2424
import java.util.List;
2525
import java.util.Map;
2626

2727
import org.neo4j.driver.internal.InternalPair;
28-
import org.neo4j.driver.v1.util.Function;
29-
import org.neo4j.driver.v1.types.MapAccessor;
30-
import org.neo4j.driver.v1.util.Pair;
3128
import org.neo4j.driver.v1.Record;
3229
import org.neo4j.driver.v1.Value;
30+
import org.neo4j.driver.v1.types.MapAccessor;
31+
import org.neo4j.driver.v1.util.Function;
32+
import org.neo4j.driver.v1.util.Pair;
3333

3434
import static java.util.Collections.emptyList;
3535
import static java.util.Collections.emptyMap;
@@ -102,7 +102,7 @@ public static <T> Map<String, T> map( Map<String, Value> data, Function<Value, T
102102
Map.Entry<String, Value> head = data.entrySet().iterator().next();
103103
return singletonMap( head.getKey(), mapFunction.apply( head.getValue() ) );
104104
} else {
105-
Map<String, T> map = new HashMap<>( size );
105+
Map<String, T> map = new LinkedHashMap<>( size );
106106
for ( Map.Entry<String, Value> entry : data.entrySet() )
107107
{
108108
map.put( entry.getKey(), mapFunction.apply( entry.getValue() ) );
@@ -124,7 +124,7 @@ public static <T> Map<String, T> map( Record record, Function<Value, T> mapFunct
124124
return singletonMap( record.keys().get( 0 ), mapFunction.apply( record.get( 0 ) ) );
125125

126126
default:
127-
Map<String, T> map = new HashMap<>( size );
127+
Map<String, T> map = new LinkedHashMap<>( size );
128128
List<String> keys = record.keys();
129129
for ( int i = 0; i < size; i++ )
130130
{

driver/src/test/java/org/neo4j/driver/internal/ExtractTest.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,27 +27,29 @@
2727
import java.util.Collections;
2828
import java.util.HashMap;
2929
import java.util.Iterator;
30+
import java.util.LinkedHashMap;
3031
import java.util.List;
3132
import java.util.Map;
3233

3334
import org.neo4j.driver.internal.spi.Connection;
3435
import org.neo4j.driver.internal.util.Extract;
3536
import org.neo4j.driver.v1.Statement;
37+
import org.neo4j.driver.v1.Value;
3638
import org.neo4j.driver.v1.Values;
3739
import org.neo4j.driver.v1.util.Function;
3840
import org.neo4j.driver.v1.util.Pair;
39-
import org.neo4j.driver.v1.Value;
4041

4142
import static java.util.Arrays.asList;
4243
import static java.util.Collections.singletonList;
4344
import static org.hamcrest.CoreMatchers.equalTo;
45+
import static org.hamcrest.Matchers.contains;
4446
import static org.hamcrest.Matchers.containsInAnyOrder;
4547
import static org.hamcrest.Matchers.empty;
4648
import static org.junit.Assert.assertFalse;
4749
import static org.junit.Assert.assertThat;
4850
import static org.mockito.Mockito.mock;
49-
import static org.neo4j.driver.v1.Values.value;
5051
import static org.neo4j.driver.v1.Values.ofValue;
52+
import static org.neo4j.driver.v1.Values.value;
5153

5254
public class ExtractTest
5355
{
@@ -125,6 +127,23 @@ public void testMapValues() throws Exception
125127

126128
}
127129

130+
@Test
131+
public void testShouldPreserveMapOrderMapValues() throws Exception
132+
{
133+
// GIVEN
134+
Map<String,Value> map = new LinkedHashMap<>();
135+
map.put( "k2", value( 43 ) );
136+
map.put( "k1", value( 42 ) );
137+
138+
// WHEN
139+
Map<String,Integer> mappedMap = Extract.map( map, integerExtractor() );
140+
141+
// THEN
142+
Collection<Integer> values = mappedMap.values();
143+
assertThat( values, contains( 43, 42) );
144+
145+
}
146+
128147
@Test
129148
public void testProperties() throws Exception
130149
{

driver/src/test/java/org/neo4j/driver/internal/InternalRecordTest.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.junit.Test;
2222

2323
import java.util.Arrays;
24+
import java.util.Iterator;
2425
import java.util.List;
2526
import java.util.Map;
2627
import java.util.NoSuchElementException;
@@ -31,6 +32,7 @@
3132
import org.neo4j.driver.v1.util.Function;
3233

3334
import static org.hamcrest.CoreMatchers.equalTo;
35+
import static org.hamcrest.Matchers.contains;
3436
import static org.hamcrest.Matchers.containsInAnyOrder;
3537
import static org.junit.Assert.assertFalse;
3638
import static org.junit.Assert.assertThat;
@@ -143,11 +145,36 @@ public Integer apply( Value value )
143145
Map<String,Integer> map = Extract.map( record, addOne );
144146

145147
// THEN
146-
assertThat( map.keySet(), containsInAnyOrder( "k1", "k2" ) );
148+
assertThat( map.keySet(), contains( "k1", "k2" ) );
147149
assertThat( map.get( "k1" ), equalTo( 1 ) );
148150
assertThat( map.get( "k2" ), equalTo( 2 ) );
149151
}
150152

153+
@Test
154+
public void mapExtractionShouldPreserveIterationOrder()
155+
{
156+
// GIVEN
157+
List<String> keys = Arrays.asList( "k2", "k1" );
158+
InternalRecord record = new InternalRecord( keys, new Value[]{value( 0 ), value( 1 )} );
159+
Function<Value,Integer> addOne = new Function<Value,Integer>()
160+
{
161+
@Override
162+
public Integer apply( Value value )
163+
{
164+
return value.asInt() + 1;
165+
}
166+
};
167+
168+
// WHEN
169+
Map<String,Integer> map = Extract.map( record, addOne );
170+
171+
// THEN
172+
assertThat( map.keySet(), contains( "k2", "k1" ) );
173+
Iterator<Integer> values = map.values().iterator();
174+
assertThat( values.next(), equalTo( 1 ) );
175+
assertThat( values.next(), equalTo( 2 ) );
176+
}
177+
151178
@Test
152179
public void testToString()
153180
{

0 commit comments

Comments
 (0)