1 package org.simantics.db.impl.query;
3 import java.lang.reflect.InvocationTargetException;
4 import java.util.Arrays;
5 import java.util.HashMap;
8 import org.simantics.db.ObjectResourceIdMap;
9 import org.simantics.db.exception.DatabaseException;
10 import org.simantics.db.impl.ClusterBase;
11 import org.simantics.db.impl.ClusterSupport;
12 import org.simantics.db.impl.ClusterTraitsBase;
13 import org.simantics.db.service.Bytes;
14 import org.slf4j.LoggerFactory;
16 import gnu.trove.map.hash.TIntLongHashMap;
18 public class QueryDeserializer {
20 private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(QueryDeserializer.class);
27 private int byteIndex;
29 private TIntLongHashMap clusterKeys = new TIntLongHashMap();
30 private Map<Integer,QueryFactory> ids = new HashMap<Integer,QueryFactory>();
32 public QueryDeserializer(QueryProcessor qp, byte[] bytes) {
34 this.qs = qp.querySupport;
35 this.cs = qs.getClusterSupport();;
39 public byte readByte() {
40 return bytes[byteIndex++];
43 public int readLE4() {
44 int result = Bytes.readLE4(bytes, byteIndex);
49 public long readLE8() {
50 long result = Bytes.readLE8(bytes, byteIndex);
55 public byte[] readBytes(int len) {
56 byte[] result = Arrays.copyOfRange(bytes, byteIndex, byteIndex+len);
61 public void readHeaders() {
62 int idsSize = readLE4();
63 for(int i=0;i<idsSize;i++) {
65 byte[] data = readBytes(size);
66 String id = new String(data);
69 Class<QueryFactory> clazz = (Class<QueryFactory>)getClass().getClassLoader().loadClass(id + "Factory");
70 QueryFactory qf = clazz.getDeclaredConstructor().newInstance();
72 } catch (ClassNotFoundException e) {
73 LOGGER.error("Error while resolving QueryFactory", e);
74 } catch (InstantiationException e) {
75 LOGGER.error("Error while resolving QueryFactory", e);
76 } catch (IllegalAccessException e) {
77 LOGGER.error("Error while resolving QueryFactory", e);
78 } catch (IllegalArgumentException e) {
79 LOGGER.error("Error while resolving QueryFactory", e);
80 } catch (InvocationTargetException e) {
81 LOGGER.error("Error while resolving QueryFactory", e);
82 } catch (NoSuchMethodException e) {
83 LOGGER.error("Error while resolving QueryFactory", e);
84 } catch (SecurityException e) {
85 LOGGER.error("Error while resolving QueryFactory", e);
88 int clusterKeysSize = readLE4();
89 for(int i=0;i<clusterKeysSize;i++) {
90 long cluster = readLE8();
92 clusterKeys.put(key, cluster);
96 public QueryFactory readFactory() {
101 public void readQueries() {
102 int count = readLE4();
103 for(int i=0;i<count;i++) {
104 QueryFactory qf = readFactory();
107 } catch (DatabaseException e) {
113 public int readResource() throws DatabaseException {
117 int clusterKey = ClusterTraitsBase.getClusterKeyFromResourceKey(key);
118 long cluster = clusterKeys.get(clusterKey);
119 ClusterBase cb = cs.getClusterByClusterId(cluster);
120 return ClusterTraitsBase.createResourceKey(cb.getClusterKey(), ClusterTraitsBase.getResourceIndexFromResourceKey(key));
123 public byte[] readByteArray() {
127 return readBytes(len);
130 public String readString() {
131 return new String(readByteArray());
134 public ObjectResourceIdMap<String> createChildMap() {
135 return qs.createChildMap();
138 AssertedPredicates readAssertedPredicates() throws DatabaseException {
139 int r = readResource();
140 return qc.getOrCreateAssertedPredicates(r);
143 AssertedStatements readAssertedStatements() throws DatabaseException {
144 int r1 = readResource();
145 int r2 = readResource();
146 return qc.getOrCreateAssertedStatements(r1, r2);
149 ChildMap readChildMap() throws DatabaseException {
150 int r = readResource();
151 return qc.getOrCreateChildMap(r);
154 DirectObjects readDirectObjects() throws DatabaseException {
155 int r1 = readResource();
156 int r2 = readResource();
157 return qc.getOrCreateDirectObjects(r1, r2);
160 DirectPredicates readDirectPredicates() throws DatabaseException {
161 int r = readResource();
162 return qc.getOrCreateDirectPredicates(r);
165 Objects readObjects() throws DatabaseException {
166 int r1 = readResource();
167 int r2 = readResource();
168 return qc.getOrCreateObjects(r1, r2);
171 OrderedSet readOrderedSet() throws DatabaseException {
172 int r = readResource();
173 return qc.getOrCreateOrderedSet(r);
176 Predicates readPredicates() throws DatabaseException {
177 int r = readResource();
178 return qc.getOrCreatePredicates(r);
181 PrincipalTypes readPrincipalTypes() throws DatabaseException {
182 int r = readResource();
183 return qc.getOrCreatePrincipalTypes(r);
186 RelationInfoQuery readRelationInfoQuery() throws DatabaseException {
187 int r = readResource();
188 return qc.getOrCreateRelationInfoQuery(r);
191 Statements readStatements() throws DatabaseException {
192 int r1 = readResource();
193 int r2 = readResource();
194 return qc.getOrCreateStatements(r1, r2);
197 SuperRelations readSuperRelations() throws DatabaseException {
198 int r = readResource();
199 return qc.getOrCreateSuperRelations(r);
202 SuperTypes readSuperTypes() throws DatabaseException {
203 int r = readResource();
204 return qc.getOrCreateSuperTypes(r);
207 TypeHierarchy readTypeHierarchy() throws DatabaseException {
208 int r = readResource();
209 return qc.getOrCreateTypeHierarchy(r);
212 Types readTypes() throws DatabaseException {
213 int r = readResource();
214 return qc.getOrCreateTypes(r);
217 URIToResource readURIToResource() throws DatabaseException {
218 String s = readString();
219 return qc.getOrCreateURIToResource(s);
222 ValueQuery readValueQuery() throws DatabaseException {
223 int r = readResource();
224 return qc.getOrCreateValueQuery(r);