import org.simantics.db.ReadGraph;
import org.simantics.db.Resource;
+import org.simantics.db.Session;
import org.simantics.db.Statement;
import org.simantics.db.WriteGraph;
+import org.simantics.db.common.request.ReadRequest;
import org.simantics.db.exception.DatabaseException;
import org.simantics.interop.test.GraphChanges;
public abstract void populate(ReadGraph g) throws DatabaseException;
+ /**
+ * Secondary populate method. Override this for chunked DB operations.
+ * @param session
+ * @throws DatabaseException
+ */
+ public void populate(Session session) throws DatabaseException {
+ session.syncRequest(new ReadRequest() {
+
+ @Override
+ public void run(ReadGraph graph) throws DatabaseException {
+ populate(graph);
+ }
+ });
+ }
+
protected boolean compares(Resource r1, Resource r2) {
if (r1.equals(r2))
return true;
import org.simantics.db.ReadGraph;
import org.simantics.db.Resource;
+import org.simantics.db.Session;
+import org.simantics.db.common.request.ResourceRead;
import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.request.Read;
import org.simantics.interop.test.GraphChanges;
populate(g);
}
+ public UpdateTree(Session session, GraphChanges changes, UpdateOperations updateOps) throws DatabaseException {
+ this.changes = changes;
+ this.nodes = new HashMap<Resource, UpdateNode>();
+ this.rootNode = session.syncRequest(new NodeRequest(UpdateStatus.EXIST, changes.getResource1()));
+ nodes.put(changes.getResource1(), rootNode);
+ nodes.put(changes.getResource2(), rootNode);
+ this.updateOps = updateOps;
+ this.updateOps.populate(session);
+ populate(session);
+ }
+
+ private class NodeRequest extends ResourceRead<UpdateNode> {
+ UpdateStatus status;
+ public NodeRequest(UpdateStatus status, Resource r) {
+ super(r);
+ this.status = status;
+ }
+ @Override
+ public UpdateNode perform(ReadGraph graph) throws DatabaseException {
+ return createNode(graph, status, resource);
+ }
+ }
+
public UpdateOperations getUpdateOps() {
return updateOps;
}
return false;
}
- private void populate(ReadGraph g) throws DatabaseException{
+ protected void populate(ReadGraph g) throws DatabaseException{
for (UpdateOp op : updateOps.getOperations()) {
- if (!handleCustom(g, op)) {
- if (op.isAdd()) {
- addNode(g, null,op.getResource());
- } else if (op.isDelete()){
- addNode(g, op.getResource(), null);
- } else if (op.isChange()) {
- Resource o = op.getResource();
- Resource l = getChanges().getComparable().containsLeft(o) ? o :getChanges().getComparable().getLeft(o);
- Resource r = getChanges().getComparable().containsRight(o) ? o :getChanges().getComparable().getRight(o);
- addNode(g, l, r);
- }
+ populate(g, op);
+ }
+
+ }
+
+ protected void populate(ReadGraph g, UpdateOp op) throws DatabaseException{
+ if (!handleCustom(g, op)) {
+ if (op.isAdd()) {
+ addNode(g, null,op.getResource());
+ } else if (op.isDelete()){
+ addNode(g, op.getResource(), null);
+ } else if (op.isChange()) {
+ Resource o = op.getResource();
+ Resource l = getChanges().getComparable().containsLeft(o) ? o :getChanges().getComparable().getLeft(o);
+ Resource r = getChanges().getComparable().containsRight(o) ? o :getChanges().getComparable().getRight(o);
+ addNode(g, l, r);
}
}
+ }
+
+ protected void populate(Session session) throws DatabaseException{
+ int i = 0;
+ while (i < updateOps.getOperations().size()) {
+ i = session.syncRequest(new PopulateRead(i));
+ }
+ }
+
+ protected class PopulateRead implements Read<Integer> {
+ int s;
+ public PopulateRead(int s) {
+ this.s = s;
+ }
+ public Integer perform(ReadGraph graph) throws DatabaseException {
+ int l = s + 100;
+ if (l > updateOps.getOperations().size())
+ l = updateOps.getOperations().size();
+ for (int i = s; i < l; i++) {
+ UpdateOp op = updateOps.getOperations().get(i);
+ populate(graph, op);
+ }
+ return l;
+ }
}
}