package edu.washington.escience.myria.parallel;
import java.io.Serializable;
import java.util.concurrent.atomic.AtomicLong;
import com.fasterxml.jackson.annotation.JsonProperty;
/**
*
* The identifier of exchange operators. In a query plan, there may be a set of exchange operators, this ID class is
* used for the server and the workers to find out which exchange operator is the owner of an arriving
* {@link ExchangeData}.
*
*/
public final class ExchangePairID implements Serializable {
/** Required for Java serialization. */
private static final long serialVersionUID = 1L;
/**
* The id.
*/
@JsonProperty private final long oId;
/**
* Atomic global id generator.
* */
private static final AtomicLong GLOBAL_ID_GENERATOR = new AtomicLong();
/**
* Local id generator.
*
*/
private static final AtomicLong LOCAL_ID_GENERATOR = new AtomicLong(-1);
/**
* @return build one from a long value
* @param l the long value.
* */
public static ExchangePairID fromExisting(final long l) {
return new ExchangePairID(l);
}
/**
* @return The only way to create a {@link ExchangePairID}.
*/
public static ExchangePairID newID() {
return new ExchangePairID(GLOBAL_ID_GENERATOR.getAndIncrement());
}
/**
* A local ID can be used locally in a Worker. It will be used when any worker decides to split some computing load
* into multiple concurrent running pieces to use multicore.
*
* @return new local id.
* */
public static ExchangePairID newLocalID() {
return new ExchangePairID(LOCAL_ID_GENERATOR.getAndDecrement());
}
/**
* for use only in {@link ExchangePairID#fromExisting(long)}.
*
* @param oId the long value.
* */
private ExchangePairID(final long oId) {
this.oId = oId;
}
@Override
public boolean equals(final Object o) {
final ExchangePairID oID = (ExchangePairID) o;
if (oID == null) {
return false;
}
return oId == oID.oId;
}
/**
* @return the wrapped long value.
* */
public long getLong() {
return oId;
}
@Override
public int hashCode() {
return (int) oId;
}
@Override
public String toString() {
return oId + "";
}
}