package uk.ac.imperial.lsds.seep.api;
import uk.ac.imperial.lsds.seep.infrastructure.ControlEndPoint;
import uk.ac.imperial.lsds.seep.infrastructure.SeepEndPoint;
import uk.ac.imperial.lsds.seep.util.Utils;
public final class DataReference {
public enum ServeMode {
STREAM, // When data is meant to be managed by seep in a different place that where it's generated
STORE, // When data is meant to be managed by seep where it is generated
SINK // When data is not meant to be managed by seep, i.e. in the case of a sink that externalizes it
}
/**
* An ID for the DR. It can be used to include an "owner", e.g. the operator that can serve it.
*/
private final int ownerId;
/**
* Whether the data is contained in SEEP or an external system
*/
private final boolean managed;
/**
* Used to indicate how to dr is expected to be served
*/
private final ServeMode serveMode;
/**
* TODO: probably rename to shuffled
*/
private final boolean partitioned;
/**
* When a DataReference is partitioned, this indicates the partitionId
* FIXME: make it final and see where to assign the id
*/
private int partitionId = -1;
/**
* Info necessary for the DRM to serve this DR
*/
private final DataStore dataStore;
/**
* The endPoint to whom one should contact to request the DR
*/
private final ControlEndPoint endPoint;
private DataReference(int uid, DataStore dataStore, ControlEndPoint endPoint, boolean managed, boolean partitioned, ServeMode serveMode) {
this.ownerId = uid;
this.dataStore = dataStore;
this.endPoint = endPoint;
this.managed = managed;
this.partitioned = partitioned;
this.serveMode = serveMode;
}
private DataReference(DataStore dataStore, ControlEndPoint endPoint, boolean managed, boolean partitioned, ServeMode serveMode, int partitionId) {
this.ownerId = Utils.SeepUID();
this.dataStore = dataStore;
this.endPoint = endPoint;
this.managed = managed;
this.partitioned = partitioned;
this.serveMode = serveMode;
this.partitionId = partitionId;
}
private DataReference(DataStore ds, ControlEndPoint endPoint) {
this.ownerId = Utils.SeepUID();
this.dataStore = ds;
this.endPoint = endPoint;
this.managed = true;
this.partitioned = false;
this.serveMode = ServeMode.STORE;
this.partitionId = -1;
}
public static DataReference makeEmptyDataReference(ControlEndPoint endPoint) {
DataStore ds = new DataStore(DataStoreType.EMPTY);
return new DataReference(ds, endPoint);
}
public static DataReference makeManagedDataReferenceWithOwner(int ownerId, DataStore dataStore, ControlEndPoint endPoint, ServeMode serveMode) {
return new DataReference(ownerId, dataStore, endPoint, true, false, serveMode);
}
public static DataReference makeManagedAndPartitionedDataReferenceWithOwner(int ownerId, DataStore dataStore, ControlEndPoint endPoint, ServeMode serveMode) {
return new DataReference(ownerId, dataStore, endPoint, true, true, serveMode);
}
public static DataReference makeManagedDataReference(DataStore dataStore, ControlEndPoint endPoint, ServeMode serveMode) {
return new DataReference(dataStore, endPoint, true, false, serveMode, -1);
}
public static DataReference makeManagedAndPartitionedDataReference(DataStore dataStore, ControlEndPoint endPoint, ServeMode serveMode, int partitionId) {
return new DataReference(dataStore, endPoint, true, true, serveMode, partitionId);
}
//TODO: consider refactoring name to makeSourceExternalDataReference, is there any other type of external dref?
// TODO: not sure if hte previous comment still applies
public static DataReference makeExternalDataReference(DataStore dataStore) {
return new DataReference(dataStore, null, false, false, null, -1);
}
public static DataReference makeSinkExternalDataReference(DataStore dataStore) {
return new DataReference(dataStore, null, false, false, ServeMode.SINK, -1);
}
public int getId() {
return ownerId;
}
public boolean isManaged() {
return managed;
}
public DataStore getDataStore() {
return dataStore;
}
public SeepEndPoint getControlEndPoint() {
return endPoint;
}
public ServeMode getServeMode() {
return serveMode;
}
public boolean isPartitioned() {
return partitioned;
}
public int getPartitionId() {
return partitionId;
}
/**
* Empty constructor for Kryo serialization
*/
public DataReference() {
this.ownerId = 0;
this.managed = false;
this.serveMode = null;
this.partitioned = false;
this.dataStore = null;
this.endPoint = null;
}
}