]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.db/src/org/simantics/scl/db/SCLFunctions.java
(refs #7090) New functions subquery and subqueryC
[simantics/platform.git] / bundles / org.simantics.scl.db / src / org / simantics / scl / db / SCLFunctions.java
index 77f6a6f11ee1e298c1fa104d3fa0b6ef4f97ff3b..9b4d6b8ac92ec90d5c3970285efbe15d7550c008 100644 (file)
@@ -263,4 +263,51 @@ public class SCLFunctions {
        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());
+    }
 }