1 package org.simantics.graph.representation;
3 import java.util.Comparator;
5 import java.util.TreeMap;
6 import java.util.TreeSet;
8 import gnu.trove.impl.Constants;
9 import gnu.trove.list.array.TIntArrayList;
10 import gnu.trove.map.hash.TIntObjectHashMap;
11 import gnu.trove.map.hash.TObjectIntHashMap;
12 import gnu.trove.procedure.TObjectProcedure;
14 public class TransferableGraphQueries {
16 private static final int NOT_FOUND = TransferableGraphUtils.NOT_FOUND;
18 private final TransferableGraph1 tg;
20 private final TIntObjectHashMap<Identity> internalIdentities = new TIntObjectHashMap<>(Constants.DEFAULT_CAPACITY, Constants.DEFAULT_LOAD_FACTOR, NOT_FOUND);
21 private final TIntObjectHashMap<Identity> externalIdentities = new TIntObjectHashMap<>(Constants.DEFAULT_CAPACITY, Constants.DEFAULT_LOAD_FACTOR, NOT_FOUND);
22 private final TIntObjectHashMap<Identity> rootIdentities = new TIntObjectHashMap<>(Constants.DEFAULT_CAPACITY, Constants.DEFAULT_LOAD_FACTOR, NOT_FOUND);
24 private final TObjectIntHashMap<String> internalIdentitiesByURI = new TObjectIntHashMap<>();
25 private final TObjectIntHashMap<String> externalIdentitiesByURI = new TObjectIntHashMap<>();
26 private final TObjectIntHashMap<String> rootIdentitiesByURI = new TObjectIntHashMap<>();
28 private final TIntObjectHashMap<TIntArrayList> statementsCache = new TIntObjectHashMap<>(Constants.DEFAULT_CAPACITY, Constants.DEFAULT_LOAD_FACTOR, NOT_FOUND);
30 public TransferableGraphQueries(TransferableGraph1 graph) {
33 // Calculate internals
34 initializeIdentities();
37 private void initializeIdentities() {
38 for (Identity identity : tg.identities) {
39 IdentityDefinition definition = identity.definition;
40 if (definition instanceof Internal) {
41 Internal internal = (Internal) definition;
42 internalIdentities.put(identity.resource, identity);
43 internalIdentitiesByURI.put(getURI(identity), identity.resource);
44 } else if (definition instanceof External) {
45 External external = (External) definition;
46 externalIdentities.put(identity.resource, identity);
47 externalIdentitiesByURI.put(getURI(identity), identity.resource);
48 } else if (definition instanceof Root) {
49 Root root = (Root) definition;
50 rootIdentities.put(identity.resource, identity);
51 rootIdentitiesByURI.put(getURI(identity), identity.resource);
56 public String getURI(Identity identity) {
57 IdentityDefinition definition = identity.definition;
58 if(definition instanceof External) {
59 External def = (External)definition;
60 if(def.parent == -1) return "http:/";
61 else return getURI(def.parent) + "/" + def.name;
62 } else if(definition instanceof Root) {
63 Root def = (Root)definition;
64 if(def.name.isEmpty()) return "http:/";
66 } else if (definition instanceof Internal) {
67 Internal def = (Internal)definition;
68 return getURI(def.parent) + "/" + def.name;
69 } else if (definition instanceof Optional) {
70 Optional def = (Optional)definition;
71 return getURI(def.parent) + "/" + def.name;
77 public String getURI(int id) {
78 Identity identity = getIdentity(id);
80 return "<internal reference " + id + ">:";
81 return getURI(identity);
84 private static final Comparator<Identity> IDENTITY_NAME_COMPARATOR = new Comparator<Identity>() {
87 public int compare(Identity o1, Identity o2) {
88 if (o1.definition instanceof Internal && o2.definition instanceof Internal) {
89 Internal i1 = (Internal) o1.definition;
90 Internal i2 = (Internal) o2.definition;
91 return i1.name.compareTo(i2.name);
92 } else if (o1.definition instanceof External && o2.definition instanceof External) {
93 External e1 = (External) o1.definition;
94 External e2 = (External) o2.definition;
95 return e1.name.compareTo(e2.name);
97 throw new IllegalArgumentException(o1 + " " + o2);
102 public Set<Identity> getChildren(Identity parent) {
103 TreeSet<Identity> children = new TreeSet<>(IDENTITY_NAME_COMPARATOR);
104 internalIdentities.forEachEntry((resource, identity) -> {
105 Internal internal = (Internal) identity.definition;
106 if (internal.parent == parent.resource)
107 children.add(identity);
114 public Identity findInternalByName(String name) {
115 int internal = internalIdentitiesByURI.get(name);
116 if (internal == NOT_FOUND)
118 return internalIdentities.get(internal);
121 private Identity findExternalByName(String name) {
122 int external = externalIdentitiesByURI.get(name);
123 if (external == NOT_FOUND)
125 return externalIdentities.get(external);
128 private Identity findExternalByNameAndParent(String name, int parent) {
129 Identity external = findExternalByName(name);
130 if (external.resource == parent)
135 public Identity findExternalByURI(String uri) {
136 int v = externalIdentitiesByURI.get(uri);
139 return externalIdentities.get(v);
142 public Identity findRootByName(String name) {
143 int root = rootIdentitiesByURI.get(name);
144 if (root == NOT_FOUND)
146 return rootIdentities.get(root);
149 public String getName(Identity identity) {
150 return TransferableGraphUtils.getName(identity);
153 public void forIdentities(TObjectProcedure<Identity> procedure) {
154 for (Identity identity : tg.identities) {
155 if (!procedure.execute(identity)) {
161 public Identity getIdentity(int resource) {
162 Identity result = rootIdentities.get(resource);
164 result = externalIdentities.get(resource);
166 result = internalIdentities.get(resource);
170 public Value findValue(int object) {
171 return TransferableGraphUtils.findValue(tg, object);
174 public TreeMap<String, TreeSet<Integer>> sortByPredicateUniqueStatements(int resource) {
175 TreeMap<String, TreeSet<Integer>> results = new TreeMap<>();
176 TIntArrayList statements = getStatements(resource);
177 for (int i = 0; i < statements.size(); i += 2) {
178 int predicate = statements.get(i);
179 String predicateURI = getURI(predicate);
180 TreeSet<Integer> objects = results.get(predicateURI);
181 if (objects == null) {
182 objects = new TreeSet<>();
184 objects.add(statements.get(i + 1));
185 results.put(predicateURI, objects);
190 public TIntArrayList getStatements(int resource) {
191 // System.out.println("getting statements with " + resource);
192 TIntArrayList statements = statementsCache.get(resource);
193 if (statements == null) {
194 statements = TransferableGraphUtils.getStatements(tg, resource);
195 statementsCache.put(resource, statements);
200 public int getPossibleObject(int subject, Identity predicate) {
201 return TransferableGraphUtils.getPossibleObject2(tg, subject, predicate);
204 public TransferableGraph1 getGraph() {