]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.document.server/src/org/simantics/document/server/request/DocumentRequest.java
Manually "cherry-picked" changes from ae2e31aa to release/1.35.2.1
[simantics/platform.git] / bundles / org.simantics.document.server / src / org / simantics / document / server / request / DocumentRequest.java
1 package org.simantics.document.server.request;
2
3 import java.util.ArrayList;
4 import java.util.Collection;
5 import java.util.Collections;
6 import java.util.Comparator;
7 import java.util.HashSet;
8 import java.util.List;
9 import java.util.Set;
10
11 import org.simantics.db.ReadGraph;
12 import org.simantics.db.common.procedure.adapter.TransientCacheAsyncListener;
13 import org.simantics.db.common.request.UnaryRead;
14 import org.simantics.db.exception.DatabaseException;
15 import org.simantics.db.layer0.request.VariableRead;
16 import org.simantics.db.layer0.variable.Variable;
17 import org.simantics.document.server.JSONObject;
18
19 public class DocumentRequest extends VariableRead<List<JSONObject>> {
20
21     public static boolean PROFILE = false;
22     // Thresholds in microseconds
23     public static int PROFILE_THRESHOLD_NODEREQUEST = 2000;
24     public static int PROFILE_THRESHOLD_VALUEREQUEST = 500;
25
26     public DocumentRequest(Variable var) {
27         super(var);
28     }
29
30     static class CollectNodesRequest extends UnaryRead<Collection<Variable>, Collection<JSONObject>> {
31
32         public CollectNodesRequest(Collection<Variable> nodes) {
33             super(nodes);
34         }
35
36         @Override
37         public Collection<JSONObject> perform(ReadGraph graph) throws DatabaseException {
38             HashSet<JSONObject> rs = new HashSet<>(); // result
39             for(Variable node : parameter) {
40                 rs.add(graph.syncRequest(new NodeRequest(node)));
41             }
42             return rs;
43         }
44
45     }
46
47     private static final Comparator<JSONObject> JSON_COMPARATOR = (o1, o2) -> o1.id.compareTo(o2.id);
48
49     @Override
50     public List<JSONObject> perform(ReadGraph graph) throws DatabaseException {
51
52         long s = System.nanoTime();
53
54         Set<Variable> nodes = graph.syncRequest(new NodesRequest(variable), TransientCacheAsyncListener.<Set<Variable>>instance());
55         if(nodes.isEmpty()) {
56             return Collections.emptyList();
57         }
58
59         Collection<JSONObject> rs = graph.syncRequest(new CollectNodesRequest(nodes));
60
61         ArrayList<JSONObject> result = new ArrayList<>(rs);
62         Collections.sort(result, JSON_COMPARATOR);
63
64         if(PROFILE) {
65             long dura = System.nanoTime()-s;
66             System.err.println("DocumentRequest " + System.identityHashCode(this) + " in " + 1e-6*dura + "ms. " + variable.getURI(graph));
67         }
68
69         return result;
70
71     }
72
73 }