Here is a set of interfaces that would allow reading partial data from the AIDA Store.
AIDA object would now have to manage its own data - retrieve missing data from the Store when needed, allow data parts that are not currently in use to be Garbage-Collected, backup temporary data to the Store.
/**
* Since the AIDA IManagedObjects in ITree don't know their own paths,
* we have to pass the object to the Store. Store must be able to determine
* the ITree path of the object and path (or some sort of ID) of the corresponding
* data in the storage
*/
public interface IPartialDataStore extends OnDemandStore {
/**
* To be used with any simple AIDA object that has no
* internal structure, like: ICloud, IDataPointSet, IHstogram
*/
IPatialData readPartialData(IManagedObject aidaObject, int row);
/**
* To be used with AIDA objects that has internal structure,
* like: ITuple
*/
IComplexPatialData readComplexPartialData(IManagedObject aidaObject, String pathInObject, int[] rows);
/**
* Writes partial data to the Store.
* This method might be called by the implementation of the particular
* IManagedObject when part of its data is Garbage-Collected and Finalized
*/
void writePartialData(IManagedObject mo, IPartialData pd) throws IOException;
/**
* Writes complex partial data to the Store
* This method might be called by the implementation of the particular
* IManagedObject when part of its data is Garbage-Collected and Finalized
*/
void writeComplexPartialData(IManagedObject mo, IComplexPartialData pd) throws IOException;
}
public interface IPatialData {
int startIndex();
int endIndex();
String type();
Object data();
}
public interface IComplexPatialData {
int[] startIndices();
int[] endIndices();
String pathInObject();
String type();
Object data();
}
Main problem with this approach is that AIDA object that requested the partial data does not know what is it getting back - it would need to cast generic Object to something specific, like ICloud, double[], etc.