|
19 | 19 |
|
20 | 20 | package org.apache.iotdb.db.storageengine.dataregion.memtable; |
21 | 21 |
|
| 22 | +import org.apache.iotdb.commons.path.AlignedFullPath; |
| 23 | +import org.apache.iotdb.commons.path.NonAlignedFullPath; |
22 | 24 | import org.apache.iotdb.db.conf.IoTDBDescriptor; |
| 25 | +import org.apache.iotdb.db.storageengine.dataregion.read.filescan.IChunkHandle; |
23 | 26 |
|
24 | 27 | import org.apache.tsfile.enums.TSDataType; |
| 28 | +import org.apache.tsfile.file.metadata.StringArrayDeviceID; |
25 | 29 | import org.apache.tsfile.read.common.TimeRange; |
26 | 30 | import org.apache.tsfile.read.filter.operator.TimeFilterOperators; |
27 | 31 | import org.apache.tsfile.utils.BitMap; |
|
38 | 42 | import java.util.Arrays; |
39 | 43 | import java.util.Collection; |
40 | 44 | import java.util.Collections; |
| 45 | +import java.util.HashMap; |
41 | 46 | import java.util.List; |
| 47 | +import java.util.Map; |
42 | 48 | import java.util.Optional; |
43 | 49 |
|
44 | 50 | @RunWith(Parameterized.class) |
@@ -69,94 +75,167 @@ public void tearDown() { |
69 | 75 |
|
70 | 76 | @Test |
71 | 77 | public void testAlignedWritableMemChunkRegionScan() { |
72 | | - List<IMeasurementSchema> measurementSchemas = |
73 | | - Arrays.asList( |
74 | | - new MeasurementSchema("s1", TSDataType.INT32), |
75 | | - new MeasurementSchema("s2", TSDataType.INT32), |
76 | | - new MeasurementSchema("s3", TSDataType.INT32)); |
77 | | - AlignedWritableMemChunk writableMemChunk = |
78 | | - new AlignedWritableMemChunk(measurementSchemas, false); |
79 | | - int size = 100000; |
80 | | - for (int i = 0; i < size; i++) { |
81 | | - if (i <= 10000) { |
82 | | - writableMemChunk.writeAlignedPoints(i, new Object[] {1, null, 1}, measurementSchemas); |
83 | | - } else if (i <= 20000) { |
84 | | - writableMemChunk.writeAlignedPoints(i, new Object[] {null, null, 2}, measurementSchemas); |
85 | | - } else if (i <= 30000) { |
86 | | - writableMemChunk.writeAlignedPoints(i, new Object[] {3, null, null}, measurementSchemas); |
87 | | - } else { |
88 | | - writableMemChunk.writeAlignedPoints(i, new Object[] {4, 4, 4}, measurementSchemas); |
| 78 | + PrimitiveMemTable memTable = new PrimitiveMemTable("root.test", "0"); |
| 79 | + try { |
| 80 | + List<IMeasurementSchema> measurementSchemas = |
| 81 | + Arrays.asList( |
| 82 | + new MeasurementSchema("s1", TSDataType.INT32), |
| 83 | + new MeasurementSchema("s2", TSDataType.INT32), |
| 84 | + new MeasurementSchema("s3", TSDataType.INT32)); |
| 85 | + AlignedWritableMemChunk writableMemChunk = null; |
| 86 | + int size = 100000; |
| 87 | + for (int i = 0; i < size; i++) { |
| 88 | + if (i <= 10000) { |
| 89 | + memTable.writeAlignedRow( |
| 90 | + new StringArrayDeviceID("root.test.d1"), |
| 91 | + measurementSchemas, |
| 92 | + i, |
| 93 | + new Object[] {1, null, 1}); |
| 94 | + } else if (i <= 20000) { |
| 95 | + memTable.writeAlignedRow( |
| 96 | + new StringArrayDeviceID("root.test.d1"), |
| 97 | + measurementSchemas, |
| 98 | + i, |
| 99 | + new Object[] {null, null, 2}); |
| 100 | + } else if (i <= 30000) { |
| 101 | + memTable.writeAlignedRow( |
| 102 | + new StringArrayDeviceID("root.test.d1"), |
| 103 | + measurementSchemas, |
| 104 | + i, |
| 105 | + new Object[] {3, null, null}); |
| 106 | + } else { |
| 107 | + memTable.writeAlignedRow( |
| 108 | + new StringArrayDeviceID("root.test.d1"), |
| 109 | + measurementSchemas, |
| 110 | + i, |
| 111 | + new Object[] {4, 4, 4}); |
| 112 | + } |
89 | 113 | } |
90 | | - } |
91 | | - List<BitMap> bitMaps = new ArrayList<>(); |
92 | | - long[] timestamps = |
93 | | - writableMemChunk.getAnySatisfiedTimestamp( |
94 | | - Arrays.asList( |
95 | | - Collections.emptyList(), Collections.emptyList(), Collections.emptyList()), |
96 | | - bitMaps, |
97 | | - true, |
98 | | - null); |
99 | | - Assert.assertEquals(2, timestamps.length); |
100 | | - Assert.assertEquals(0, timestamps[0]); |
101 | | - Assert.assertFalse(bitMaps.get(0).isMarked(0)); |
102 | | - Assert.assertTrue(bitMaps.get(0).isMarked(1)); |
103 | | - Assert.assertFalse(bitMaps.get(0).isMarked(2)); |
104 | | - Assert.assertTrue(bitMaps.get(1).isMarked(0)); |
105 | | - Assert.assertFalse(bitMaps.get(1).isMarked(1)); |
106 | | - Assert.assertTrue(bitMaps.get(1).isMarked(2)); |
107 | | - Assert.assertEquals(30001, timestamps[1]); |
| 114 | + writableMemChunk = |
| 115 | + (AlignedWritableMemChunk) |
| 116 | + memTable.getWritableMemChunk(new StringArrayDeviceID("root.test.d1"), ""); |
| 117 | + List<BitMap> bitMaps = new ArrayList<>(); |
| 118 | + long[] timestamps = |
| 119 | + writableMemChunk.getAnySatisfiedTimestamp( |
| 120 | + Arrays.asList( |
| 121 | + Collections.emptyList(), Collections.emptyList(), Collections.emptyList()), |
| 122 | + bitMaps, |
| 123 | + true, |
| 124 | + null); |
| 125 | + Assert.assertEquals(2, timestamps.length); |
| 126 | + Assert.assertEquals(0, timestamps[0]); |
| 127 | + Assert.assertFalse(bitMaps.get(0).isMarked(0)); |
| 128 | + Assert.assertTrue(bitMaps.get(0).isMarked(1)); |
| 129 | + Assert.assertFalse(bitMaps.get(0).isMarked(2)); |
| 130 | + Assert.assertTrue(bitMaps.get(1).isMarked(0)); |
| 131 | + Assert.assertFalse(bitMaps.get(1).isMarked(1)); |
| 132 | + Assert.assertTrue(bitMaps.get(1).isMarked(2)); |
| 133 | + Assert.assertEquals(30001, timestamps[1]); |
108 | 134 |
|
109 | | - bitMaps = new ArrayList<>(); |
110 | | - timestamps = |
111 | | - writableMemChunk.getAnySatisfiedTimestamp( |
112 | | - Arrays.asList( |
113 | | - Collections.emptyList(), |
114 | | - Collections.emptyList(), |
115 | | - Collections.singletonList(new TimeRange(0, 12000))), |
116 | | - bitMaps, |
117 | | - true, |
118 | | - new TimeFilterOperators.TimeGt(11000)); |
| 135 | + bitMaps = new ArrayList<>(); |
| 136 | + timestamps = |
| 137 | + writableMemChunk.getAnySatisfiedTimestamp( |
| 138 | + Arrays.asList( |
| 139 | + Collections.emptyList(), |
| 140 | + Collections.emptyList(), |
| 141 | + Collections.singletonList(new TimeRange(0, 12000))), |
| 142 | + bitMaps, |
| 143 | + true, |
| 144 | + new TimeFilterOperators.TimeGt(10000000)); |
| 145 | + Assert.assertEquals(0, timestamps.length); |
119 | 146 |
|
120 | | - Assert.assertEquals(3, timestamps.length); |
121 | | - Assert.assertEquals(12001, timestamps[0]); |
122 | | - Assert.assertTrue(bitMaps.get(0).isMarked(0)); |
123 | | - Assert.assertTrue(bitMaps.get(0).isMarked(1)); |
124 | | - Assert.assertFalse(bitMaps.get(0).isMarked(2)); |
125 | | - Assert.assertEquals(20001, timestamps[1]); |
126 | | - Assert.assertFalse(bitMaps.get(1).isMarked(0)); |
127 | | - Assert.assertTrue(bitMaps.get(1).isMarked(1)); |
128 | | - Assert.assertTrue(bitMaps.get(1).isMarked(2)); |
129 | | - Assert.assertEquals(30001, timestamps[2]); |
130 | | - Assert.assertTrue(bitMaps.get(2).isMarked(0)); |
131 | | - 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)); |
159 | | - Assert.assertFalse(bitMaps.get(2).isMarked(2)); |
| 147 | + bitMaps = new ArrayList<>(); |
| 148 | + timestamps = |
| 149 | + writableMemChunk.getAnySatisfiedTimestamp( |
| 150 | + Arrays.asList( |
| 151 | + Collections.emptyList(), |
| 152 | + Collections.emptyList(), |
| 153 | + Collections.singletonList(new TimeRange(0, 12000))), |
| 154 | + bitMaps, |
| 155 | + true, |
| 156 | + new TimeFilterOperators.TimeGt(11000)); |
| 157 | + |
| 158 | + Assert.assertEquals(3, timestamps.length); |
| 159 | + Assert.assertEquals(12001, timestamps[0]); |
| 160 | + Assert.assertTrue(bitMaps.get(0).isMarked(0)); |
| 161 | + Assert.assertTrue(bitMaps.get(0).isMarked(1)); |
| 162 | + Assert.assertFalse(bitMaps.get(0).isMarked(2)); |
| 163 | + Assert.assertEquals(20001, timestamps[1]); |
| 164 | + Assert.assertFalse(bitMaps.get(1).isMarked(0)); |
| 165 | + Assert.assertTrue(bitMaps.get(1).isMarked(1)); |
| 166 | + Assert.assertTrue(bitMaps.get(1).isMarked(2)); |
| 167 | + Assert.assertEquals(30001, timestamps[2]); |
| 168 | + Assert.assertTrue(bitMaps.get(2).isMarked(0)); |
| 169 | + Assert.assertFalse(bitMaps.get(2).isMarked(1)); |
| 170 | + Assert.assertTrue(bitMaps.get(2).isMarked(2)); |
| 171 | + |
| 172 | + writableMemChunk.writeAlignedPoints( |
| 173 | + 1000001, new Object[] {1, null, null}, measurementSchemas); |
| 174 | + writableMemChunk.writeAlignedPoints( |
| 175 | + 1000002, new Object[] {null, 1, null}, measurementSchemas); |
| 176 | + writableMemChunk.writeAlignedPoints(1000002, new Object[] {1, 1, null}, measurementSchemas); |
| 177 | + writableMemChunk.writeAlignedPoints( |
| 178 | + 1000003, new Object[] {1, null, null}, measurementSchemas); |
| 179 | + writableMemChunk.writeAlignedPoints(1000004, new Object[] {1, null, 1}, measurementSchemas); |
| 180 | + bitMaps = new ArrayList<>(); |
| 181 | + timestamps = |
| 182 | + writableMemChunk.getAnySatisfiedTimestamp( |
| 183 | + Arrays.asList( |
| 184 | + Collections.emptyList(), Collections.emptyList(), Collections.emptyList()), |
| 185 | + bitMaps, |
| 186 | + true, |
| 187 | + new TimeFilterOperators.TimeGt(1000000)); |
| 188 | + Assert.assertEquals(3, timestamps.length); |
| 189 | + Assert.assertEquals(1000001, timestamps[0]); |
| 190 | + Assert.assertFalse(bitMaps.get(0).isMarked(0)); |
| 191 | + Assert.assertTrue(bitMaps.get(0).isMarked(1)); |
| 192 | + Assert.assertTrue(bitMaps.get(0).isMarked(2)); |
| 193 | + Assert.assertEquals(1000002, timestamps[1]); |
| 194 | + Assert.assertTrue(bitMaps.get(1).isMarked(0)); |
| 195 | + Assert.assertFalse(bitMaps.get(1).isMarked(1)); |
| 196 | + Assert.assertTrue(bitMaps.get(1).isMarked(2)); |
| 197 | + Assert.assertEquals(1000004, timestamps[2]); |
| 198 | + Assert.assertTrue(bitMaps.get(2).isMarked(0)); |
| 199 | + Assert.assertTrue(bitMaps.get(2).isMarked(1)); |
| 200 | + Assert.assertFalse(bitMaps.get(2).isMarked(2)); |
| 201 | + |
| 202 | + Map<String, List<IChunkHandle>> chunkHandleMap = new HashMap<>(); |
| 203 | + memTable.queryForDeviceRegionScan( |
| 204 | + new StringArrayDeviceID("root.test.d1"), |
| 205 | + true, |
| 206 | + Long.MIN_VALUE, |
| 207 | + new HashMap<>(), |
| 208 | + chunkHandleMap, |
| 209 | + Collections.emptyList(), |
| 210 | + new TimeFilterOperators.TimeGt(1000000)); |
| 211 | + Assert.assertEquals(3, chunkHandleMap.size()); |
| 212 | + Assert.assertArrayEquals( |
| 213 | + new long[] {1000001, 1000001}, chunkHandleMap.get("s1").get(0).getPageStatisticsTime()); |
| 214 | + Assert.assertArrayEquals( |
| 215 | + new long[] {1000002, 1000002}, chunkHandleMap.get("s2").get(0).getPageStatisticsTime()); |
| 216 | + Assert.assertArrayEquals( |
| 217 | + new long[] {1000004, 1000004}, chunkHandleMap.get("s3").get(0).getPageStatisticsTime()); |
| 218 | + |
| 219 | + memTable.queryForSeriesRegionScan( |
| 220 | + new AlignedFullPath( |
| 221 | + new StringArrayDeviceID("root.test.d1"), |
| 222 | + IMeasurementSchema.getMeasurementNameList(measurementSchemas), |
| 223 | + measurementSchemas), |
| 224 | + Long.MIN_VALUE, |
| 225 | + new HashMap<>(), |
| 226 | + chunkHandleMap, |
| 227 | + Collections.emptyList(), |
| 228 | + new TimeFilterOperators.TimeGt(1000000)); |
| 229 | + Assert.assertEquals(3, chunkHandleMap.size()); |
| 230 | + Assert.assertArrayEquals( |
| 231 | + new long[] {1000001, 1000001}, chunkHandleMap.get("s1").get(0).getPageStatisticsTime()); |
| 232 | + Assert.assertArrayEquals( |
| 233 | + new long[] {1000002, 1000002}, chunkHandleMap.get("s2").get(0).getPageStatisticsTime()); |
| 234 | + Assert.assertArrayEquals( |
| 235 | + new long[] {1000004, 1000004}, chunkHandleMap.get("s3").get(0).getPageStatisticsTime()); |
| 236 | + } finally { |
| 237 | + memTable.release(); |
| 238 | + } |
160 | 239 | } |
161 | 240 |
|
162 | 241 | @Test |
@@ -214,33 +293,67 @@ public void testTableWritableMemChunkRegionScan() { |
214 | 293 |
|
215 | 294 | @Test |
216 | 295 | public void testNonAlignedWritableMemChunkRegionScan() { |
217 | | - MeasurementSchema measurementSchema = new MeasurementSchema("s1", TSDataType.INT32); |
218 | | - WritableMemChunk writableMemChunk = new WritableMemChunk(measurementSchema); |
219 | | - int size = 100000; |
220 | | - for (int i = 0; i < size; i++) { |
221 | | - writableMemChunk.writeNonAlignedPoint(i, i); |
222 | | - } |
223 | | - Optional<Long> timestamp = writableMemChunk.getAnySatisfiedTimestamp(null, null); |
224 | | - Assert.assertTrue(timestamp.isPresent()); |
225 | | - Assert.assertEquals(0, timestamp.get().longValue()); |
| 296 | + PrimitiveMemTable memTable = new PrimitiveMemTable("root.test", "0"); |
| 297 | + try { |
| 298 | + MeasurementSchema measurementSchema = new MeasurementSchema("s1", TSDataType.INT32); |
| 299 | + int size = 100000; |
| 300 | + for (int i = 0; i < size; i++) { |
| 301 | + memTable.write( |
| 302 | + new StringArrayDeviceID("root.test.d1"), |
| 303 | + Collections.singletonList(measurementSchema), |
| 304 | + i, |
| 305 | + new Object[] {i}); |
| 306 | + } |
| 307 | + WritableMemChunk writableMemChunk = |
| 308 | + (WritableMemChunk) |
| 309 | + memTable.getWritableMemChunk(new StringArrayDeviceID("root.test.d1"), "s1"); |
| 310 | + Optional<Long> timestamp = writableMemChunk.getAnySatisfiedTimestamp(null, null); |
| 311 | + Assert.assertTrue(timestamp.isPresent()); |
| 312 | + Assert.assertEquals(0, timestamp.get().longValue()); |
226 | 313 |
|
227 | | - timestamp = |
228 | | - writableMemChunk.getAnySatisfiedTimestamp( |
229 | | - null, new TimeFilterOperators.TimeBetweenAnd(1000L, 2000L)); |
230 | | - Assert.assertTrue(timestamp.isPresent()); |
231 | | - Assert.assertEquals(1000, timestamp.get().longValue()); |
| 314 | + timestamp = |
| 315 | + writableMemChunk.getAnySatisfiedTimestamp( |
| 316 | + null, new TimeFilterOperators.TimeBetweenAnd(1000L, 2000L)); |
| 317 | + Assert.assertTrue(timestamp.isPresent()); |
| 318 | + Assert.assertEquals(1000, timestamp.get().longValue()); |
232 | 319 |
|
233 | | - timestamp = |
234 | | - writableMemChunk.getAnySatisfiedTimestamp( |
235 | | - Collections.singletonList(new TimeRange(1, 1500)), |
236 | | - new TimeFilterOperators.TimeBetweenAnd(1000L, 2000L)); |
237 | | - Assert.assertTrue(timestamp.isPresent()); |
238 | | - Assert.assertEquals(1501, timestamp.get().longValue()); |
| 320 | + timestamp = |
| 321 | + writableMemChunk.getAnySatisfiedTimestamp( |
| 322 | + Collections.singletonList(new TimeRange(1, 1500)), |
| 323 | + new TimeFilterOperators.TimeBetweenAnd(1000L, 2000L)); |
| 324 | + Assert.assertTrue(timestamp.isPresent()); |
| 325 | + Assert.assertEquals(1501, timestamp.get().longValue()); |
239 | 326 |
|
240 | | - timestamp = |
241 | | - writableMemChunk.getAnySatisfiedTimestamp( |
242 | | - Collections.singletonList(new TimeRange(1, 1500)), |
243 | | - new TimeFilterOperators.TimeBetweenAnd(100000L, 200000L)); |
244 | | - Assert.assertFalse(timestamp.isPresent()); |
| 327 | + timestamp = |
| 328 | + writableMemChunk.getAnySatisfiedTimestamp( |
| 329 | + Collections.singletonList(new TimeRange(1, 1500)), |
| 330 | + new TimeFilterOperators.TimeBetweenAnd(100000L, 200000L)); |
| 331 | + Assert.assertFalse(timestamp.isPresent()); |
| 332 | + |
| 333 | + Map<String, List<IChunkHandle>> chunkHandleMap = new HashMap<>(); |
| 334 | + memTable.queryForDeviceRegionScan( |
| 335 | + new StringArrayDeviceID("root.test.d1"), |
| 336 | + false, |
| 337 | + Long.MIN_VALUE, |
| 338 | + new HashMap<>(), |
| 339 | + chunkHandleMap, |
| 340 | + Collections.emptyList(), |
| 341 | + new TimeFilterOperators.TimeGt(1)); |
| 342 | + Assert.assertEquals(1, chunkHandleMap.size()); |
| 343 | + Assert.assertArrayEquals( |
| 344 | + new long[] {2, 2}, chunkHandleMap.get("s1").get(0).getPageStatisticsTime()); |
| 345 | + memTable.queryForSeriesRegionScan( |
| 346 | + new NonAlignedFullPath(new StringArrayDeviceID("root.test.d1"), measurementSchema), |
| 347 | + Long.MIN_VALUE, |
| 348 | + new HashMap<>(), |
| 349 | + chunkHandleMap, |
| 350 | + Collections.emptyList(), |
| 351 | + new TimeFilterOperators.TimeGt(1)); |
| 352 | + Assert.assertEquals(1, chunkHandleMap.size()); |
| 353 | + Assert.assertArrayEquals( |
| 354 | + new long[] {2, 2}, chunkHandleMap.get("s1").get(0).getPageStatisticsTime()); |
| 355 | + } finally { |
| 356 | + memTable.release(); |
| 357 | + } |
245 | 358 | } |
246 | 359 | } |
0 commit comments