in accord-core/src/main/java/accord/messages/CheckStatus.java [434:476]
public CheckStatusOk merge(CheckStatusOk that)
{
if (!preferSelf(that))
{
Invariants.require(that.preferSelf(this));
return that.merge(this);
}
// preferentially select the one that is coordinating, if any
CheckStatusOk prefer = this.isCoordinating ? this : that;
CheckStatusOk defer = prefer == this ? that : this;
// then select the max along each criteria, preferring the coordinator
KnownMap mergeMap = KnownMap.merge(prefer.map, defer.map);
CheckStatusOk maxStatus = SaveStatus.max(prefer, prefer.maxKnowledgeSaveStatus, prefer.acceptedOrCommitted, defer, defer.maxKnowledgeSaveStatus, defer.acceptedOrCommitted, true);
SaveStatus mergeMaxKnowledgeStatus = SaveStatus.merge(prefer.maxKnowledgeSaveStatus, prefer.acceptedOrCommitted, defer.maxKnowledgeSaveStatus, defer.acceptedOrCommitted, true);
SaveStatus mergeMaxStatus = SaveStatus.merge(prefer.maxSaveStatus, prefer.acceptedOrCommitted, defer.maxSaveStatus, defer.acceptedOrCommitted, false);
CheckStatusOk maxPromised = prefer.maxPromised.compareTo(defer.maxPromised) >= 0 ? prefer : defer;
CheckStatusOk maxAccepted = prefer.maxAcceptedOrCommitted.compareTo(defer.maxAcceptedOrCommitted) >= 0 ? prefer : defer;
CheckStatusOk maxHomeKey = prefer.homeKey != null || defer.homeKey == null ? prefer : defer;
CheckStatusOk maxExecuteAt = prefer.maxKnown().executeAt().compareTo(defer.maxKnown().executeAt()) >= 0 ? prefer : defer;
Route<?> mergedRoute = Route.merge(prefer.route, (Route)defer.route);
Durability mergedDurability = Durability.merge(prefer.durability, defer.durability);
InvalidIf invalidIf = prefer.invalidIf.atLeast(defer.invalidIf);
// if the maximum (or preferred equal) is the same on all dimensions, return it
if (mergeMaxKnowledgeStatus == maxStatus.maxKnowledgeSaveStatus
&& mergeMaxStatus == maxStatus.maxSaveStatus
&& maxStatus == maxPromised && maxStatus == maxAccepted
&& maxStatus == maxHomeKey && maxStatus == maxExecuteAt
&& maxStatus.route == mergedRoute
&& maxStatus.map.equals(mergeMap)
&& maxStatus.durability == mergedDurability)
{
return maxStatus;
}
// otherwise assemble the maximum of each, and propagate isCoordinating from the origin we selected the promise from
boolean isCoordinating = maxPromised == prefer ? prefer.isCoordinating : defer.isCoordinating;
return new CheckStatusOk(mergeMap, mergeMaxKnowledgeStatus, mergeMaxStatus,
maxPromised.maxPromised, maxAccepted.maxAcceptedOrCommitted, maxStatus.acceptedOrCommitted,
maxExecuteAt.executeAt, isCoordinating, mergedDurability, mergedRoute, maxHomeKey.homeKey, invalidIf);
}