private GapAwareTrackingToken cleanedToken(GapAwareTrackingToken lastToken) { GapAwareTrackingToken previousToken = lastToken; if (lastToken != null && lastToken.getGaps().size() > gapCleaningThreshold) { List<Object[]> results = transactionManager.fetchInTransaction(() -> entityManager() .createQuery( Object[].class .setParameter("firstGapOffset", lastToken.getGaps().first()) .setParameter("maxGlobalIndex", lastToken.getGaps().last() + 1L) .getResultList()); for (Object[] result : results) { Instant timestamp = DateTimeUtils.parseInstant(result[1].toString()); long sequenceNumber = (long) result[0]; if (previousToken.getGaps().contains(sequenceNumber) || timestamp.isAfter(gapTimeoutFrame())) { if (previousToken.getGaps().contains(sequenceNumber - 1)) { previousToken = previousToken.advanceTo(sequenceNumber - 1, maxGapOffset, false);
List<Long> gaps; if (previousToken != null) { gaps = new ArrayList<>(previousToken.getGaps()); if (!gaps.isEmpty()) { sql += " OR " + schema.globalIndexColumn() + " IN (" +
private GapAwareTrackingToken cleanGaps(TrackingToken lastToken) { SortedSet<Long> gaps = ((GapAwareTrackingToken) lastToken).getGaps(); return executeQuery(getConnection(), conn -> { PreparedStatement statement =
if (previousToken == null || previousToken.getGaps().isEmpty()) { query = entityManager().createQuery( "SELECT e.globalIndex, e.type, e.aggregateIdentifier, e.sequenceNumber, e.eventIdentifier, " "WHERE e.globalIndex > :token OR e.globalIndex IN :gaps ORDER BY e.globalIndex ASC", Object[].class ).setParameter("gaps", previousToken.getGaps());
if (lastToken != null && ((GapAwareTrackingToken) lastToken).getGaps().size() > gapCleaningThreshold) { cleanedToken = cleanGaps(lastToken); } else {
private GapAwareTrackingToken cleanedToken(GapAwareTrackingToken lastToken) { GapAwareTrackingToken previousToken = lastToken; if (lastToken != null && lastToken.getGaps().size() > gapCleaningThreshold) { List<Object[]> results = transactionManager.fetchInTransaction(() -> entityManager() .createQuery( Object[].class .setParameter("firstGapOffset", lastToken.getGaps().first()) .setParameter("maxGlobalIndex", lastToken.getGaps().last() + 1L) .getResultList()); for (Object[] result : results) { Instant timestamp = DateTimeUtils.parseInstant(result[1].toString()); long sequenceNumber = (long) result[0]; if (previousToken.getGaps().contains(sequenceNumber) || timestamp.isAfter(gapTimeoutFrame())) { if (previousToken.getGaps().contains(sequenceNumber - 1)) { previousToken = previousToken.advanceTo(sequenceNumber - 1, maxGapOffset, false);
List<Long> gaps; if (previousToken != null) { gaps = new ArrayList<>(previousToken.getGaps()); if (!gaps.isEmpty()) { sql += " OR " + schema.globalIndexColumn() + " IN (" +
private GapAwareTrackingToken cleanGaps(TrackingToken lastToken) { SortedSet<Long> gaps = ((GapAwareTrackingToken) lastToken).getGaps(); return executeQuery(getConnection(), conn -> { PreparedStatement statement =
if (previousToken == null || previousToken.getGaps().isEmpty()) { query = entityManager().createQuery( "SELECT e.globalIndex, e.type, e.aggregateIdentifier, e.sequenceNumber, e.eventIdentifier, " "WHERE e.globalIndex > :token OR e.globalIndex IN :gaps ORDER BY e.globalIndex ASC", Object[].class ).setParameter("gaps", previousToken.getGaps());
if (lastToken != null && ((GapAwareTrackingToken) lastToken).getGaps().size() > gapCleaningThreshold) { cleanedToken = cleanGaps(lastToken); } else {