Skip to content

Commit 0452a1a

Browse files
authored
Refactor Scanner related code (#2592)
1 parent 8859352 commit 0452a1a

File tree

10 files changed

+77
-139
lines changed

10 files changed

+77
-139
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package com.scalar.db.common;
2+
3+
import com.google.errorprone.annotations.concurrent.LazyInit;
4+
import com.scalar.db.api.Result;
5+
import com.scalar.db.api.Scanner;
6+
import com.scalar.db.exception.storage.ExecutionException;
7+
import java.util.Iterator;
8+
import java.util.NoSuchElementException;
9+
import java.util.Objects;
10+
import javax.annotation.Nonnull;
11+
import javax.annotation.concurrent.NotThreadSafe;
12+
13+
public abstract class AbstractScanner implements Scanner {
14+
15+
@LazyInit private ScannerIterator scannerIterator;
16+
17+
@Override
18+
@Nonnull
19+
public Iterator<Result> iterator() {
20+
if (scannerIterator == null) {
21+
scannerIterator = new ScannerIterator(this);
22+
}
23+
return scannerIterator;
24+
}
25+
26+
@NotThreadSafe
27+
public static class ScannerIterator implements Iterator<Result> {
28+
29+
private final Scanner scanner;
30+
private Result next;
31+
32+
public ScannerIterator(Scanner scanner) {
33+
this.scanner = Objects.requireNonNull(scanner);
34+
}
35+
36+
@Override
37+
public boolean hasNext() {
38+
if (next != null) {
39+
return true;
40+
}
41+
42+
try {
43+
return (next = scanner.one().orElse(null)) != null;
44+
} catch (ExecutionException e) {
45+
throw new RuntimeException(e.getMessage(), e);
46+
}
47+
}
48+
49+
@Override
50+
public Result next() {
51+
if (!hasNext()) {
52+
throw new NoSuchElementException();
53+
}
54+
55+
Result ret = next;
56+
next = null;
57+
return ret;
58+
}
59+
}
60+
}

core/src/main/java/com/scalar/db/common/EmptyScanner.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66
import java.util.Iterator;
77
import java.util.List;
88
import java.util.Optional;
9+
import javax.annotation.Nonnull;
10+
import javax.annotation.concurrent.NotThreadSafe;
911

12+
@NotThreadSafe
1013
public class EmptyScanner implements Scanner {
1114

1215
@Override
@@ -23,6 +26,7 @@ public List<Result> all() {
2326
public void close() {}
2427

2528
@Override
29+
@Nonnull
2630
public Iterator<Result> iterator() {
2731
return Collections.emptyIterator();
2832
}

core/src/main/java/com/scalar/db/common/FilterableScanner.java

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.scalar.db.common;
22

3-
import com.google.errorprone.annotations.concurrent.LazyInit;
43
import com.scalar.db.api.Result;
54
import com.scalar.db.api.Scan;
65
import com.scalar.db.api.Scanner;
@@ -11,22 +10,19 @@
1110
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
1211
import java.io.IOException;
1312
import java.util.ArrayList;
14-
import java.util.Iterator;
1513
import java.util.List;
1614
import java.util.Optional;
1715
import java.util.Set;
18-
import javax.annotation.Nonnull;
1916
import javax.annotation.Nullable;
2017
import javax.annotation.concurrent.NotThreadSafe;
2118

2219
@NotThreadSafe
23-
public class FilterableScanner implements Scanner {
20+
public class FilterableScanner extends AbstractScanner {
2421

2522
private final Scanner scanner;
2623
private final List<String> projections;
2724
private final Set<Conjunction> conjunctions;
2825
@Nullable private Integer left = null;
29-
@LazyInit private ScannerIterator scannerIterator;
3026

3127
public FilterableScanner(Selection selection, Scanner scanner) {
3228
this.scanner = scanner;
@@ -72,15 +68,6 @@ public List<Result> all() throws ExecutionException {
7268
return ret;
7369
}
7470

75-
@Override
76-
@Nonnull
77-
public Iterator<Result> iterator() {
78-
if (scannerIterator == null) {
79-
scannerIterator = new ScannerIterator(this);
80-
}
81-
return scannerIterator;
82-
}
83-
8471
@Override
8572
public void close() throws IOException {
8673
scanner.close();

core/src/main/java/com/scalar/db/common/ScannerIterator.java

Lines changed: 0 additions & 44 deletions
This file was deleted.

core/src/main/java/com/scalar/db/storage/cassandra/ScannerImpl.java

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,18 @@
55
import com.datastax.driver.core.ResultSet;
66
import com.datastax.driver.core.Row;
77
import com.scalar.db.api.Result;
8-
import com.scalar.db.api.Scanner;
9-
import com.scalar.db.common.ScannerIterator;
8+
import com.scalar.db.common.AbstractScanner;
109
import java.util.ArrayList;
11-
import java.util.Iterator;
1210
import java.util.List;
1311
import java.util.Optional;
1412
import javax.annotation.Nonnull;
1513
import javax.annotation.concurrent.NotThreadSafe;
1614

1715
@NotThreadSafe
18-
public final class ScannerImpl implements Scanner {
16+
public final class ScannerImpl extends AbstractScanner {
1917
private final ResultSet resultSet;
2018
private final ResultInterpreter resultInterpreter;
2119

22-
private ScannerIterator scannerIterator;
23-
2420
public ScannerImpl(ResultSet resultSet, ResultInterpreter resultInterpreter) {
2521
this.resultSet = checkNotNull(resultSet);
2622
this.resultInterpreter = checkNotNull(resultInterpreter);
@@ -44,15 +40,6 @@ public List<Result> all() {
4440
return results;
4541
}
4642

47-
@Override
48-
@Nonnull
49-
public Iterator<Result> iterator() {
50-
if (scannerIterator == null) {
51-
scannerIterator = new ScannerIterator(this);
52-
}
53-
return scannerIterator;
54-
}
55-
5643
@Override
5744
public void close() {}
5845
}

core/src/main/java/com/scalar/db/storage/cosmos/ScannerImpl.java

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44

55
import com.azure.cosmos.models.FeedResponse;
66
import com.scalar.db.api.Result;
7-
import com.scalar.db.api.Scanner;
8-
import com.scalar.db.common.ScannerIterator;
7+
import com.scalar.db.common.AbstractScanner;
98
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
109
import java.util.ArrayList;
1110
import java.util.Collections;
@@ -16,12 +15,11 @@
1615
import javax.annotation.concurrent.NotThreadSafe;
1716

1817
@NotThreadSafe
19-
public final class ScannerImpl implements Scanner {
18+
public final class ScannerImpl extends AbstractScanner {
2019

2120
private final ResultInterpreter resultInterpreter;
2221
private Iterator<FeedResponse<Record>> recordsPages;
2322
private Iterator<Record> currentPageRecords;
24-
private ScannerIterator scannerIterator;
2523

2624
/**
2725
* Create a Scanner for Cosmos DB query operations
@@ -73,15 +71,6 @@ public List<Result> all() {
7371
return ret;
7472
}
7573

76-
@Override
77-
@Nonnull
78-
public Iterator<Result> iterator() {
79-
if (scannerIterator == null) {
80-
scannerIterator = new ScannerIterator(this);
81-
}
82-
return scannerIterator;
83-
}
84-
8574
@Override
8675
public void close() {}
8776
}

core/src/main/java/com/scalar/db/storage/cosmos/SingleRecordScanner.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,17 @@
22

33
import com.google.common.collect.ImmutableList;
44
import com.scalar.db.api.Result;
5-
import com.scalar.db.api.Scanner;
5+
import com.scalar.db.common.AbstractScanner;
66
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
77
import java.util.Collections;
8-
import java.util.Iterator;
98
import java.util.List;
109
import java.util.Optional;
1110
import javax.annotation.Nonnull;
1211
import javax.annotation.Nullable;
1312
import javax.annotation.concurrent.NotThreadSafe;
1413

1514
@NotThreadSafe
16-
public final class SingleRecordScanner implements Scanner {
15+
public final class SingleRecordScanner extends AbstractScanner {
1716

1817
@Nullable private Record record;
1918
private final ResultInterpreter resultInterpreter;
@@ -48,12 +47,6 @@ record = null;
4847
}
4948
}
5049

51-
@Override
52-
@Nonnull
53-
public Iterator<Result> iterator() {
54-
return all().iterator();
55-
}
56-
5750
@Override
5851
public void close() {}
5952
}

core/src/main/java/com/scalar/db/storage/dynamo/GetItemScanner.java

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
package com.scalar.db.storage.dynamo;
22

33
import com.scalar.db.api.Result;
4-
import com.scalar.db.api.Scanner;
5-
import com.scalar.db.common.ScannerIterator;
4+
import com.scalar.db.common.AbstractScanner;
65
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
76
import java.util.Collections;
8-
import java.util.Iterator;
97
import java.util.List;
108
import java.util.Map;
119
import java.util.Optional;
@@ -17,12 +15,11 @@
1715
import software.amazon.awssdk.services.dynamodb.model.GetItemResponse;
1816

1917
@NotThreadSafe
20-
public final class GetItemScanner implements Scanner {
18+
public final class GetItemScanner extends AbstractScanner {
2119
private final Map<String, AttributeValue> item;
2220
private final ResultInterpreter resultInterpreter;
2321

2422
private boolean hasNext;
25-
private ScannerIterator scannerIterator;
2623

2724
@SuppressFBWarnings("EI_EXPOSE_REP2")
2825
public GetItemScanner(
@@ -61,15 +58,6 @@ public List<Result> all() {
6158
return Collections.singletonList(result);
6259
}
6360

64-
@Override
65-
@Nonnull
66-
public Iterator<Result> iterator() {
67-
if (scannerIterator == null) {
68-
scannerIterator = new ScannerIterator(this);
69-
}
70-
return scannerIterator;
71-
}
72-
7361
@Override
7462
public void close() {}
7563
}

core/src/main/java/com/scalar/db/storage/dynamo/QueryScanner.java

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package com.scalar.db.storage.dynamo;
22

33
import com.scalar.db.api.Result;
4-
import com.scalar.db.api.Scanner;
5-
import com.scalar.db.common.ScannerIterator;
4+
import com.scalar.db.common.AbstractScanner;
65
import com.scalar.db.storage.dynamo.request.PaginatedRequest;
76
import com.scalar.db.storage.dynamo.request.PaginatedRequestResponse;
87
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
@@ -17,7 +16,7 @@
1716
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
1817

1918
@NotThreadSafe
20-
public class QueryScanner implements Scanner {
19+
public class QueryScanner extends AbstractScanner {
2120

2221
private final PaginatedRequest request;
2322
private final ResultInterpreter resultInterpreter;
@@ -26,8 +25,6 @@ public class QueryScanner implements Scanner {
2625
@Nullable private Integer remainingLimit;
2726
@Nullable private Map<String, AttributeValue> lastEvaluatedKey;
2827

29-
private ScannerIterator scannerIterator;
30-
3128
@SuppressFBWarnings("EI_EXPOSE_REP2")
3229
public QueryScanner(PaginatedRequest request, int limit, ResultInterpreter resultInterpreter) {
3330
this.request = request;
@@ -95,15 +92,6 @@ public List<Result> all() {
9592
return ret;
9693
}
9794

98-
@Override
99-
@Nonnull
100-
public Iterator<Result> iterator() {
101-
if (scannerIterator == null) {
102-
scannerIterator = new ScannerIterator(this);
103-
}
104-
return scannerIterator;
105-
}
106-
10795
@Override
10896
public void close() {}
10997
}

0 commit comments

Comments
 (0)