Class OffsetRangeTracker
- All Implemented Interfaces:
RangeTracker<Long>
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final longOffset corresponding to infinity. -
Constructor Summary
ConstructorsConstructorDescriptionOffsetRangeTracker(long startOffset, long stopOffset) Creates anOffsetRangeTrackerfor the specified range. -
Method Summary
Modifier and TypeMethodDescriptiondoubleReturns the approximate fraction of positions in the source that have been consumed by successfulRangeTracker.tryReturnRecordAt(boolean, PositionT)calls, or 0.0 if no such calls have happened.longgetPositionForFractionConsumed(double fraction) Returns a positionPsuch that the range[start, P)represents approximately the given fraction of the range[start, end).longReturns the total number of split points that have been processed.Returns the starting position of the current range, inclusive.Returns the ending position of the current range, exclusive.booleanisDone()booleanbooleanmarkDone()Marks this range tracker as being done.toString()booleantryReturnRecordAt(boolean isAtSplitPoint, long recordStart) booleantryReturnRecordAt(boolean isAtSplitPoint, Long recordStart) Atomically determines whether a record at the given position can be returned and updates internal state.booleantrySplitAtPosition(long splitOffset) booleantrySplitAtPosition(Long splitOffset) Atomically splits the current range [RangeTracker.getStartPosition(),RangeTracker.getStopPosition()) into a "primary" part [RangeTracker.getStartPosition(),splitPosition) and a "residual" part [splitPosition,RangeTracker.getStopPosition()), assuming the current last-consumed position is within [RangeTracker.getStartPosition(), splitPosition) (i.e.,splitPositionhas not been consumed yet).
-
Field Details
-
OFFSET_INFINITY
public static final long OFFSET_INFINITYOffset corresponding to infinity. This can only be used as the upper-bound of a range, and indicates reading all of the records until the end without specifying exactly what the end is.Infinite ranges cannot be split because it is impossible to estimate progress within them.
- See Also:
-
-
Constructor Details
-
OffsetRangeTracker
public OffsetRangeTracker(long startOffset, long stopOffset) Creates anOffsetRangeTrackerfor the specified range.
-
-
Method Details
-
isStarted
public boolean isStarted() -
isDone
public boolean isDone() -
getStartPosition
Description copied from interface:RangeTrackerReturns the starting position of the current range, inclusive.- Specified by:
getStartPositionin interfaceRangeTracker<Long>
-
getStopPosition
Description copied from interface:RangeTrackerReturns the ending position of the current range, exclusive.- Specified by:
getStopPositionin interfaceRangeTracker<Long>
-
tryReturnRecordAt
Description copied from interface:RangeTrackerAtomically determines whether a record at the given position can be returned and updates internal state. In particular:- If
isAtSplitPointistrue, andrecordStartis outside the current range, returnsfalse; - Otherwise, updates the last-consumed position to
recordStartand returnstrue.
This method MUST be called on all split point records. It may be called on every record.
- Specified by:
tryReturnRecordAtin interfaceRangeTracker<Long>
- If
-
tryReturnRecordAt
public boolean tryReturnRecordAt(boolean isAtSplitPoint, long recordStart) -
trySplitAtPosition
Description copied from interface:RangeTrackerAtomically splits the current range [RangeTracker.getStartPosition(),RangeTracker.getStopPosition()) into a "primary" part [RangeTracker.getStartPosition(),splitPosition) and a "residual" part [splitPosition,RangeTracker.getStopPosition()), assuming the current last-consumed position is within [RangeTracker.getStartPosition(), splitPosition) (i.e.,splitPositionhas not been consumed yet).Updates the current range to be the primary and returns
true. This means that all further calls on the current object will interpret their arguments relative to the primary range.If the split position has already been consumed, or if no
RangeTracker.tryReturnRecordAt(boolean, PositionT)call was made yet, returnsfalse. The second condition is to prevent dynamic splitting during reader start-up.- Specified by:
trySplitAtPositionin interfaceRangeTracker<Long>
-
trySplitAtPosition
public boolean trySplitAtPosition(long splitOffset) -
getPositionForFractionConsumed
public long getPositionForFractionConsumed(double fraction) Returns a positionPsuch that the range[start, P)represents approximately the given fraction of the range[start, end). Assumes that the density of records in the range is approximately uniform. -
getFractionConsumed
public double getFractionConsumed()Description copied from interface:RangeTrackerReturns the approximate fraction of positions in the source that have been consumed by successfulRangeTracker.tryReturnRecordAt(boolean, PositionT)calls, or 0.0 if no such calls have happened.- Specified by:
getFractionConsumedin interfaceRangeTracker<Long>
-
getSplitPointsProcessed
public long getSplitPointsProcessed()Returns the total number of split points that have been processed.A split point at a particular offset has been seen if there has been a corresponding call to
tryReturnRecordAt(boolean, long)withisAtSplitPointtrue. It has been processed if there has been a subsequent call totryReturnRecordAt(boolean, long)withisAtSplitPointtrue and at a larger offset.Note that for correctness when implementing
BoundedSource.BoundedReader.getSplitPointsConsumed(), if a reader finishes beforetryReturnRecordAt(boolean, long)returns false, the reader should add an additional call tomarkDone(). This will indicate that processing for the last seen split point has been finished.- See Also:
-
markDone
public boolean markDone()Marks this range tracker as being done. Specifically, this will mark the current split point, if one exists, as being finished.Always returns false, so that it can be used in an implementation of
Source.Reader.start()orSource.Reader.advance()as follows:public boolean start() { return startImpl() && rangeTracker.tryReturnRecordAt(isAtSplitPoint, position) || rangeTracker.markDone(); } -
toString
-