/** * @param gtidSet gtid set comprised of closed intervals (like MySQL's executed_gtid_set). */ public GtidSet(String gtidSet) { String[] uuidSets = (gtidSet == null || gtidSet.isEmpty()) ? new String[0] : gtidSet.replace("\n", "").split(","); for (String uuidSet : uuidSets) { int uuidSeparatorIndex = uuidSet.indexOf(":"); String sourceId = uuidSet.substring(0, uuidSeparatorIndex); List<Interval> intervals = new ArrayList<Interval>(); String[] rawIntervals = uuidSet.substring(uuidSeparatorIndex + 1).split(":"); for (String interval : rawIntervals) { String[] is = interval.split("-"); long[] split = new long[is.length]; for (int i = 0, e = is.length; i < e; i++) { split[i] = Long.parseLong(is[i]); } if (split.length == 1) { split = new long[] {split[0], split[0]}; } intervals.add(new Interval(split[0], split[1])); } map.put(sourceId, new UUIDSet(sourceId, intervals)); } }
private boolean add(long transactionId) { int index = findInterval(transactionId); boolean addedToExisting = false; if (index < intervals.size()) { Interval interval = intervals.get(index); if (interval.start == transactionId + 1) { interval.start = transactionId; addedToExisting = true; } else if (interval.end + 1 == transactionId) { interval.end = transactionId; addedToExisting = true; } else if (interval.start <= transactionId && transactionId <= interval.end) { return false; } } if (!addedToExisting) { intervals.add(index, new Interval(transactionId, transactionId)); } if (intervals.size() > 1) { joinAdjacentIntervals(index); } return true; }