private NonSegmentedIncludeCharPredicate buildInclusiveFromPredicate(final DataRange dataRange,
                                                                         final boolean nullRangeResult) {
        // FROM (inclusive)
        final NonSegmentedIncludeCharPredicate inclusiveFromPredicate;
        if (dataRange == null) {
            LOGGER.debug("null dataRange, predicate returns {}", nullRangeResult);
            inclusiveFromPredicate = tracker -> nullRangeResult;
        } else if (!dataRange.hasBoundedStart()) {
            // No start bound
            LOGGER.debug("Unbounded from predicate");
            inclusiveFromPredicate = tracker -> true;
        } else if (dataRange.getOptByteOffsetFrom().isPresent()) {
            final long startByteOffset = dataRange.getOptByteOffsetFrom().get();
            LOGGER.debug("Byte offset (inc.) from predicate [{}]", startByteOffset);
            inclusiveFromPredicate = tracker ->
                    tracker.currByteOffset >= startByteOffset;
        } else if (dataRange.getOptCharOffsetFrom().isPresent()) {
            final long startCharOffset = dataRange.getOptCharOffsetFrom().get();
            LOGGER.debug("Char offset (inc.) from predicate [{}]", startCharOffset);
            inclusiveFromPredicate = tracker ->
                    tracker.currCharOffset >= startCharOffset;
        } else if (dataRange.getOptLocationFrom().isPresent()) {
            final int lineNoFrom = dataRange.getOptLocationFrom().get().getLineNo();
            final int colNoFrom = dataRange.getOptLocationFrom().get().getColNo();
            LOGGER.debug("Line/col (inc.) from predicate [{}, {}]", lineNoFrom, colNoFrom);
            inclusiveFromPredicate = tracker ->
                    tracker.currLineNo > lineNoFrom
                    || (tracker.currLineNo == lineNoFrom && tracker.currColNo >= colNoFrom);
        } else {
            throw new RuntimeException("No start point specified");
        }
        return inclusiveFromPredicate;
    }
@return True if we are after or on the first char of our range.
stroom-data/stroom-data-store-impl/src/main/java/stroom/data/store/impl/DataFetcher.java