Skip to content

Commit 0319f78

Browse files
committed
Fix restart position handling in AbstractPaginatedDataItemReader#jumpToItem
Signed-off-by: banseok1216 <[email protected]>
1 parent c8a0528 commit 0319f78

File tree

3 files changed

+151
-1
lines changed

3 files changed

+151
-1
lines changed

spring-batch-infrastructure/src/main/java/org/springframework/batch/infrastructure/item/data/AbstractPaginatedDataItemReader.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,10 @@ protected void jumpToItem(int itemLastIndex) throws Exception {
118118

119119
Iterator<T> initialPage = doPageRead();
120120

121-
for (; current >= 0; current--) {
121+
for (; current > 0; current--) {
122122
initialPage.next();
123123
}
124+
this.results = initialPage;
124125
}
125126
finally {
126127
this.lock.unlock();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package org.springframework.batch.infrastructure.item.data;
2+
3+
import org.junit.jupiter.api.Test;
4+
import org.springframework.batch.infrastructure.item.ExecutionContext;
5+
6+
import java.util.Iterator;
7+
import java.util.List;
8+
9+
import static org.junit.jupiter.api.Assertions.*;
10+
11+
class AbstractPaginatedDataItemReaderTests {
12+
13+
static class PaginatedDataItemReader extends AbstractPaginatedDataItemReader<Integer> {
14+
15+
private final List<Integer> data = List.of(
16+
0,1,2,3,4,5,6,7,8,9,
17+
10,11,12,13,14,15,16,17,18,19
18+
);
19+
20+
@Override
21+
protected Iterator<Integer> doPageRead() {
22+
int start = page * pageSize;
23+
int end = Math.min(start + pageSize, data.size());
24+
return data.subList(start, end).iterator();
25+
}
26+
}
27+
28+
@Test
29+
void jumpToItem_shouldReadExactItem_afterJump() throws Exception {
30+
PaginatedDataItemReader reader = new PaginatedDataItemReader();
31+
reader.open(new ExecutionContext());
32+
33+
reader.jumpToItem(7);
34+
35+
Integer value = reader.read();
36+
assertEquals(7, value);
37+
}
38+
39+
@Test
40+
void jumpToItem_zeroIndex() throws Exception {
41+
PaginatedDataItemReader reader = new PaginatedDataItemReader();
42+
reader.open(new ExecutionContext());
43+
44+
reader.jumpToItem(0);
45+
46+
Integer value = reader.read();
47+
assertEquals(0, value);
48+
}
49+
50+
@Test
51+
void jumpToItem_lastItemInPage() throws Exception {
52+
PaginatedDataItemReader reader = new PaginatedDataItemReader();
53+
reader.open(new ExecutionContext());
54+
55+
reader.jumpToItem(9);
56+
57+
Integer value = reader.read();
58+
assertEquals(9, value);
59+
}
60+
61+
@Test
62+
void jumpToItem_firstItemOfNextPage() throws Exception {
63+
PaginatedDataItemReader reader = new PaginatedDataItemReader();
64+
reader.open(new ExecutionContext());
65+
66+
reader.jumpToItem(10);
67+
68+
Integer value = reader.read();
69+
assertEquals(10, value);
70+
}
71+
72+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package org.springframework.batch.infrastructure.item.database;
2+
3+
import org.junit.jupiter.api.Test;
4+
import org.springframework.batch.infrastructure.item.ExecutionContext;
5+
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
9+
import static org.junit.jupiter.api.Assertions.*;
10+
11+
class AbstractPagingItemReaderTests {
12+
13+
static class PagingItemReader extends AbstractPagingItemReader<Integer> {
14+
15+
private final List<Integer> data = List.of(
16+
0,1,2,3,4,5,6,7,8,9,
17+
10,11,12,13,14,15,16,17,18,19
18+
);
19+
20+
@Override
21+
protected void doReadPage() {
22+
int start = getPage() * getPageSize();
23+
int end = Math.min(start + getPageSize(), data.size());
24+
25+
if (start >= data.size()) {
26+
results = List.of();
27+
return;
28+
}
29+
30+
List<Integer> pageData = new ArrayList<>();
31+
for (int i = start; i < end; i++) {
32+
pageData.add(data.get(i));
33+
}
34+
35+
this.results = pageData;
36+
}
37+
38+
@Override
39+
protected void doOpen() {}
40+
}
41+
42+
@Test
43+
void jumpToItem_shouldReadExactItem_afterJump() throws Exception {
44+
PagingItemReader reader = new PagingItemReader();
45+
reader.open(new ExecutionContext());
46+
47+
reader.jumpToItem(7);
48+
assertEquals(7, reader.read());
49+
}
50+
51+
@Test
52+
void jumpToItem_zeroIndex() throws Exception {
53+
PagingItemReader reader = new PagingItemReader();
54+
reader.open(new ExecutionContext());
55+
56+
reader.jumpToItem(0);
57+
assertEquals(0, reader.read());
58+
}
59+
60+
@Test
61+
void jumpToItem_lastItemInFirstPage() throws Exception {
62+
PagingItemReader reader = new PagingItemReader();
63+
reader.open(new ExecutionContext());
64+
65+
reader.jumpToItem(9);
66+
assertEquals(9, reader.read());
67+
}
68+
69+
@Test
70+
void jumpToItem_firstItemOfNextPage() throws Exception {
71+
PagingItemReader reader = new PagingItemReader();
72+
reader.open(new ExecutionContext());
73+
74+
reader.jumpToItem(10);
75+
assertEquals(10, reader.read());
76+
}
77+
}

0 commit comments

Comments
 (0)