unaryQuery :: (a -> <ReadGraph,e> b) -> a -> <ReadGraph> b
unaryQueryCached :: (a -> <ReadGraph,e> b) -> a -> <ReadGraph> b
+ "Makes a new read request with given procedure for calculating the result. The request is cached only if the current request is listened."
+ subquery :: (<ReadGraph,Proc> a) -> <ReadGraph,Proc> a
+ "Makes a new read request with given procedure for calculating the result. The request is always cached."
+ subqueryC :: (<ReadGraph,Proc> a) -> <ReadGraph,Proc> a
+
importJava "org.simantics.db.layer0.util.Layer0Utils" where
undo :: () -> <Proc> String
undoOperations :: Integer -> <Proc> String
return graph.syncRequest(new SCLUnaryRead(fn, value), TransientCacheAsyncListener.<Object>instance());
}
+
+ private static class Subquery implements Read<Object> {
+ Function q;
+
+ public Subquery(Function q) {
+ this.q = q;
+ }
+
+ @Override
+ public Object perform(ReadGraph graph) throws DatabaseException {
+ SCLContext sclContext = SCLContext.getCurrent();
+ Object oldGraph = sclContext.put("graph", graph);
+ try {
+ return q.apply(Tuple0.INSTANCE);
+ } catch (Throwable e) {
+ if(e instanceof DatabaseException)
+ throw (DatabaseException)e;
+ else
+ throw new DatabaseException(e);
+ } finally {
+ sclContext.put("graph", oldGraph);
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ return q.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if(this == obj)
+ return true;
+ if(obj == null || obj.getClass() != getClass())
+ return false;
+ Subquery other = (Subquery)obj;
+ return q.equals(other.q);
+ }
+ }
+
+ public static Object subquery(ReadGraph graph, Function q) throws DatabaseException {
+ return graph.syncRequest(new Subquery(q));
+ }
+
+ public static Object subqueryC(ReadGraph graph, Function q) throws DatabaseException {
+ return graph.syncRequest(new Subquery(q), TransientCacheAsyncListener.<Object>instance());
+ }
}