Skip to content

Commit 9df57a2

Browse files
authored
Add convenient scan methods in AeroMapper to return a List of result. (#78)
Related GitHub issue: #77.
1 parent 7ff9b09 commit 9df57a2

File tree

4 files changed

+100
-7
lines changed

4 files changed

+100
-7
lines changed

src/main/java/com/aerospike/mapper/tools/AeroMapper.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,22 @@ public <T> void scan(ScanPolicy policy, @NotNull Class<T> clazz, @NotNull Proces
491491
}
492492
}
493493

494+
@Override
495+
public <T> List<T> scan(@NotNull Class<T> clazz) {
496+
return scan(null, clazz);
497+
}
498+
499+
@Override
500+
public <T> List<T> scan(ScanPolicy policy, @NotNull Class<T> clazz) {
501+
List<T> result = new ArrayList<>();
502+
Processor<T> resultProcessor = record -> {
503+
result.add(record);
504+
return true;
505+
};
506+
scan(policy, clazz, resultProcessor);
507+
return result;
508+
}
509+
494510
@Override
495511
public <T> void query(@NotNull Class<T> clazz, @NotNull Processor<T> processor, Filter filter) {
496512
query(null, clazz, processor, filter);

src/main/java/com/aerospike/mapper/tools/IAeroMapper.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,23 @@ public interface IAeroMapper extends IBaseAeroMapper {
251251
*/
252252
<T> void scan(ScanPolicy policy, @NotNull Class<T> clazz, @NotNull Processor<T> processor, int recordsPerSecond);
253253

254+
/**
255+
* Scan every record in the set associated with the passed class
256+
* and returns the list of records converted to the appropriate class.
257+
*
258+
* @param clazz - the class used to determine which set to scan and to convert the returned records to.
259+
*/
260+
<T> List<T> scan(@NotNull Class<T> clazz);
261+
262+
/**
263+
* Scan every record in the set associated with the passed class using a provided ScanPolicy
264+
* and returns the list of records converted to the appropriate class.
265+
*
266+
* @param policy - the scan policy to use. If this is null, the default scan policy of the passed class will be used.
267+
* @param clazz - the class used to determine which set to scan and to convert the returned records to.
268+
*/
269+
<T> List<T> scan(ScanPolicy policy, @NotNull Class<T> clazz);
270+
254271
/**
255272
* Perform a secondary index query with the specified query policy. Each record will be converted
256273
* to the appropriate class then passed to the processor. If the processor returns false the query is aborted

src/test/java/com/aerospike/mapper/QueryTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public int hashCode() {
7171
}
7272
}
7373

74-
private List<A> data = new ArrayList<A>() {{
74+
private final List<A> data = new ArrayList<A>() {{
7575
add(new A(1, "Tim", 312));
7676
add(new A(2, "Bob", 44));
7777
add(new A(3, "Sue", 56));

src/test/java/com/aerospike/mapper/ScanTest.java

Lines changed: 66 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
package com.aerospike.mapper;
22

3+
import static java.util.Comparator.comparing;
4+
import static java.util.stream.Collectors.toList;
35
import static org.junit.jupiter.api.Assertions.assertEquals;
46

7+
import java.util.ArrayList;
8+
import java.util.List;
9+
import java.util.Objects;
510
import java.util.concurrent.atomic.AtomicInteger;
611

712
import org.junit.jupiter.api.Test;
@@ -39,17 +44,43 @@ public String getName() {
3944
public int getAge() {
4045
return age;
4146
}
47+
48+
@Override
49+
public String toString() {
50+
return String.format("id:%d, name:%s, age:%d", id, name, age);
51+
}
52+
53+
@Override
54+
public boolean equals(Object o) {
55+
if (this == o) {
56+
return true;
57+
}
58+
if (o == null || getClass() != o.getClass()) {
59+
return false;
60+
}
61+
Person person = (Person) o;
62+
return id == person.id && age == person.age && Objects.equals(name, person.name);
63+
}
64+
65+
@Override
66+
public int hashCode() {
67+
return Objects.hash(id, name, age);
68+
}
4269
}
4370

71+
private final List<Person> data = new ArrayList<Person>() {{
72+
add(new Person(1, "Tim", 312));
73+
add(new Person(2, "Bob", 44));
74+
add(new Person(3, "Sue", 56));
75+
add(new Person(4, "Rob", 23));
76+
add(new Person(5, "Jim", 32));
77+
add(new Person(6, "Bob", 78));
78+
}};
79+
4480
private AeroMapper populate() {
4581
client.truncate(null, "test", "testScan", null);
4682
AeroMapper mapper = new AeroMapper.Builder(client).build();
47-
mapper.save(new Person(1, "Tim", 312),
48-
new Person(2, "Bob", 44),
49-
new Person(3, "Sue", 56),
50-
new Person(4, "Rob", 23),
51-
new Person(5, "Jim", 32),
52-
new Person(6, "Bob", 78));
83+
mapper.save(data.toArray());
5384
return mapper;
5485
}
5586

@@ -89,4 +120,33 @@ public void scanTestWithAbort() {
89120
});
90121
assertEquals(1, counter.get());
91122
}
123+
124+
@Test
125+
public void scanTestReturnsList() {
126+
AeroMapper mapper = populate();
127+
128+
List<Person> result = mapper.scan(Person.class);
129+
130+
List<Person> expected = data.stream()
131+
.sorted(comparing(Person::getId))
132+
.collect(toList());
133+
assertEquals(6, result.size());
134+
assertEquals(expected, result.stream().sorted(comparing(Person::getId)).collect(toList()));
135+
}
136+
137+
@Test
138+
public void scanWithScanPolicyTestReturnsList() {
139+
AeroMapper mapper = populate();
140+
ScanPolicy scanPolicy = new ScanPolicy();
141+
scanPolicy.filterExp = Exp.build(Exp.eq(Exp.stringBin("name"), Exp.val("Bob")));
142+
143+
List<Person> result = mapper.scan(scanPolicy, Person.class);
144+
145+
List<Person> expected = data.stream()
146+
.filter(d -> d.name.equals("Bob"))
147+
.sorted(comparing(Person::getId))
148+
.collect(toList());
149+
assertEquals(2, result.size());
150+
assertEquals(expected, result.stream().sorted(comparing(Person::getId)).collect(toList()));
151+
}
92152
}

0 commit comments

Comments
 (0)