Skip to content

Commit dd27faf

Browse files
authored
Fix/table model date query read (#738)
* fix readme logo * fix readme logo * fix readme badge * fix table-model DATE query in Java reader Handle DATE columns in SingleDeviceTsBlockReader projection paths and add a regression test to prevent table query failures when reading DATE values. * fix support TIMESTAMP STRING BLOB in table read path Extend table-model query projection to handle TIMESTAMP/STRING/BLOB (and aligned aliases) and update TsFileSequenceRead example decoding with matching type coverage; add regression test for timestamp/string/blob query. * mvn spotless:apply * docs narrow TsFileSequenceRead type coverage Remove OBJECT from the TsFileSequenceRead example switch so the sample only demonstrates documented primitive and binary-like types.
1 parent 7c01e4f commit dd27faf

3 files changed

Lines changed: 105 additions & 0 deletions

File tree

java/examples/src/main/java/org/apache/tsfile/TsFileSequenceRead.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,9 +155,11 @@ public static void main(String[] args) throws IOException {
155155
value = valueDecoder.readBoolean(pageData);
156156
break;
157157
case INT32:
158+
case DATE:
158159
value = valueDecoder.readInt(pageData);
159160
break;
160161
case INT64:
162+
case TIMESTAMP:
161163
value = valueDecoder.readLong(pageData);
162164
break;
163165
case FLOAT:
@@ -167,6 +169,8 @@ public static void main(String[] args) throws IOException {
167169
value = valueDecoder.readDouble(pageData);
168170
break;
169171
case TEXT:
172+
case STRING:
173+
case BLOB:
170174
value = valueDecoder.readBinary(pageData);
171175
break;
172176
default:

java/tsfile/src/main/java/org/apache/tsfile/read/reader/block/SingleDeviceTsBlockReader.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,9 @@ private void advanceColumn(BatchData batchData, MeasurementColumnContext columnC
233233
private void fillIdColumn(Column column, Object val, int startPos, int endPos) {
234234
switch (column.getDataType()) {
235235
case TEXT:
236+
case STRING:
237+
case BLOB:
238+
case OBJECT:
236239
if (val instanceof String) {
237240
val = new Binary(((String) val), StandardCharsets.UTF_8);
238241
}
@@ -242,9 +245,11 @@ private void fillIdColumn(Column column, Object val, int startPos, int endPos) {
242245
Arrays.fill(column.getBooleans(), startPos, endPos, ((boolean) val));
243246
break;
244247
case INT32:
248+
case DATE:
245249
Arrays.fill(column.getInts(), startPos, endPos, ((int) val));
246250
break;
247251
case INT64:
252+
case TIMESTAMP:
248253
Arrays.fill(column.getLongs(), startPos, endPos, ((long) val));
249254
break;
250255
case FLOAT:
@@ -271,12 +276,17 @@ private static void fillSingleMeasurementColumn(Column column, BatchData batchDa
271276
column.getFloats()[pos] = batchData.getFloat();
272277
break;
273278
case INT32:
279+
case DATE:
274280
column.getInts()[pos] = batchData.getInt();
275281
break;
276282
case TEXT:
283+
case STRING:
284+
case BLOB:
285+
case OBJECT:
277286
column.getBinaries()[pos] = batchData.getBinary();
278287
break;
279288
case INT64:
289+
case TIMESTAMP:
280290
column.getLongs()[pos] = batchData.getLong();
281291
break;
282292
default:
@@ -372,12 +382,17 @@ void fillInto(TsBlock block, int blockRowNum) {
372382
if (value != null) {
373383
switch (value.getDataType()) {
374384
case TEXT:
385+
case STRING:
386+
case BLOB:
387+
case OBJECT:
375388
block.getColumn(pos).getBinaries()[blockRowNum] = value.getBinary();
376389
break;
377390
case INT32:
391+
case DATE:
378392
block.getColumn(pos).getInts()[blockRowNum] = value.getInt();
379393
break;
380394
case INT64:
395+
case TIMESTAMP:
381396
block.getColumn(pos).getLongs()[blockRowNum] = value.getLong();
382397
break;
383398
case BOOLEAN:

java/tsfile/src/test/java/org/apache/tsfile/write/TsFileWriteApiTest.java

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
import java.io.File;
6767
import java.io.IOException;
6868
import java.nio.ByteBuffer;
69+
import java.nio.charset.StandardCharsets;
6970
import java.time.LocalDate;
7071
import java.util.ArrayList;
7172
import java.util.Arrays;
@@ -1151,6 +1152,91 @@ public void writeAllNullValueTablet()
11511152
}
11521153
}
11531154

1155+
@Test
1156+
public void queryDateColumnInTableModel()
1157+
throws IOException, WriteProcessException, ReadProcessException {
1158+
setEnv(100 * 1024 * 1024, 10 * 1024);
1159+
TableSchema tableSchema =
1160+
new TableSchema(
1161+
"Table1",
1162+
Arrays.asList(
1163+
new ColumnSchema("tag1", TSDataType.STRING, ColumnCategory.TAG),
1164+
new ColumnSchema("s1", TSDataType.DATE, ColumnCategory.FIELD),
1165+
new ColumnSchema("s2", TSDataType.BOOLEAN, ColumnCategory.FIELD)));
1166+
LocalDate date = LocalDate.parse("1970-01-01");
1167+
Tablet tablet =
1168+
new Tablet(
1169+
Arrays.asList("tag1", "s1", "s2"),
1170+
Arrays.asList(TSDataType.STRING, TSDataType.DATE, TSDataType.BOOLEAN));
1171+
tablet.addTimestamp(0, 0);
1172+
tablet.addValue(0, "tag1", "d1");
1173+
tablet.addValue(0, "s1", date);
1174+
tablet.addValue(0, "s2", true);
1175+
1176+
try (ITsFileWriter writer =
1177+
new TsFileWriterBuilder().file(f).tableSchema(tableSchema).build()) {
1178+
writer.write(tablet);
1179+
}
1180+
1181+
try (ITsFileReader reader = new TsFileReaderBuilder().file(f).build();
1182+
ResultSet resultSet =
1183+
reader.query(
1184+
"table1", Arrays.asList("tag1", "s1", "s2"), Long.MIN_VALUE, Long.MAX_VALUE)) {
1185+
Assert.assertTrue(resultSet.next());
1186+
Assert.assertEquals(0L, resultSet.getLong("Time"));
1187+
Assert.assertEquals("d1", resultSet.getString("tag1"));
1188+
Assert.assertEquals(date, resultSet.getDate("s1"));
1189+
Assert.assertTrue(resultSet.getBoolean("s2"));
1190+
}
1191+
}
1192+
1193+
@Test
1194+
public void queryTimestampStringBlobColumnsInTableModel()
1195+
throws IOException, WriteProcessException, ReadProcessException {
1196+
setEnv(100 * 1024 * 1024, 10 * 1024);
1197+
TableSchema tableSchema =
1198+
new TableSchema(
1199+
"Table1",
1200+
Arrays.asList(
1201+
new ColumnSchema("tag1", TSDataType.STRING, ColumnCategory.TAG),
1202+
new ColumnSchema("s1", TSDataType.TIMESTAMP, ColumnCategory.FIELD),
1203+
new ColumnSchema("s2", TSDataType.STRING, ColumnCategory.FIELD),
1204+
new ColumnSchema("s3", TSDataType.BLOB, ColumnCategory.FIELD)));
1205+
long timestampValue = 123456789L;
1206+
String stringValue = "hello-string";
1207+
byte[] blobValue = "hello-blob".getBytes(StandardCharsets.UTF_8);
1208+
Tablet tablet =
1209+
new Tablet(
1210+
Arrays.asList("tag1", "s1", "s2", "s3"),
1211+
Arrays.asList(
1212+
TSDataType.STRING, TSDataType.TIMESTAMP, TSDataType.STRING, TSDataType.BLOB));
1213+
tablet.addTimestamp(0, 0);
1214+
tablet.addValue(0, "tag1", "d1");
1215+
tablet.addValue(0, "s1", timestampValue);
1216+
tablet.addValue(0, "s2", stringValue);
1217+
tablet.addValue(0, "s3", blobValue);
1218+
1219+
try (ITsFileWriter writer =
1220+
new TsFileWriterBuilder().file(f).tableSchema(tableSchema).build()) {
1221+
writer.write(tablet);
1222+
}
1223+
1224+
try (ITsFileReader reader = new TsFileReaderBuilder().file(f).build();
1225+
ResultSet resultSet =
1226+
reader.query(
1227+
"table1",
1228+
Arrays.asList("tag1", "s1", "s2", "s3"),
1229+
Long.MIN_VALUE,
1230+
Long.MAX_VALUE)) {
1231+
Assert.assertTrue(resultSet.next());
1232+
Assert.assertEquals(0L, resultSet.getLong("Time"));
1233+
Assert.assertEquals("d1", resultSet.getString("tag1"));
1234+
Assert.assertEquals(timestampValue, resultSet.getLong("s1"));
1235+
Assert.assertEquals(stringValue, resultSet.getString("s2"));
1236+
Assert.assertArrayEquals(blobValue, resultSet.getBinary("s3"));
1237+
}
1238+
}
1239+
11541240
@Test
11551241
public void calculateTableSize() throws IOException, WriteProcessException {
11561242
TableSchema tableSchema1 =

0 commit comments

Comments
 (0)