protected UUIDSet(com.github.shyiko.mysql.binlog.GtidSet.UUIDSet uuidSet) { this.uuid = uuidSet.getUUID(); uuidSet.getIntervals().forEach(interval -> { intervals.add(new Interval(interval.getStart(), interval.getEnd())); }); Collections.sort(this.intervals); if (this.intervals.size() > 1) { // Collapse adjacent intervals ... for (int i = intervals.size() - 1; i != 0; --i) { Interval before = this.intervals.get(i - 1); Interval after = this.intervals.get(i); if ((before.getEnd() + 1) == after.getStart()) { this.intervals.set(i - 1, new Interval(before.getStart(), after.getEnd())); this.intervals.remove(i); } } } } protected UUIDSet(String uuid, Interval interval) {
@Override public byte[] toByteArray() throws IOException { ByteArrayOutputStream buffer = new ByteArrayOutputStream(); buffer.writeInteger(CommandType.BINLOG_DUMP_GTID.ordinal(), 1); buffer.writeInteger(0, 2); // flag buffer.writeLong(this.serverId, 4); buffer.writeInteger(this.binlogFilename.length(), 4); buffer.writeString(this.binlogFilename); buffer.writeLong(this.binlogPosition, 8); Collection<GtidSet.UUIDSet> uuidSets = gtidSet.getUUIDSets(); int dataSize = 8 /* number of uuidSets */; for (GtidSet.UUIDSet uuidSet : uuidSets) { dataSize += 16 /* uuid */ + 8 /* number of intervals */ + uuidSet.getIntervals().size() /* number of intervals */ * 16 /* start-end */; } buffer.writeInteger(dataSize, 4); buffer.writeLong(uuidSets.size(), 8); for (GtidSet.UUIDSet uuidSet : uuidSets) { buffer.write(hexToByteArray(uuidSet.getUUID().replace("-", ""))); Collection<GtidSet.Interval> intervals = uuidSet.getIntervals(); buffer.writeLong(intervals.size(), 8); for (GtidSet.Interval interval : intervals) { buffer.writeLong(interval.getStart(), 8); buffer.writeLong(interval.getEnd() + 1 /* right-open */, 8); } } return buffer.toByteArray(); }
/** * Determine if this interval is completely within the supplied interval. * @param other the interval to compare with * @return {@code true} if the {@link #getStart() start} is greater than or equal to the supplied interval's * {@link #getStart() start} and the {@link #getEnd() end} is less than or equal to the supplied * interval's {@link #getEnd() end}, or {@code false} otherwise */ public boolean isContainedWithin(Interval other) { if (other == this) { return true; } if (other == null) { return false; } return this.getStart() >= other.getStart() && this.getEnd() <= other.getEnd(); }
@Override public int hashCode() { return (int) getStart(); }