Skip to content

Commit 6d8282d

Browse files
authored
Merge pull request #497 from zinal/query-reader-setRowIndex
fix(query): QueryReader.setRowIndex() logic correction
2 parents c82ade3 + fe7e612 commit 6d8282d

File tree

2 files changed

+124
-3
lines changed

2 files changed

+124
-3
lines changed

query/src/main/java/tech/ydb/query/tools/QueryReader.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public class QueryReader implements Iterable<ResultSetReader> {
2828
private final List<Issue> isssues;
2929
private final List<ResultSetParts> results;
3030

31-
private QueryReader(QueryInfo info, List<Issue> issues, List<ResultSetParts> results) {
31+
QueryReader(QueryInfo info, List<Issue> issues, List<ResultSetParts> results) {
3232
this.info = info;
3333
this.isssues = issues;
3434
this.results = results;
@@ -113,7 +113,7 @@ public void onNextPart(QueryResultPart part) {
113113
}
114114
}
115115

116-
private static class ResultSetParts {
116+
static class ResultSetParts {
117117
private final long resultSetIndex;
118118
private final List<QueryResultPart> parts = new ArrayList<>();
119119

@@ -211,12 +211,15 @@ public void setRowIndex(int index) {
211211
int readerRows = parts.get(partIndex).getRowCount();
212212
if (currentIdx < readerRows) {
213213
parts.get(partIndex).setRowIndex(currentIdx);
214-
return;
214+
break;
215215
}
216216
parts.get(partIndex).setRowIndex(readerRows - 1);
217217
currentIdx -= readerRows;
218218
partIndex++;
219219
}
220+
for (int partStep = partIndex + 1; partStep < parts.size(); partStep++) {
221+
parts.get(partStep).setRowIndex(0);
222+
}
220223
}
221224

222225
@Override
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
package tech.ydb.query.tools;
2+
3+
import java.util.Arrays;
4+
import org.junit.Assert;
5+
import org.junit.Test;
6+
import tech.ydb.proto.ValueProtos;
7+
import tech.ydb.query.result.QueryInfo;
8+
import tech.ydb.query.result.QueryResultPart;
9+
import tech.ydb.table.result.ResultSetReader;
10+
11+
/**
12+
*
13+
* @author zinal
14+
*/
15+
public class QueryReaderTest {
16+
17+
@Test
18+
public void testNextAndSetIndex() {
19+
QueryInfo qi = new QueryInfo(null);
20+
QueryReader.ResultSetParts rsp0 = initRsp(0L);
21+
QueryReader.ResultSetParts rsp1 = initRsp(1L);
22+
QueryReader.ResultSetParts rsp2 = initRsp(2L);
23+
QueryReader qr = new QueryReader(qi, null, Arrays.asList(rsp0, rsp1, rsp2));
24+
checkRows(qr, 0);
25+
checkRows(qr, 1);
26+
checkRows(qr, 2);
27+
}
28+
29+
private QueryReader.ResultSetParts initRsp(long ix) {
30+
QueryReader.ResultSetParts rsp = new QueryReader.ResultSetParts(ix);
31+
rsp.addPart(initQrp(ix));
32+
rsp.addPart(initQrp(ix));
33+
rsp.addPart(initQrp(ix));
34+
rsp.addPart(initQrp(ix));
35+
return rsp;
36+
}
37+
38+
private QueryResultPart initQrp(long ix) {
39+
ValueProtos.ResultSet.Builder rsBuilder = ValueProtos.ResultSet.newBuilder();
40+
rsBuilder.setTruncated(false);
41+
rsBuilder.addColumns(ValueProtos.Column.newBuilder()
42+
.setName("a")
43+
.setType(ValueProtos.Type.newBuilder().setTypeIdValue(ValueProtos.Type.PrimitiveTypeId.INT32_VALUE).build())
44+
.build()
45+
);
46+
rsBuilder.addColumns(ValueProtos.Column.newBuilder()
47+
.setName("b")
48+
.setType(ValueProtos.Type.newBuilder().setTypeIdValue(ValueProtos.Type.PrimitiveTypeId.UTF8_VALUE).build())
49+
.build()
50+
);
51+
rsBuilder.addColumns(ValueProtos.Column.newBuilder()
52+
.setName("c")
53+
.setType(ValueProtos.Type.newBuilder().setTypeIdValue(ValueProtos.Type.PrimitiveTypeId.INT64_VALUE).build())
54+
.build()
55+
);
56+
rsBuilder.addRows(ValueProtos.Value.newBuilder()
57+
.addItems(ValueProtos.Value.newBuilder()
58+
.setInt32Value(10)
59+
.build())
60+
.addItems(ValueProtos.Value.newBuilder()
61+
.setTextValue("aaa")
62+
.build())
63+
.addItems(ValueProtos.Value.newBuilder()
64+
.setInt64Value(100L)
65+
.build())
66+
.build());
67+
rsBuilder.addRows(ValueProtos.Value.newBuilder()
68+
.addItems(ValueProtos.Value.newBuilder()
69+
.setInt32Value(20)
70+
.build())
71+
.addItems(ValueProtos.Value.newBuilder()
72+
.setTextValue("bbb")
73+
.build())
74+
.addItems(ValueProtos.Value.newBuilder()
75+
.setInt64Value(200L)
76+
.build())
77+
.build());
78+
rsBuilder.addRows(ValueProtos.Value.newBuilder()
79+
.addItems(ValueProtos.Value.newBuilder()
80+
.setInt32Value(30)
81+
.build())
82+
.addItems(ValueProtos.Value.newBuilder()
83+
.setTextValue("ccc")
84+
.build())
85+
.addItems(ValueProtos.Value.newBuilder()
86+
.setInt64Value(300L)
87+
.build())
88+
.build());
89+
return new QueryResultPart(ix, rsBuilder.build());
90+
}
91+
92+
private void checkRows(QueryReader qr, int rsIndex) {
93+
ResultSetReader rsr = qr.getResultSet(rsIndex);
94+
Assert.assertNotNull(rsr);
95+
96+
Assert.assertEquals(3, rsr.getColumnCount());
97+
Assert.assertEquals("a", rsr.getColumnName(0));
98+
Assert.assertEquals("b", rsr.getColumnName(1));
99+
Assert.assertEquals("c", rsr.getColumnName(2));
100+
101+
int rowCount = 0;
102+
while (rsr.next()) {
103+
Assert.assertNotNull(rsr.getColumn(0));
104+
Assert.assertNotNull(rsr.getColumn(1));
105+
Assert.assertNotNull(rsr.getColumn(2));
106+
rowCount += 1;
107+
}
108+
Assert.assertEquals(12, rowCount);
109+
110+
rsr.setRowIndex(0);
111+
rowCount = 0;
112+
while (rsr.next()) {
113+
rowCount += 1;
114+
}
115+
Assert.assertEquals(12, rowCount);
116+
}
117+
118+
}

0 commit comments

Comments
 (0)