Skip to content

Commit adc719b

Browse files
committed
add ut
1 parent e60335c commit adc719b

File tree

3 files changed

+67
-14
lines changed

3 files changed

+67
-14
lines changed

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedWritableMemChunk.java

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,19 @@ private void getAnySatisfiedTimestamp(
352352
valueColumnsDeletionList.forEach(x -> valueColumnDeleteCursor.add(new int[] {0}));
353353
}
354354

355+
// example:
356+
// globalTimeFilter:null, ignoreAllNullRows: true
357+
// tvList:
358+
// time s1 s2 s3
359+
// 1 1 null null
360+
// 2 null 1 null
361+
// 2 1 1 null
362+
// 3 1 null null
363+
// 4 1 null 1
364+
// timestampWithBitmap:
365+
// timestamp: 1 bitmap: 011
366+
// timestamp: 2 bitmap: 101
367+
// timestamp: 4 bitmap: 110
355368
for (int row = 0; row < rowCount; row++) {
356369
// the row is deleted
357370
if (allValueColDeletedMap != null && allValueColDeletedMap.isMarked(row)) {
@@ -362,12 +375,12 @@ private void getAnySatisfiedTimestamp(
362375
continue;
363376
}
364377

365-
BitMap bitMap = new BitMap(schemaList.size());
378+
// Note that this method will only perform bitmap unmarking on the first occurrence of a
379+
// non-null value in multiple timestamps for the same column.
380+
BitMap currentRowNullValueBitmap = null;
366381

367-
boolean foundAnyNewColumnWithNonNullValue = false;
368382
for (int column = 0; column < schemaList.size(); column++) {
369383
if (alignedTVList.isNullValue(alignedTVList.getValueIndex(row), column)) {
370-
bitMap.mark(column);
371384
continue;
372385
}
373386

@@ -378,33 +391,46 @@ && isPointDeleted(
378391
timestamp,
379392
valueColumnsDeletionList.get(column),
380393
valueColumnDeleteCursor.get(column))) {
381-
bitMap.mark(column);
382394
continue;
383395
}
384-
385396
if (!columnHasNonNullValue.isMarked(column)) {
386397
hasNonNullValueColumnCount.incrementAndGet();
387-
foundAnyNewColumnWithNonNullValue = true;
388398
columnHasNonNullValue.mark(column);
399+
currentRowNullValueBitmap =
400+
currentRowNullValueBitmap != null
401+
? currentRowNullValueBitmap
402+
: timestampWithBitmap.computeIfAbsent(
403+
timestamp, k -> getAllMarkedBitmap(schemaList.size()));
404+
currentRowNullValueBitmap.unmark(column);
389405
}
390406
}
391407

392408
if (!ignoreAllNullRows) {
393-
// count devices in table model
394-
timestampWithBitmap.put(timestamp, bitMap);
409+
timestampWithBitmap.put(
410+
timestamp,
411+
currentRowNullValueBitmap != null
412+
? currentRowNullValueBitmap
413+
: getAllMarkedBitmap(schemaList.size()));
395414
return;
396415
}
397-
if (!foundAnyNewColumnWithNonNullValue) {
416+
if (currentRowNullValueBitmap == null) {
398417
continue;
399418
}
400-
timestampWithBitmap.put(timestamp, bitMap);
419+
// found new column with non-null value
420+
timestampWithBitmap.put(timestamp, currentRowNullValueBitmap);
401421

402422
if (hasNonNullValueColumnCount.get() == schemaList.size()) {
403423
return;
404424
}
405425
}
406426
}
407427

428+
private BitMap getAllMarkedBitmap(int size) {
429+
BitMap bitMap = new BitMap(size);
430+
bitMap.markAll();
431+
return bitMap;
432+
}
433+
408434
@Override
409435
public AlignedTVList getWorkingTVList() {
410436
return list;

iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedTVListIteratorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1034,7 +1034,7 @@ public void test() {
10341034
// }
10351035
long start = System.currentTimeMillis();
10361036
// long[] filteredTimestamp = writableMemChunk.getAnySatisfiedTimestamp(null, null);
1037-
writableMemChunk.getAnySatisfiedTimestamp(null, null);
1037+
writableMemChunk.getAnySatisfiedTimestamp(null, new TimeFilterOperators.TimeGt(3000000 - 2));
10381038
System.out.println("cost: " + (System.currentTimeMillis() - start));
10391039
}
10401040
}

iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/memtable/WritableMemChunkRegionScanTest.java

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,9 @@ public void testAlignedWritableMemChunkRegionScan() {
101101
Assert.assertFalse(bitMaps.get(0).isMarked(0));
102102
Assert.assertTrue(bitMaps.get(0).isMarked(1));
103103
Assert.assertFalse(bitMaps.get(0).isMarked(2));
104-
Assert.assertFalse(bitMaps.get(1).isMarked(0));
104+
Assert.assertTrue(bitMaps.get(1).isMarked(0));
105105
Assert.assertFalse(bitMaps.get(1).isMarked(1));
106-
Assert.assertFalse(bitMaps.get(1).isMarked(2));
106+
Assert.assertTrue(bitMaps.get(1).isMarked(2));
107107
Assert.assertEquals(30001, timestamps[1]);
108108

109109
bitMaps = new ArrayList<>();
@@ -127,8 +127,35 @@ public void testAlignedWritableMemChunkRegionScan() {
127127
Assert.assertTrue(bitMaps.get(1).isMarked(1));
128128
Assert.assertTrue(bitMaps.get(1).isMarked(2));
129129
Assert.assertEquals(30001, timestamps[2]);
130-
Assert.assertFalse(bitMaps.get(2).isMarked(0));
130+
Assert.assertTrue(bitMaps.get(2).isMarked(0));
131131
Assert.assertFalse(bitMaps.get(2).isMarked(1));
132+
Assert.assertTrue(bitMaps.get(2).isMarked(2));
133+
134+
writableMemChunk.writeAlignedPoints(1000001, new Object[] {1, null, null}, measurementSchemas);
135+
writableMemChunk.writeAlignedPoints(1000002, new Object[] {null, 1, null}, measurementSchemas);
136+
writableMemChunk.writeAlignedPoints(1000002, new Object[] {1, 1, null}, measurementSchemas);
137+
writableMemChunk.writeAlignedPoints(1000003, new Object[] {1, null, null}, measurementSchemas);
138+
writableMemChunk.writeAlignedPoints(1000004, new Object[] {1, null, 1}, measurementSchemas);
139+
bitMaps = new ArrayList<>();
140+
timestamps =
141+
writableMemChunk.getAnySatisfiedTimestamp(
142+
Arrays.asList(
143+
Collections.emptyList(), Collections.emptyList(), Collections.emptyList()),
144+
bitMaps,
145+
true,
146+
new TimeFilterOperators.TimeGt(1000000));
147+
Assert.assertEquals(3, timestamps.length);
148+
Assert.assertEquals(1000001, timestamps[0]);
149+
Assert.assertFalse(bitMaps.get(0).isMarked(0));
150+
Assert.assertTrue(bitMaps.get(0).isMarked(1));
151+
Assert.assertTrue(bitMaps.get(0).isMarked(2));
152+
Assert.assertEquals(1000002, timestamps[1]);
153+
Assert.assertTrue(bitMaps.get(1).isMarked(0));
154+
Assert.assertFalse(bitMaps.get(1).isMarked(1));
155+
Assert.assertTrue(bitMaps.get(1).isMarked(2));
156+
Assert.assertEquals(1000004, timestamps[2]);
157+
Assert.assertTrue(bitMaps.get(2).isMarked(0));
158+
Assert.assertTrue(bitMaps.get(2).isMarked(1));
132159
Assert.assertFalse(bitMaps.get(2).isMarked(2));
133160
}
134161

0 commit comments

Comments
 (0)