public class OffsetRangeTracker extends java.lang.Object implements RangeTracker<java.lang.Long>
RangeTracker
for non-negative positions of type long
.Modifier and Type | Field and Description |
---|---|
static long |
OFFSET_INFINITY
Offset corresponding to infinity.
|
Constructor and Description |
---|
OffsetRangeTracker(long startOffset,
long stopOffset)
Creates an
OffsetRangeTracker for the specified range. |
Modifier and Type | Method and Description |
---|---|
double |
getFractionConsumed()
Returns the approximate fraction of positions in the source that have been consumed by
successful
RangeTracker.tryReturnRecordAt(boolean, PositionT) calls, or 0.0 if no such calls have happened. |
long |
getPositionForFractionConsumed(double fraction)
Returns a position
P such that the range [start, P) represents approximately
the given fraction of the range [start, end) . |
long |
getSplitPointsProcessed()
Returns the total number of split points that have been processed.
|
java.lang.Long |
getStartPosition()
Returns the starting position of the current range, inclusive.
|
java.lang.Long |
getStopPosition()
Returns the ending position of the current range, exclusive.
|
boolean |
isDone() |
boolean |
isStarted() |
boolean |
markDone()
Marks this range tracker as being done.
|
java.lang.String |
toString() |
boolean |
tryReturnRecordAt(boolean isAtSplitPoint,
long recordStart) |
boolean |
tryReturnRecordAt(boolean isAtSplitPoint,
java.lang.Long recordStart)
Atomically determines whether a record at the given position can be returned and updates
internal state.
|
boolean |
trySplitAtPosition(long splitOffset) |
boolean |
trySplitAtPosition(java.lang.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., splitPosition has not been consumed yet). |
public static final long OFFSET_INFINITY
Infinite ranges cannot be split because it is impossible to estimate progress within them.
public OffsetRangeTracker(long startOffset, long stopOffset)
OffsetRangeTracker
for the specified range.public boolean isStarted()
public boolean isDone()
public java.lang.Long getStartPosition()
RangeTracker
getStartPosition
in interface RangeTracker<java.lang.Long>
public java.lang.Long getStopPosition()
RangeTracker
getStopPosition
in interface RangeTracker<java.lang.Long>
public boolean tryReturnRecordAt(boolean isAtSplitPoint, java.lang.Long recordStart)
RangeTracker
isAtSplitPoint
is true
, and recordStart
is outside the current
range, returns false
;
recordStart
and returns
true
.
This method MUST be called on all split point records. It may be called on every record.
tryReturnRecordAt
in interface RangeTracker<java.lang.Long>
public boolean tryReturnRecordAt(boolean isAtSplitPoint, long recordStart)
public boolean trySplitAtPosition(java.lang.Long splitOffset)
RangeTracker
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., splitPosition
has 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, returns false
. The second condition is to prevent dynamic splitting
during reader start-up.
trySplitAtPosition
in interface RangeTracker<java.lang.Long>
public boolean trySplitAtPosition(long splitOffset)
public long getPositionForFractionConsumed(double fraction)
P
such 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.public double getFractionConsumed()
RangeTracker
RangeTracker.tryReturnRecordAt(boolean, PositionT)
calls, or 0.0 if no such calls have happened.getFractionConsumed
in interface RangeTracker<java.lang.Long>
public long getSplitPointsProcessed()
A split point at a particular offset has been seen if there has been a corresponding call
to tryReturnRecordAt(boolean, long)
with isAtSplitPoint
true. It has been
processed if there has been a subsequent call to
tryReturnRecordAt(boolean, long)
with isAtSplitPoint
true and at a larger
offset.
Note that for correctness when implementing BoundedSource.BoundedReader.getSplitPointsConsumed()
,
if a reader finishes before tryReturnRecordAt(boolean, long)
returns false,
the reader should add an additional call to markDone()
. This will indicate that
processing for the last seen split point has been finished.
public boolean markDone()
Always returns false, so that it can be used in an implementation of
Source.Reader.start()
or Source.Reader.advance()
as follows:
public boolean start() {
return startImpl() && rangeTracker.tryReturnRecordAt(isAtSplitPoint, position)
|| rangeTracker.markDone();
}
public java.lang.String toString()
toString
in class java.lang.Object