/** {@inheritDoc} */ @Override public IgfsFileRange resolveRecords(IgniteFileSystem fs, IgfsInputStream stream, IgfsFileRange suggestedRecord) throws IgniteException, IOException { long suggestedStart = suggestedRecord.start(); long suggestedEnd = suggestedStart + suggestedRecord.length(); IgniteBiTuple<State, Delimiter> firstDelim = findFirstDelimiter(stream, suggestedStart); State state = firstDelim != null ? firstDelim.getKey() : new State(); Delimiter curDelim = firstDelim.getValue(); while (curDelim != null && curDelim.end < suggestedStart) curDelim = nextDelimiter(stream, state); if (curDelim != null && (curDelim.end >= suggestedStart && curDelim.end < suggestedEnd) || suggestedStart == 0 ) { // We found start delimiter. long start = suggestedStart == 0 ? 0 : curDelim.end; if (curDelim == null || curDelim.end < suggestedEnd) { IgniteBiTuple<State, Delimiter> lastDelim = findFirstDelimiter(stream, suggestedEnd); state = lastDelim != null ? firstDelim.getKey() : new State(); curDelim = lastDelim.getValue(); while (curDelim != null && curDelim.end < suggestedEnd) curDelim = nextDelimiter(stream, state); } long end = curDelim != null ? curDelim.end : stream.position(); return new IgfsFileRange(suggestedRecord.path(), start, end - start); } else // We failed to find any delimiters up to the EOS. return null; }
/** {@inheritDoc} */ @Override public IgfsFileRange resolveRecords(IgniteFileSystem fs, IgfsInputStream stream, IgfsFileRange suggestedRecord) throws IgniteException, IOException { long suggestedStart = suggestedRecord.start(); long suggestedEnd = suggestedStart + suggestedRecord.length(); IgniteBiTuple<State, Delimiter> firstDelim = findFirstDelimiter(stream, suggestedStart); State state = firstDelim != null ? firstDelim.getKey() : new State(); Delimiter curDelim = firstDelim.getValue(); while (curDelim != null && curDelim.end < suggestedStart) curDelim = nextDelimiter(stream, state); if (curDelim != null && (curDelim.end >= suggestedStart && curDelim.end < suggestedEnd) || suggestedStart == 0 ) { // We found start delimiter. long start = suggestedStart == 0 ? 0 : curDelim.end; if (curDelim == null || curDelim.end < suggestedEnd) { IgniteBiTuple<State, Delimiter> lastDelim = findFirstDelimiter(stream, suggestedEnd); state = lastDelim != null ? firstDelim.getKey() : new State(); curDelim = lastDelim.getValue(); while (curDelim != null && curDelim.end < suggestedEnd) curDelim = nextDelimiter(stream, state); } long end = curDelim != null ? curDelim.end : stream.position(); return new IgfsFileRange(suggestedRecord.path(), start, end - start); } else // We failed to find any delimiters up to the EOS. return null; }