6060import java .io .IOException ;
6161import java .util .ArrayList ;
6262import java .util .Collections ;
63- import java .util .HashMap ;
6463import java .util .HashSet ;
6564import java .util .Iterator ;
65+ import java .util .LinkedHashMap ;
6666import java .util .List ;
6767import java .util .Map ;
6868import java .util .NoSuchElementException ;
@@ -81,6 +81,7 @@ public class TsFileInsertionEventQueryParser extends TsFileInsertionEventParser
8181 private final Map <IDeviceID , Boolean > deviceIsAlignedMap ;
8282 private final Map <String , TSDataType > measurementDataTypeMap ;
8383 private final TabletStringInternPool tabletStringInternPool = new TabletStringInternPool ();
84+ private RuntimeException deferredException ;
8485
8586 @ TestOnly
8687 public TsFileInsertionEventQueryParser (
@@ -116,6 +117,37 @@ public TsFileInsertionEventQueryParser(
116117 null ,
117118 false ,
118119 null ,
120+ null ,
121+ isWithMod );
122+ }
123+
124+ public TsFileInsertionEventQueryParser (
125+ final String pipeName ,
126+ final long creationTime ,
127+ final File tsFile ,
128+ final TreePattern pattern ,
129+ final long startTime ,
130+ final long endTime ,
131+ final PipeTaskMeta pipeTaskMeta ,
132+ final PipeInsertionEvent sourceEvent ,
133+ final IAuditEntity entity ,
134+ final boolean skipIfNoPrivileges ,
135+ final Map <IDeviceID , Boolean > deviceIsAlignedMap ,
136+ final boolean isWithMod )
137+ throws IOException , IllegalPathException {
138+ this (
139+ pipeName ,
140+ creationTime ,
141+ tsFile ,
142+ pattern ,
143+ startTime ,
144+ endTime ,
145+ pipeTaskMeta ,
146+ sourceEvent ,
147+ entity ,
148+ skipIfNoPrivileges ,
149+ deviceIsAlignedMap ,
150+ null ,
119151 isWithMod );
120152 }
121153
@@ -131,6 +163,7 @@ public TsFileInsertionEventQueryParser(
131163 final IAuditEntity entity ,
132164 final boolean skipIfNoPrivileges ,
133165 final Map <IDeviceID , Boolean > deviceIsAlignedMap ,
166+ final Map <IDeviceID , List <String >> deviceMeasurementsMapOverride ,
134167 final boolean isWithMod )
135168 throws IOException , IllegalPathException {
136169 super (
@@ -165,7 +198,25 @@ public TsFileInsertionEventQueryParser(
165198 tsFileSequenceReader = new TsFileSequenceReader (tsFile .getPath (), true , true );
166199 tsFileReader = new TsFileReader (tsFileSequenceReader );
167200
168- if (tsFileResourceManager .cacheObjectsIfAbsent (tsFile )) {
201+ if (Objects .nonNull (deviceMeasurementsMapOverride )) {
202+ this .deviceIsAlignedMap =
203+ Objects .nonNull (deviceIsAlignedMap )
204+ ? new LinkedHashMap <>(deviceIsAlignedMap )
205+ : readDeviceIsAlignedMap ();
206+ memoryRequiredInBytes +=
207+ Objects .nonNull (deviceIsAlignedMap )
208+ ? 0
209+ : PipeMemoryWeightUtil .memoryOfIDeviceId2Bool (this .deviceIsAlignedMap );
210+
211+ measurementDataTypeMap =
212+ readFilteredFullPathDataTypeMap (deviceMeasurementsMapOverride .keySet ());
213+ memoryRequiredInBytes +=
214+ PipeMemoryWeightUtil .memoryOfStr2TSDataType (measurementDataTypeMap );
215+
216+ deviceMeasurementsMap = new LinkedHashMap <>(deviceMeasurementsMapOverride );
217+ memoryRequiredInBytes +=
218+ PipeMemoryWeightUtil .memoryOfIDeviceID2StrList (deviceMeasurementsMap );
219+ } else if (tsFileResourceManager .cacheObjectsIfAbsent (tsFile )) {
169220 // These read-only objects can be found in cache.
170221 this .deviceIsAlignedMap =
171222 Objects .nonNull (deviceIsAlignedMap )
@@ -266,10 +317,34 @@ public TsFileInsertionEventQueryParser(
266317 }
267318 }
268319
320+ public TsFileInsertionEventQueryParser (
321+ final File tsFile ,
322+ final TreePattern pattern ,
323+ final long startTime ,
324+ final long endTime ,
325+ final Map <IDeviceID , List <String >> deviceMeasurementsMapOverride ,
326+ final boolean isWithMod )
327+ throws IOException , IllegalPathException {
328+ this (
329+ null ,
330+ 0 ,
331+ tsFile ,
332+ pattern ,
333+ startTime ,
334+ endTime ,
335+ null ,
336+ null ,
337+ null ,
338+ false ,
339+ null ,
340+ deviceMeasurementsMapOverride ,
341+ isWithMod );
342+ }
343+
269344 private Map <IDeviceID , List <String >> filterDeviceMeasurementsMapByPattern (
270345 final Map <IDeviceID , List <String >> originalDeviceMeasurementsMap )
271346 throws IllegalPathException {
272- final Map <IDeviceID , List <String >> filteredDeviceMeasurementsMap = new HashMap <>();
347+ final Map <IDeviceID , List <String >> filteredDeviceMeasurementsMap = new LinkedHashMap <>();
273348 for (Map .Entry <IDeviceID , List <String >> entry : originalDeviceMeasurementsMap .entrySet ()) {
274349 final IDeviceID deviceId = entry .getKey ();
275350
@@ -318,7 +393,7 @@ else if (treePattern.mayOverlapWithDevice(deviceId)) {
318393 }
319394
320395 private Map <IDeviceID , Boolean > readDeviceIsAlignedMap () throws IOException {
321- final Map <IDeviceID , Boolean > deviceIsAlignedResultMap = new HashMap <>();
396+ final Map <IDeviceID , Boolean > deviceIsAlignedResultMap = new LinkedHashMap <>();
322397 final TsFileDeviceIterator deviceIsAlignedIterator =
323398 tsFileSequenceReader .getAllDevicesIteratorWithIsAligned ();
324399 while (deviceIsAlignedIterator .hasNext ()) {
@@ -348,7 +423,7 @@ private Set<IDeviceID> filterDevicesByPattern(final Set<IDeviceID> devices) {
348423 */
349424 private Map <String , TSDataType > readFilteredFullPathDataTypeMap (final Set <IDeviceID > devices )
350425 throws IOException {
351- final Map <String , TSDataType > result = new HashMap <>();
426+ final Map <String , TSDataType > result = new LinkedHashMap <>();
352427
353428 for (final IDeviceID device : devices ) {
354429 tsFileSequenceReader
@@ -370,7 +445,7 @@ private Map<String, TSDataType> readFilteredFullPathDataTypeMap(final Set<IDevic
370445 */
371446 private Map <IDeviceID , List <String >> readFilteredDeviceMeasurementsMap (
372447 final Set <IDeviceID > devices ) throws IOException {
373- final Map <IDeviceID , List <String >> result = new HashMap <>();
448+ final Map <IDeviceID , List <String >> result = new LinkedHashMap <>();
374449
375450 for (final IDeviceID device : devices ) {
376451 tsFileSequenceReader
@@ -397,6 +472,7 @@ public Iterable<TabletInsertionEvent> toTabletInsertionEvents() {
397472
398473 @ Override
399474 public boolean hasNext () {
475+ throwIfDeferredException ();
400476 boolean hasNext = false ;
401477 while (tabletIterator == null || !tabletIterator .hasNext ()) {
402478 if (!deviceMeasurementsMapIterator .hasNext ()) {
@@ -451,9 +527,16 @@ public TabletInsertionEvent next() {
451527 final boolean isAligned =
452528 deviceIsAlignedMap .getOrDefault (
453529 IDeviceID .Factory .DEFAULT_FACTORY .create (tablet .getDeviceId ()), false );
530+ boolean isLast ;
531+ try {
532+ isLast = !hasNext ();
533+ } catch (final RuntimeException e ) {
534+ deferredException = e ;
535+ isLast = false ;
536+ }
454537
455538 final TabletInsertionEvent next ;
456- if (! hasNext () ) {
539+ if (isLast ) {
457540 next =
458541 sourceEvent == null
459542 ? new PipeRawTabletInsertionEvent (
@@ -517,8 +600,19 @@ public TabletInsertionEvent next() {
517600 return tabletInsertionIterable ;
518601 }
519602
603+ private void throwIfDeferredException () {
604+ if (Objects .isNull (deferredException )) {
605+ return ;
606+ }
607+
608+ final RuntimeException exception = deferredException ;
609+ deferredException = null ;
610+ throw exception ;
611+ }
612+
520613 @ Override
521614 public void close () {
615+ deferredException = null ;
522616 try {
523617 if (tsFileReader != null ) {
524618 tsFileReader .close ();
0 commit comments