1 /*******************************************************************************
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 *******************************************************************************/
12 package org.simantics.db.procore.cluster;
14 import java.io.ByteArrayInputStream;
15 import java.io.InputStream;
16 import java.util.function.Consumer;
18 import org.simantics.db.Resource;
19 import org.simantics.db.exception.DatabaseException;
20 import org.simantics.db.exception.ExternalValueException;
21 import org.simantics.db.exception.ValidationException;
22 import org.simantics.db.impl.ClusterI;
23 import org.simantics.db.impl.ClusterSupport;
24 import org.simantics.db.impl.ClusterTraitsBase;
25 import org.simantics.db.impl.ForEachObjectContextProcedure;
26 import org.simantics.db.impl.ForEachObjectProcedure;
27 import org.simantics.db.impl.ForPossibleRelatedValueContextProcedure;
28 import org.simantics.db.impl.ForPossibleRelatedValueProcedure;
29 import org.simantics.db.impl.Table;
30 import org.simantics.db.impl.TableHeader;
31 import org.simantics.db.impl.graph.ReadGraphImpl;
32 import org.simantics.db.procedure.AsyncContextMultiProcedure;
33 import org.simantics.db.procedure.AsyncMultiProcedure;
34 import org.simantics.db.service.ClusterUID;
35 import org.simantics.db.service.ResourceUID;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
39 import fi.vtt.simantics.procore.DebugPolicy;
40 import fi.vtt.simantics.procore.internal.ClusterChange;
41 import fi.vtt.simantics.procore.internal.ClusterStream;
42 import fi.vtt.simantics.procore.internal.ClusterTable;
43 import fi.vtt.simantics.procore.internal.SessionImplSocket;
44 import gnu.trove.map.hash.TIntShortHashMap;
45 import gnu.trove.set.hash.TIntHashSet;
47 final public class ClusterSmall extends ClusterImpl {
49 private static final Logger LOGGER = LoggerFactory.getLogger(ClusterSmall.class);
51 private static final int TABLE_HEADER_SIZE = TableHeader.HEADER_SIZE + TableHeader.EXTRA_SIZE;
52 private static final int RESOURCE_TABLE_OFFSET = 0;
53 private static final int PREDICATE_TABLE_OFFSET = RESOURCE_TABLE_OFFSET + TABLE_HEADER_SIZE;
54 private static final int OBJECT_TABLE_OFFSET = PREDICATE_TABLE_OFFSET + TABLE_HEADER_SIZE;
55 private static final int VALUE_TABLE_OFFSET = OBJECT_TABLE_OFFSET + TABLE_HEADER_SIZE;
56 private static final int FLAT_TABLE_OFFSET = VALUE_TABLE_OFFSET + TABLE_HEADER_SIZE;
57 private static final int COMPLETE_TABLE_OFFSET = FLAT_TABLE_OFFSET + TABLE_HEADER_SIZE;
58 private static final int FOREIGN_TABLE_OFFSET = COMPLETE_TABLE_OFFSET + TABLE_HEADER_SIZE;
59 private static final int INT_HEADER_SIZE = FOREIGN_TABLE_OFFSET + TABLE_HEADER_SIZE;
60 private final int clusterBits;
61 public final ResourceTableSmall resourceTable;
62 private PredicateTable predicateTable;
63 final ObjectTable objectTable;
64 public final ValueTableSmall valueTable;
65 public final ForeignTableSmall foreignTable;
66 private final CompleteTableSmall completeTable;
67 private final ClusterMapSmall clusterMap;
68 private final int[] headerTable;
69 private final ClusterSupport clusterSupport;
70 private boolean proxy;
71 private boolean deleted = false;
73 public ClusterSmall(ClusterUID clusterUID, int clusterKey, ClusterTable clusterTable, ClusterSupport support) {
74 super(clusterUID, clusterKey, support);
75 if(DebugPolicy.REPORT_CLUSTER_EVENTS)
76 new Exception(clusterUID.toString()).printStackTrace();
78 this.headerTable = null;
79 this.resourceTable = null;
80 this.foreignTable = null;
81 this.predicateTable = null;
82 this.objectTable = null;
83 this.valueTable = null;
84 this.completeTable = null;
85 this.clusterMap = null;
86 this.clusterSupport = null;
90 public ClusterSmall(ClusterUID clusterUID, int clusterKey, ClusterSupport support) {
91 super(clusterUID, clusterKey, support);
92 if(DebugPolicy.REPORT_CLUSTER_EVENTS)
93 new Exception(clusterUID.toString()).printStackTrace();
95 this.headerTable = new int[INT_HEADER_SIZE];
96 this.resourceTable = new ResourceTableSmall(this, headerTable, RESOURCE_TABLE_OFFSET);
97 this.foreignTable = new ForeignTableSmall(this, headerTable, FOREIGN_TABLE_OFFSET);
98 this.predicateTable = new PredicateTable(this, headerTable, PREDICATE_TABLE_OFFSET);
99 this.objectTable = new ObjectTable(this, headerTable, OBJECT_TABLE_OFFSET);
100 this.valueTable = new ValueTableSmall(this, headerTable, VALUE_TABLE_OFFSET);
101 this.completeTable = new CompleteTableSmall(this, headerTable, COMPLETE_TABLE_OFFSET);
102 this.clusterMap = new ClusterMapSmall(this, foreignTable);
103 this.clusterSupport = support;
104 this.clusterBits = ClusterTraitsBase.getClusterBits(clusterKey);
105 this.importance = -clusterTable.timeCounter();
107 protected ClusterSmall(long[] longs, int[] ints, byte[] bytes, ClusterSupport support, int clusterKey)
108 throws DatabaseException {
109 super(checkValidity(-1, longs, ints, bytes), clusterKey, support);
111 if (ints.length < INT_HEADER_SIZE)
112 throw new IllegalArgumentException("Too small integer table for cluster.");
113 this.headerTable = ints;
114 if(DebugPolicy.REPORT_CLUSTER_EVENTS) new Exception(Long.toString(clusterId)).printStackTrace();
115 this.resourceTable = new ResourceTableSmall(this, ints, RESOURCE_TABLE_OFFSET, longs);
116 this.foreignTable = new ForeignTableSmall(this, headerTable, FOREIGN_TABLE_OFFSET, longs);
117 this.predicateTable = new PredicateTable(this, ints, PREDICATE_TABLE_OFFSET, ints);
118 this.objectTable = new ObjectTable(this, ints, OBJECT_TABLE_OFFSET, ints);
119 this.valueTable = new ValueTableSmall(this, ints, VALUE_TABLE_OFFSET, bytes);
120 this.completeTable = new CompleteTableSmall(this, headerTable, COMPLETE_TABLE_OFFSET, ints);
121 this.clusterMap = new ClusterMapSmall(this, foreignTable);
122 this.clusterSupport = support;
123 this.clusterBits = ClusterTraitsBase.getClusterBits(clusterKey);
124 this.importance = clusterTable.timeCounter();
125 clusterTable.markImmutable(this, getImmutable());
128 System.out.println("Cluster " + clusterId);
129 System.out.println("-size:" + getUsedSpace());
130 System.out.println(" -rt:" + (resourceTable.getTableCapacity() * 8 + 8));
131 System.out.println(" -ft:" + foreignTable.getTableCapacity() * 8);
132 System.out.println(" -pt:" + predicateTable.getTableCapacity() * 4);
133 System.out.println(" -ot:" + objectTable.getTableCapacity() * 4);
134 System.out.println(" -ct:" + completeTable.getTableCapacity() * 4);
135 System.out.println(" -vt:" + valueTable.getTableCapacity());
137 System.out.println("-resourceTable:");
138 System.out.println(" -resourceCount=" + resourceTable.getResourceCount());
139 System.out.println(" -size=" + resourceTable.getTableSize());
140 System.out.println(" -capacity=" + resourceTable.getTableCapacity());
141 System.out.println(" -count=" + resourceTable.getTableCount());
142 System.out.println(" -size=" + resourceTable.getTableSize());
143 //resourceTable.analyse();
145 public void checkDirectReference(int dr)
146 throws DatabaseException {
148 if (!ClusterTraits.statementIndexIsDirect(dr))
149 throw new ValidationException("Reference is not direct. Reference=" + dr);
150 if (ClusterTraits.isFlat(dr))
151 throw new ValidationException("Reference is flat. Reference=" + dr);
152 if (ClusterTraits.isLocal(dr)) {
153 if (dr < 1 || dr > resourceTable.getUsedSize())
154 throw new ValidationException("Illegal local reference. Reference=" + dr);
156 int fi = ClusterTraits.getForeignIndexFromReference(dr);
157 int ri = ClusterTraits.getResourceIndexFromForeignReference(dr);
158 if (fi < 1 || fi > foreignTable.getUsedSize())
159 throw new ValidationException("Illegal foreign reference. Reference=" + dr + " foreign index=" + fi);
160 if (ri < 1 || ri > ClusterTraits.getMaxNumberOfResources())
161 throw new ValidationException("Illegal foreign reference. Reference=" + dr + " resource index=" + ri);
164 public void checkPredicateIndex(int pi)
165 throws DatabaseException {
167 // predicateTable.checkPredicateSetIndex(this, pi);
169 public void checkObjectSetReference(int or)
170 throws DatabaseException {
172 if (ClusterTraits.statementIndexIsDirect(or))
173 throw new ValidationException("Illegal object set reference. Reference=" + or);
174 int oi = ClusterTraits.statementIndexGet(or);
175 this.objectTable.checkObjectSetIndex(this, oi);
178 public void checkValueInit()
179 throws DatabaseException {
180 valueTable.checkValueInit();
182 public void checkValue(int capacity, int index)
183 throws DatabaseException {
184 valueTable.checkValue(capacity, index);
186 public void checkValueFini()
187 throws DatabaseException {
188 valueTable.checkValueFini();
190 public void checkForeingIndex(int fi)
191 throws DatabaseException {
193 if (fi<1 || fi > foreignTable.getUsedSize())
194 throw new ValidationException("Illegal foreign index=" + fi);
196 public void checkCompleteSetReference(int cr)
197 throws DatabaseException {
198 if (!ClusterTraits.completeReferenceIsMultiple(cr))
199 throw new ValidationException("Illegal complete set reference. Reference=" + cr);
201 this.completeTable.checkCompleteSetIndex(this, ci);
204 throws DatabaseException {
206 // this.completeTable.check(this);
207 // this.objectTable.check(this);
208 // // Must be after object table check.
209 // this.predicateTable.check(this);
210 // this.resourceTable.check(this);
213 public CompleteTypeEnum getCompleteType(int resourceKey, ClusterSupport support)
214 throws DatabaseException {
215 if (deleted) return CompleteTypeEnum.NotComplete;
216 final int resourceRef = getLocalReference(resourceKey);
217 CompleteTypeEnum ct = resourceTable.getCompleteType(resourceRef);
219 System.out.println("ClusterSmall.getCompleteType rk=" + resourceKey + " ct=" + ct);
224 public int getCompleteObjectKey(int resourceKey, ClusterSupport support)
225 throws DatabaseException {
226 if (deleted) return 0;
227 final int resourceIndexOld = getLocalReference(resourceKey);
228 short completeRef = resourceTable.getCompleteObjectRef(resourceIndexOld);
231 if (0 == completeRef)
232 throw new DatabaseException("Resource's complete object refernce is null. Resource key=" + resourceKey + ".");
233 ClusterI.CompleteTypeEnum completeType = resourceTable.getCompleteType(resourceIndexOld);
234 if (completeType == ClusterI.CompleteTypeEnum.NotComplete)
235 throw new DatabaseException("Resource has multiple complete objects. Resource key=" + resourceKey + ".");
236 if (ClusterTraitsSmall.resourceRefIsLocal(completeRef)) {
237 clusterIndex = clusterKey;
238 resourceIndex = completeRef;
239 } else { // Resource has one complete statement.
240 ResourceUID resourceUID = clusterMap.getForeignResourceUID(completeRef);
241 ClusterI c = support.getClusterByClusterUIDOrMake(resourceUID.asCID());
242 clusterIndex = c.getClusterKey();
243 resourceIndex = resourceUID.getIndex();
245 int key = ClusterTraits.createResourceKey(clusterIndex, resourceIndex);
247 System.out.println("ClusterSmall.complete object rk=" + resourceKey + " ck=" + key);
252 public boolean isComplete(int resourceKey, ClusterSupport support)
253 throws DatabaseException {
254 if (deleted) return false;
255 final int resourceRef = getLocalReference(resourceKey);
256 final ClusterI.CompleteTypeEnum completeType = resourceTable.getCompleteType(resourceRef);
257 boolean complete = completeType != ClusterI.CompleteTypeEnum.NotComplete;
259 System.out.println("ClusterSmall.key=" + resourceKey + " isComplete=" + complete);
262 public int getSingleObject(int resourceKey, int predicateKey, int objectIndex, ClusterSupport support) throws DatabaseException {
264 System.out.println("ClusterSmall.getSingleObject: rk=" + resourceKey + " pk=" + predicateKey);
265 if (deleted) return 0;
266 if (0 == objectIndex) {
267 final int resourceIndex = ClusterTraitsBase.getResourceIndexFromResourceKeyNoThrow(resourceKey);
268 final short pRef = getInternalReferenceOrZero2(predicateKey, support);
269 final ClusterI.CompleteTypeEnum pCompleteType = ClusterTraitsBase.getCompleteTypeFromResourceKey(predicateKey);
270 return resourceTable.getSingleObject(resourceIndex, support, pRef, pCompleteType, completeTable, this);
272 return objectTable.getSingleObject(objectIndex, support, this);
275 public void forObjects(ReadGraphImpl graph, int resourceKey, int predicateKey, int objectIndex, AsyncMultiProcedure<Resource> procedure,
276 ClusterSupport support) throws DatabaseException {
279 System.out.println("ClusterSmall.forObjects1: rk=" + resourceKey + " pk=" + predicateKey);
280 if (0 == objectIndex) {
281 final int resourceIndex = ClusterTraitsBase.getResourceIndexFromResourceKey(resourceKey);
282 final int pRef = getInternalReferenceOrZero2(predicateKey, support);
283 final ClusterI.CompleteTypeEnum pCompleteType = ClusterTraitsBase.getCompleteTypeFromResourceKey(predicateKey);
284 resourceTable.foreachObject(resourceIndex, graph, procedure, support, pRef, pCompleteType, completeTable, this);
287 objectTable.foreachObject(graph, objectIndex, procedure, this);
290 public <C> void forObjects(ReadGraphImpl graph, int resourceKey, int predicateKey, int objectIndex, C context, AsyncContextMultiProcedure<C, Resource> procedure,
291 ClusterSupport support) throws DatabaseException {
293 System.out.println("ClusterSmall.forObjects1: rk=" + resourceKey + " pk=" + predicateKey);
295 if (0 == objectIndex) {
296 final int resourceIndex = ClusterTraitsBase.getResourceIndexFromResourceKey(resourceKey);
297 final int pRef = getInternalReferenceOrZero2(predicateKey, support);
298 final ClusterI.CompleteTypeEnum pCompleteType = ClusterTraitsBase.getCompleteTypeFromResourceKey(predicateKey);
299 resourceTable.foreachObject(resourceIndex, graph, context, procedure, support, pRef, pCompleteType, completeTable, this);
302 objectTable.foreachObject(graph, objectIndex, context, procedure, this);
306 public <Context> boolean forObjects(int resourceKey, int predicateKey, int objectIndex, ObjectProcedure<Context> procedure,
307 Context context, ClusterSupport support) throws DatabaseException {
309 System.out.println("ClusterSmall.forObjects2: rk=" + resourceKey + " pk=" + predicateKey);
310 if (deleted) return false;
311 if (0 == objectIndex) {
312 final int resourceIndex = ClusterTraitsBase.getResourceIndexFromResourceKey(resourceKey);
313 final short pRef = getInternalReferenceOrZero2(predicateKey, support);
314 final ClusterI.CompleteTypeEnum pCompleteType = ClusterTraitsBase.getCompleteTypeFromResourceKey(predicateKey);
315 return resourceTable.foreachObject(resourceIndex, procedure, context, support, this, pRef, pCompleteType, completeTable);
317 return objectTable.foreachObject(objectIndex, procedure, context, support, this);
321 public int getSingleObject(int resourceKey, int predicateKey, ClusterSupport support) throws DatabaseException {
323 System.out.println("ClusterSmall.getSingleObject2: rk=" + resourceKey + " pk=" + predicateKey);
324 if (deleted) return 0;
325 final int resourceIndex = ClusterTraitsBase.getResourceIndexFromResourceKey(resourceKey);
326 final short pRef = getInternalReferenceOrZero2(predicateKey, support);
327 final int completeType = ClusterTraitsBase.getCompleteTypeIntFromResourceKey(predicateKey);
328 final ClusterI.CompleteTypeEnum pCompleteType = CompleteTypeEnum.make(completeType);
329 if (completeType > 0)
330 return resourceTable.getSingleObject(resourceIndex, support, pRef, pCompleteType, completeTable, this);
331 final int predicateIndex = (int)resourceTable.table[(resourceIndex<<1) - 1 + resourceTable.offset] & 0xFFFFFF;
332 if (0 == predicateIndex) // All relevant data is in resource table.
333 return resourceTable.getSingleObject(resourceIndex, support, pRef, pCompleteType, completeTable, this);
334 int objectIndex = predicateTable.getObjectIndex(predicateIndex, pRef & 0xFFFF);
335 return getSingleObject(resourceKey, predicateKey, objectIndex, support);
339 public <T> int getSingleObject(int resourceKey, ForPossibleRelatedValueProcedure<T> procedure, ClusterSupport support) throws DatabaseException {
340 if (deleted) return 0;
341 final short resourceIndex = (short)ClusterTraitsBase.getResourceIndexFromResourceKey(resourceKey);
342 final int predicateKey = procedure.predicateKey;
343 int clusterKey = ClusterTraitsBase.getClusterMaskFromResourceKey(resourceKey);
345 if(procedure.clusterKey[0] == clusterKey) {
346 pRef = (short)procedure.predicateReference[0];
348 pRef = getInternalReferenceOrZero2(predicateKey, support);
349 procedure.clusterKey[0] = clusterKey;
350 procedure.predicateReference[0] = pRef;
353 final ClusterI.CompleteTypeEnum pCompleteType = procedure.completeType;
354 if (CompleteTypeEnum.NotComplete != pCompleteType)
355 return resourceTable.getSingleObject(resourceIndex, support, pRef, pCompleteType, completeTable, this);
356 final int predicateIndex = (int)resourceTable.table[(resourceIndex<<1) - 1 + resourceTable.offset] & 0xFFFFFF;
357 if (0 == predicateIndex) // All relevant data is in resource table.
358 return resourceTable.getSingleObject(resourceIndex, support, pRef, pCompleteType, completeTable, this);
359 int objectIndex = predicateTable.getObjectIndex(predicateIndex, pRef & 0xFFFF);
360 return getSingleObject(resourceKey, predicateKey, objectIndex, support);
364 public <C, T> int getSingleObject(int resourceKey, ForPossibleRelatedValueContextProcedure<C, T> procedure, ClusterSupport support) throws DatabaseException {
365 if (deleted) return 0;
366 final short resourceIndex = (short)ClusterTraitsBase.getResourceIndexFromResourceKey(resourceKey);
367 final int predicateKey = procedure.predicateKey;
368 int clusterKey = ClusterTraitsBase.getClusterMaskFromResourceKey(resourceKey);
370 if(procedure.clusterKey[0] == clusterKey) {
371 pRef = (short)procedure.predicateReference[0];
373 pRef = getInternalReferenceOrZero2(predicateKey, support);
374 procedure.clusterKey[0] = clusterKey;
375 procedure.predicateReference[0] = pRef;
377 final ClusterI.CompleteTypeEnum pCompleteType = procedure.completeType;
378 if (CompleteTypeEnum.NotComplete != pCompleteType)
379 return resourceTable.getSingleObject(resourceIndex, support, pRef, pCompleteType, completeTable, this);
380 final int predicateIndex = (int)resourceTable.table[(resourceIndex<<1) - 1 + resourceTable.offset] & 0xFFFFFF;
381 if (0 == predicateIndex) // All relevant data is in resource table.
382 return resourceTable.getSingleObject(resourceIndex, support, pRef, pCompleteType, completeTable, this);
383 int objectIndex = predicateTable.getObjectIndex(predicateIndex, pRef & 0xFFFF);
384 return getSingleObject(resourceKey, predicateKey, objectIndex, support);
388 public void forObjects(ReadGraphImpl graph, int resourceKey,
389 int predicateKey, AsyncMultiProcedure<Resource> procedure) throws DatabaseException {
391 SessionImplSocket session = (SessionImplSocket)graph.getSession();
392 ClusterSupport support = session.clusterTranslator;
394 System.out.println("ClusterSmall.forObjects3: rk=" + resourceKey + " pk=" + predicateKey);
395 final int resourceIndex = ClusterTraitsBase.getResourceIndexFromResourceKey(resourceKey);
396 final int pRef = getInternalReferenceOrZero2(predicateKey, support);
397 final int completeType = ClusterTraitsBase.getCompleteTypeIntFromResourceKey(predicateKey);
398 final ClusterI.CompleteTypeEnum pCompleteType = CompleteTypeEnum.make(completeType);
399 if (completeType > 0) {
400 resourceTable.foreachObject(resourceIndex, graph, procedure, support, pRef, pCompleteType, completeTable, this);
403 final int predicateIndex = (int)resourceTable.table[(resourceIndex<<1) - 1 + resourceTable.offset] & 0xFFFFFF;
404 if (0 == predicateIndex) {
405 resourceTable.foreachObject(resourceIndex, graph, procedure, support, pRef, pCompleteType, completeTable, this);
408 int objectIndex = predicateTable.getObjectIndex(predicateIndex, pRef & 0xFFFF);
409 forObjects(graph, resourceKey, predicateKey, objectIndex, procedure, support);
412 public void forObjects(ReadGraphImpl graph, int resourceKey, ForEachObjectProcedure procedure) throws DatabaseException {
414 final int resourceIndex = ClusterTraitsBase.getResourceIndexFromResourceKey(resourceKey);
415 final int predicateKey = procedure.predicateKey;
416 int clusterKey = ClusterTraitsBase.getClusterMaskFromResourceKey(resourceKey);
418 if(procedure.clusterKey[0] == clusterKey) {
419 pRef = procedure.predicateReference[0];
421 SessionImplSocket session = (SessionImplSocket)graph.getSession();
422 ClusterSupport support = session.clusterTranslator;
423 pRef = getInternalReferenceOrZero2(predicateKey, support);
424 procedure.clusterKey[0] = clusterKey;
425 procedure.predicateReference[0] = pRef;
427 final ClusterI.CompleteTypeEnum pCompleteType = procedure.completeType;
428 if (ClusterI.CompleteTypeEnum.NotComplete != pCompleteType) {
429 SessionImplSocket session = (SessionImplSocket)graph.getSession();
430 ClusterSupport support = session.clusterTranslator;
431 resourceTable.foreachObject(resourceIndex, graph, procedure, support, pRef, pCompleteType, completeTable, this);
434 final int predicateIndex = (int)resourceTable.table[(resourceIndex<<1) - 1 + resourceTable.offset] & 0xFFFFFF;
435 if (0 == predicateIndex) {
436 SessionImplSocket session = (SessionImplSocket)graph.getSession();
437 ClusterSupport support = session.clusterTranslator;
438 resourceTable.foreachObject(resourceIndex, graph, procedure, support, pRef, pCompleteType, completeTable, this);
441 int hashBase = predicateIndex + predicateTable.offset;
442 if (predicateTable.table[hashBase-1] < 0) {
443 int objectIndex = TableIntArraySet2.get(predicateTable.table, hashBase, pRef & 0xFFFF);
444 SessionImplSocket session = (SessionImplSocket)graph.getSession();
445 ClusterSupport support = session.clusterTranslator;
446 forObjects(graph, resourceKey, predicateKey, objectIndex, procedure, support);
448 int objectIndex = TableIntSet2.get(predicateTable.table, hashBase, pRef & 0xFFFF);
449 SessionImplSocket session = (SessionImplSocket)graph.getSession();
450 ClusterSupport support = session.clusterTranslator;
451 forObjects(graph, resourceKey, predicateKey, objectIndex, procedure, support);
455 public <C> void forObjects(ReadGraphImpl graph, int resourceKey, C context, ForEachObjectContextProcedure<C> procedure) throws DatabaseException {
457 final int resourceIndex = ClusterTraitsBase.getResourceIndexFromResourceKey(resourceKey);
458 final int predicateKey = procedure.predicateKey;
459 int clusterKey = ClusterTraitsBase.getClusterMaskFromResourceKey(resourceKey);
461 if(procedure.clusterKey[0] == clusterKey) {
462 pRef = procedure.predicateReference[0];
464 SessionImplSocket session = (SessionImplSocket)graph.getSession();
465 ClusterSupport support = session.clusterTranslator;
466 pRef = getInternalReferenceOrZero2(predicateKey, support);
467 procedure.clusterKey[0] = clusterKey;
468 procedure.predicateReference[0] = pRef;
471 final ClusterI.CompleteTypeEnum pCompleteType = procedure.completeType;
472 if (ClusterI.CompleteTypeEnum.NotComplete != pCompleteType) {
473 SessionImplSocket session = (SessionImplSocket)graph.getSession();
474 ClusterSupport support = session.clusterTranslator;
475 resourceTable.foreachObject(resourceIndex, graph, context, procedure, support, pRef, pCompleteType, completeTable, this);
478 final int predicateIndex = (int)resourceTable.table[(resourceIndex<<1) - 1 + resourceTable.offset] & 0xFFFFFF;
479 if (0 == predicateIndex) {
480 SessionImplSocket session = (SessionImplSocket)graph.getSession();
481 ClusterSupport support = session.clusterTranslator;
482 resourceTable.foreachObject(resourceIndex, graph, context, procedure, support, pRef, pCompleteType, completeTable, this);
485 int hashBase = predicateIndex + predicateTable.offset;
486 if(predicateTable.table[hashBase-1] < 0) {
487 int objectIndex = TableIntArraySet2.get(predicateTable.table, hashBase, pRef & 0xFFFF);
488 SessionImplSocket session = (SessionImplSocket)graph.getSession();
489 ClusterSupport support = session.clusterTranslator;
490 forObjects(graph, resourceKey, predicateKey, objectIndex, context, procedure, support);
492 int objectIndex = TableIntSet2.get(predicateTable.table, hashBase, pRef & 0xFFFF);
493 SessionImplSocket session = (SessionImplSocket)graph.getSession();
494 ClusterSupport support = session.clusterTranslator;
495 forObjects(graph, resourceKey, predicateKey, objectIndex, context, procedure, support);
499 public <Context> boolean forObjects(int resourceKey, int predicateKey,
500 ObjectProcedure<Context> procedure, Context context, ClusterSupport support)
501 throws DatabaseException {
503 System.out.println("ClusterSmall.forObjects4: rk=" + resourceKey + " pk=" + predicateKey);
504 if (deleted) return false;
505 final short resourceIndex = (short)ClusterTraitsBase.getResourceIndexFromResourceKey(resourceKey);
506 final short pRef = getInternalReferenceOrZero2(predicateKey, support);
507 final ClusterI.CompleteTypeEnum pCompleteType = ClusterTraitsBase.getCompleteTypeFromResourceKey(predicateKey);
508 // PredicateType is complete i.e. all relevant data is in resource table.
509 if (ClusterI.CompleteTypeEnum.NotComplete != pCompleteType) {
511 System.out.println("ClusterSmall.forObjects: complete type was " + pCompleteType + " cluster=" + getClusterUID());
512 return resourceTable.foreachObject(resourceIndex, procedure, context, support, this, pRef, pCompleteType, completeTable);
514 final int predicateIndex = resourceTable.getPredicateIndex(resourceIndex);
515 if (0 == predicateIndex) { // All relevant data is in resource table.
517 System.out.println("ClusterSmall.forObjects: no predicate table " + pCompleteType);
518 return resourceTable.foreachObject(resourceIndex, procedure, context, support, this, pRef, pCompleteType, completeTable);
520 int objectIndex = predicateTable.getObjectIndex(predicateIndex, pRef & 0xFFFF);
521 return forObjects(resourceKey, predicateKey, objectIndex, procedure, context, support);
524 public <Context> boolean forPredicates(int resourceKey,
525 PredicateProcedure<Context> procedure, Context context, ClusterSupport support)
526 throws DatabaseException {
528 System.out.println("ClusterSmall.forPredicates: rk=" + resourceKey );
529 if (deleted) return false;
531 ClusterImpl cluster = clusterTable.load2(clusterId, clusterKey);
532 return cluster.forPredicates(resourceKey, procedure, context, support);
535 final int resourceIndex = getLocalReference(resourceKey);
536 final int predicateIndex = resourceTable.getPredicateIndex(resourceIndex);
537 if (0 == predicateIndex)
538 return resourceTable.foreachPredicate(resourceIndex,
539 procedure, context, support, this, completeTable);
541 boolean broken = resourceTable.foreachPredicate(resourceIndex,
542 procedure, context, support, this, completeTable);
546 return predicateTable.foreachPredicate(predicateIndex,
547 procedure, context, support, this);
550 public ClusterI addRelation(int sResourceKey, int pResourceKey, int oResourceKey, ClusterSupport support)
551 throws DatabaseException {
553 System.out.println("add rk=" + sResourceKey + " pk=" + pResourceKey + " ok=" + oResourceKey);
554 if (deleted) return null;
556 ClusterImpl cluster = clusterTable.load2(clusterId, clusterKey);
557 return cluster.addRelation(sResourceKey, pResourceKey, oResourceKey, support);
563 short sri = getLocalReferenceAnd(sResourceKey, support, ClusterChange.ADD_OPERATION);
564 short pri = getReferenceOrCreateIfForeign(pResourceKey, support, ClusterStream.NULL_OPERATION);
565 short ori = getReferenceOrCreateIfForeign(oResourceKey, support, ClusterStream.NULL_OPERATION);
566 ClusterI.CompleteTypeEnum completeType = ClusterTraitsBase.getCompleteTypeFromResourceKey(pResourceKey);
567 ret = addRelationInternal(sri, pri, ori, completeType);
568 calculateModifiedId();
569 } catch (OutOfSpaceException e) {
570 boolean streamOff = support.getStreamOff();
572 support.cancelStatement(this);
573 support.setStreamOff(true);
575 ClusterI cluster = toBig(support);
577 support.setStreamOff(false);
578 ClusterI cluster2 = cluster.addRelation(sResourceKey, pResourceKey, oResourceKey, support);
579 if (cluster != cluster2)
580 throw new DatabaseException("Internal error. Contact application support.");
585 support.addStatement(this);
588 support.cancelStatement(this);
593 public boolean removeRelation(int sResourceKey, int pResourceKey, int oResourceKey, ClusterSupport support)
594 throws DatabaseException {
595 if (deleted) return false;
596 short sri = getLocalReferenceAnd(sResourceKey, support, ClusterChange.REMOVE_OPERATION);
597 short pri = getInternalReferenceOrZeroAnd(pResourceKey, support, ClusterStream.NULL_OPERATION);
598 short ori = getInternalReferenceOrZeroAnd(oResourceKey, support, ClusterStream.NULL_OPERATION);
600 if (0 != pri && 0 != ori) {
601 ClusterI.CompleteTypeEnum completeType = ClusterTraitsBase.getCompleteTypeFromResourceKey(pResourceKey);
602 ret = removeRelationInternal(sri, pri, ori, completeType, support);
603 calculateModifiedId();
606 support.removeStatement(this);
608 support.cancelStatement(this);
613 public void denyRelation(int sResourceKey, int pResourceKey, int oResourceKey, ClusterSupport support)
614 throws DatabaseException {
616 short s = checkResourceKeyIsOursAndGetResourceIndexIf(sResourceKey, support);
617 ResourceReferenceAndCluster p = checkResourceKeyAndGetResourceIndexIf(pResourceKey, support);
618 ResourceReferenceAndCluster o = checkResourceKeyAndGetResourceIndexIf(oResourceKey, support);
619 if (0 == s || 0 == p.reference || 0 == o.reference)
622 ClusterI.CompleteTypeEnum completeType = ClusterTraitsBase.getCompleteTypeFromResourceKey(pResourceKey);
623 boolean ret = removeRelationInternal(s, p.reference, o.reference, completeType, support);
625 support.addStatementIndex(this, sResourceKey, getClusterUID(), ClusterChange.REMOVE_OPERATION);
626 support.addStatementIndex(this, pResourceKey, p.clusterUID, ClusterStream.NULL_OPERATION);
627 support.addStatementIndex(this, oResourceKey, o.clusterUID, ClusterStream.NULL_OPERATION);
628 support.removeStatement(this);
630 calculateModifiedId();
635 public InputStream getValueStream(int resourceKey, ClusterSupport support) throws DatabaseException {
637 System.out.println("ClusterSmall.getValue " + resourceKey);
638 if (deleted) return null;
639 int resourceIndex = ClusterTraitsBase.getResourceIndexFromResourceKeyNoThrow(resourceKey);
641 byte[] buffer = resourceTable.getValue(valueTable, resourceIndex);
642 if(buffer == null) return null;
643 return new ByteArrayInputStream(buffer);
644 } catch (ExternalValueException e) {
645 return support.getValueStreamEx(resourceIndex, clusterId);
649 public byte[] getValue(int resourceKey, ClusterSupport support)
650 throws DatabaseException {
652 System.out.println("ClusterSmall.getValue " + resourceKey);
653 if (deleted) return null;
654 int resourceIndex = ClusterTraitsBase.getResourceIndexFromResourceKeyNoThrow(resourceKey);
656 return resourceTable.getValue(valueTable, resourceIndex);
657 } catch (ExternalValueException e) {
658 return support.getValueEx(resourceIndex, clusterId);
662 public boolean hasValue(int resourceKey, ClusterSupport support)
663 throws DatabaseException {
664 if (deleted) return false;
666 ClusterImpl cluster = clusterTable.load2(clusterId, clusterKey);
667 return cluster.hasValue(resourceKey, support);
669 int resourceIndex = getLocalReference(resourceKey);
670 return resourceTable.hasValue(resourceIndex);
673 public boolean removeValue(int resourceKey, ClusterSupport support)
674 throws DatabaseException {
675 if (deleted) return false;
676 int resourceIndex = getLocalReferenceAnd(resourceKey, support, ClusterChange.DELETE_OPERATION);
677 support.removeValue(this);
678 calculateModifiedId();
679 return resourceTable.removeValue(valueTable, resourceIndex);
682 public ClusterI setValue(int rResourceId, byte[] value, int length, ClusterSupport support)
683 throws DatabaseException {
684 if (deleted) return null;
685 int resourceIndex = getLocalReferenceAnd(rResourceId, support, ClusterStream.SET_OPERATION);
686 support.setValue(this, getClusterId(), value, length);
688 resourceTable.setValue(valueTable, resourceIndex, value, length);
689 calculateModifiedId();
691 } catch (OutOfSpaceException e) {
692 boolean streamOff = support.getStreamOff();
694 support.setStreamOff(true);
695 ClusterI cluster = toBig(support);
696 cluster.setValue(rResourceId, value, length, support);
698 support.setStreamOff(false);
703 public ClusterI modiValueEx(int rResourceId, long voffset, int length, byte[] value, int offset, ClusterSupport support)
704 throws DatabaseException {
705 if (deleted) return null;
706 int resourceIndex = getLocalReferenceAnd(rResourceId, support, ClusterStream.MODI_OPERATION);
707 support.modiValue(this, getClusterId(), voffset, length, value, offset);
708 resourceTable.setValueEx(valueTable, resourceIndex);
709 calculateModifiedId();
713 public byte[] readValueEx(int rResourceId, long voffset, int length, ClusterSupport support)
714 throws DatabaseException {
715 if (deleted) return null;
716 int resourceIndex = getLocalReference(rResourceId);
717 boolean isExternal = resourceTable.isValueEx(valueTable, resourceIndex);
719 throw new DatabaseException("ClusterI.readValue supported only for external value. Resource key=" + rResourceId);
720 return support.getValueEx(resourceIndex, getClusterId(), voffset, length);
723 public long getValueSizeEx(int rResourceId, ClusterSupport support)
724 throws DatabaseException, ExternalValueException {
725 if (deleted) return 0;
726 int resourceIndex = getLocalReference(rResourceId);
727 boolean isExternal = resourceTable.isValueEx(valueTable, resourceIndex);
729 throw new ExternalValueException("ClusterI.getValueSizeEx supported only for external value. Resource key=" + rResourceId);
730 return support.getValueSizeEx(resourceIndex, getClusterId());
733 public void setValueEx(int rResourceId)
734 throws DatabaseException {
735 int resourceIndex = getLocalReference(rResourceId);
736 resourceTable.setValueEx(valueTable, resourceIndex);
739 public int createResource(ClusterSupport support)
740 throws DatabaseException {
741 if (deleted) return 0;
743 ClusterImpl cluster = clusterTable.load2(clusterId, clusterKey);
744 return cluster.createResource(support);
747 short resourceIndex = resourceTable.createResource();
748 calculateModifiedId();
749 if(DebugPolicy.REPORT_RESOURCE_ID_ALLOCATION)
750 System.out.println("[RID_ALLOCATION]: ClusterSmall[" + clusterId + "] allocates " + resourceIndex);
751 support.createResource(this, resourceIndex, getClusterId());
752 return ClusterTraits.createResourceKey(clusterKey, resourceIndex);
755 public boolean hasResource(int resourceKey, ClusterSupport support) {
758 ClusterImpl cluster = clusterTable.load2(clusterId, clusterKey);
759 return cluster.hasResource(resourceKey, support);
760 } catch (DatabaseException e) {
761 LOGGER.error("Failed to load cluster with clusterId " + clusterId);
765 if (deleted) return false;
766 int clusterKey = ClusterTraitsBase.getClusterKeyFromResourceKeyNoThrow(resourceKey);
767 if (this.clusterKey != clusterKey) // foreign resource
771 resourceIndex = ClusterTraits.getResourceIndexFromResourceKey(resourceKey);
772 } catch (DatabaseException e) {
775 if (resourceIndex > 0 & resourceIndex <= resourceTable.getTableCount())
781 public int getNumberOfResources(ClusterSupport support)
782 throws DatabaseException {
783 if (deleted) return 0;
785 ClusterImpl cluster = clusterTable.load2(clusterId, clusterKey);
786 return cluster.getNumberOfResources(support);
789 return resourceTable.getUsedSize();
792 public int getNumberOfResources() {
793 if (deleted || proxy)
795 return resourceTable.getUsedSize();
799 public long getUsedSpace() {
800 if (deleted) return 0;
801 if(isEmpty()) return 0;
802 long rt = resourceTable.getTableCapacity() * 8 + 8; // (8 = cluster id)
803 long ft = foreignTable.getTableCapacity() * 8;
804 long pt = predicateTable.getTableCapacity() * 4;
805 long ot = objectTable.getTableCapacity() * 4;
806 long ct = completeTable.getTableCapacity() * 4;
807 long vt = valueTable.getTableCapacity() * 1;
808 long cm = clusterMap.getUsedSpace();
809 return rt + ft + pt + ot + ct + vt + cm;
812 public boolean isEmpty() {
813 if (deleted) return true; // Deleted cluster is always empty.
814 if(resourceTable == null) return true;
815 return resourceTable.getTableCount() == 0;
818 public void printDebugInfo(String message, ClusterSupport support)
819 throws DatabaseException {
821 throw new DatabaseException("Not implemented!");
823 private short getInternalReferenceOrZero2(int resourceKey, ClusterSupport support) throws DatabaseException {
824 int resourceIndex = ClusterTraitsBase.getResourceIndexFromResourceKeyNoThrow(resourceKey);
825 if (!ClusterTraitsBase.isCluster(clusterBits, resourceKey)) {
826 return clusterMap.getForeignReferenceOrZero(resourceKey);
828 return (short)resourceIndex;
831 private short getInternalReferenceOrZeroAnd(int resourceKey, ClusterSupport support, byte op)
832 throws DatabaseException {
833 int clusterKey = ClusterTraits.getClusterKeyFromResourceKey(resourceKey);
834 int resourceIndex = ClusterTraits.getResourceIndexFromResourceKey(resourceKey);
835 if (this.clusterKey != clusterKey) { // foreign resource
836 ClusterI foreignCluster = support.getClusterByClusterKey(clusterKey);
837 ClusterUID clusterUID = foreignCluster.getClusterUID();
838 short foreignRef = clusterMap.getForeignReferenceOrZero(resourceKey);
839 support.addStatementIndex(this, resourceKey, clusterUID, op);
842 support.addStatementIndex(this, resourceKey, getClusterUID(), op);
843 return (short)resourceIndex;
845 private final short getLocalReference(int resourceKey) throws DatabaseException {
846 return ClusterTraits.getResourceIndexFromResourceKeyNoThrow(resourceKey);
848 private final short getLocalReferenceAnd(int resourceKey, ClusterSupport support, byte op)
849 throws DatabaseException {
850 short resourceIndex = getLocalReference(resourceKey);
851 support.addStatementIndex(this, resourceKey, getClusterUID(), op);
852 return resourceIndex;
854 private short checkResourceKeyIsOursAndGetResourceIndexIf(int resourceKey, ClusterSupport support)
855 throws DatabaseException {
856 int clusterShortId = ClusterTraits.getClusterKeyFromResourceKey(resourceKey);
857 if (this.clusterKey != clusterShortId)
859 int resourceIndex = ClusterTraits.getResourceIndexFromResourceKey(resourceKey);
860 return (short)resourceIndex;
862 private short getReferenceOrCreateIfForeign(int resourceKey, ClusterSupport support, byte op)
863 throws DatabaseException {
864 int clusterKey = ClusterTraits.getClusterKeyFromResourceKey(resourceKey);
865 short resourceIndex = (short)ClusterTraits.getResourceIndexFromResourceKey(resourceKey);
866 if (this.clusterKey != clusterKey) {
867 ClusterI foreignCluster = support.getClusterByClusterKey(clusterKey);
868 ClusterUID clusterUID = foreignCluster.getClusterUID();
869 support.addStatementIndex(this, resourceKey, clusterUID, op);
870 short ref = clusterMap.getForeignReferenceOrCreateByResourceKey(resourceKey, clusterUID);
873 support.addStatementIndex(this, resourceKey, getClusterUID(), op);
874 return resourceIndex;
876 private class ResourceReferenceAndCluster {
877 ResourceReferenceAndCluster(short reference, ClusterUID clusterUID) {
878 this.reference = reference;
879 this.clusterUID = clusterUID;
881 public final short reference;
882 public final ClusterUID clusterUID;
884 private ResourceReferenceAndCluster checkResourceKeyAndGetResourceIndexIf(int resourceKey, ClusterSupport support)
885 throws DatabaseException {
886 int clusterKey = ClusterTraits.getClusterKeyFromResourceKey(resourceKey);
887 short resourceIndex = (short)ClusterTraits.getResourceIndexFromResourceKey(resourceKey);
888 if (this.clusterKey != clusterKey) { // foreign resource
889 ClusterI foreignCluster = support.getClusterByClusterKey(clusterKey);
890 ClusterUID clusterUID = foreignCluster.getClusterUID();
891 short ref = clusterMap.getForeignReferenceOrZero(resourceKey);
892 return new ResourceReferenceAndCluster(ref, clusterUID);
894 return new ResourceReferenceAndCluster(resourceIndex, getClusterUID());
897 static long fTime = 0;
899 int executeIndex = 0;
900 long clusterUID1 = 0;
901 long clusterUID2 = 0;
904 final public int execute(int resourceReference) throws DatabaseException {
906 if (deleted) return 0;
907 short resourceRef = (short)resourceReference;
909 if (ClusterTraitsSmall.resourceRefIsLocal(resourceRef)) {
910 key = clusterBits | resourceRef;
912 foreignTable.fillResourceUID(ClusterTraitsSmall.resourceRefGetForeignIndex((short)resourceRef), this);
913 key = ClusterTraitsBase.createResourceKey(clusterSupport.getClusterKeyByClusterUIDOrMake(clusterUID1, clusterUID2), executeIndex);
916 System.out.println("ClusterSmall.execute key=" + key);
920 private boolean addRelationInternal(short sReference, short pReference, short oReference, ClusterI.CompleteTypeEnum completeType)
921 throws DatabaseException {
922 int predicateIndex = resourceTable.addStatement(sReference, pReference, oReference, predicateTable, objectTable, completeType, completeTable);
923 if (0 == predicateIndex)
924 return true; // added to resourceTable
925 else if (0 > predicateIndex)
926 return false; // old complete statemenent
927 int newPredicateIndex = predicateTable.addPredicate(predicateIndex, 0xFFFF & pReference, 0xFFFF & oReference, objectTable);
928 if (0 == newPredicateIndex)
930 if (predicateIndex != newPredicateIndex)
931 resourceTable.setPredicateIndex(sReference, newPredicateIndex);
934 private boolean removeRelationInternal(int sResourceIndex, short pResourceIndex,
935 short oResourceIndex, ClusterI.CompleteTypeEnum completeType, ClusterSupport support)
936 throws DatabaseException {
937 int predicateIndex = resourceTable.getPredicateIndex(sResourceIndex);
938 if (0 == predicateIndex || ClusterI.CompleteTypeEnum.NotComplete != completeType)
939 return resourceTable.removeStatementFromCache(sResourceIndex,
940 pResourceIndex, oResourceIndex, completeType, completeTable);
941 PredicateTable.Status ret = predicateTable.removePredicate(predicateIndex, 0xFFFF & pResourceIndex, 0xFFFF & oResourceIndex, objectTable);
945 case PredicateRemoved: {
946 if (0 == predicateTable.getPredicateSetSize(predicateIndex))
947 resourceTable.setPredicateIndex(sResourceIndex, 0);
948 // intentionally dropping to next case
952 resourceTable.removeStatement(sResourceIndex,
953 pResourceIndex, oResourceIndex,
954 completeType, completeTable,
955 predicateTable, objectTable, support);
962 clusterTable.load2(clusterId, clusterKey);
963 } catch (DatabaseException e) {
964 LOGGER.error("Failed to load cluster with clusterId " + clusterId, e);
969 public void load(Consumer<DatabaseException> r) {
972 clusterTable.load2(clusterId, clusterKey);
973 } catch (DatabaseException e) {
978 public boolean contains(int resourceKey) {
979 if (deleted) return false;
980 return ClusterTraitsBase.isCluster(clusterBits, resourceKey);
983 public void load(final ClusterSupport support, final Runnable callback) {
986 clusterTable.load2(clusterId, clusterKey);
988 } catch (DatabaseException e) {
989 LOGGER.error("Failed to load cluster with clusterId " + clusterId, e);
994 public ClusterI getClusterByResourceKey(int resourceKey,
995 ClusterSupport support) {
996 if (deleted) return null;
1000 public void increaseReferenceCount(int amount) {
1001 if (deleted) return;
1005 public void decreaseReferenceCount(int amount) {
1006 if (deleted) return;
1010 public int getReferenceCount() {
1011 if (deleted) return 0;
1015 public void releaseMemory() {
1018 public void compact() {
1019 if (deleted) return;
1020 clusterMap.compact();
1023 public boolean isLoaded() {
1024 return !proxy || deleted; // Deleted cluster is always loaded.
1027 public ClusterImpl tryLoad(SessionImplSocket sessionImpl) throws DatabaseException {
1028 if (deleted) return this; // Never load deleted cluster.
1029 return clusterTable.tryLoad(clusterId, clusterKey);
1034 public ClusterBig toBig(ClusterSupport support)
1035 throws DatabaseException {
1037 System.out.println("DEBUG: toBig cluster=" + clusterId);
1038 new Exception().printStackTrace();
1040 if (deleted) return null; // Can't convert deleted cluster to big.
1041 ClusterBig big = new ClusterBig(getClusterUID(), clusterKey, support);
1042 big.setImportance(importance);
1044 big.cc.clusterImpl = this;
1045 resourceTable.toBig(big, support, this);
1046 big.foreignLookup = this.foreignLookup;
1047 big.change = this.change;
1049 this.foreignLookup = null;
1055 public ClusterTypeEnum getType() {
1056 return ClusterTypeEnum.SMALL;
1059 public boolean getImmutable() {
1060 if (deleted) return false;
1061 if (null == resourceTable)
1063 int status = resourceTable.getClusterStatus();
1064 return (status & ClusterStatus.ImmutableMaskSet) == ClusterStatus.ImmutableMaskSet;
1067 public void setImmutable(boolean immutable, ClusterSupport support) {
1068 if (deleted) return;
1069 if(resourceTable != null) {
1070 int status = resourceTable.getClusterStatus();
1072 status |= ClusterStatus.ImmutableMaskSet;
1074 status &= ClusterStatus.ImmutableMaskClear;
1075 resourceTable.setClusterStatus(status);
1077 support.setImmutable(this, immutable);
1080 public boolean getDeleted() {
1081 if (deleted) return true;
1082 int status = resourceTable.getClusterStatus();
1083 return (status & ClusterStatus.DeletedMaskSet) == ClusterStatus.DeletedMaskSet;
1086 public void setDeleted(boolean set, ClusterSupport support) {
1088 if(resourceTable != null) {
1089 int status = resourceTable.getClusterStatus();
1091 status |= ClusterStatus.DeletedMaskSet;
1093 status &= ClusterStatus.DeletedMaskClear;
1094 resourceTable.setClusterStatus(status);
1096 if (null != support)
1097 support.setDeleted(this, set);
1100 public String toString() {
1101 if (deleted) return "ClusterSmall[" + getClusterId() + " - has been deleted or hasn't been created.]";
1103 ForeignTableSmall ft = foreignTable;
1105 return "ClusterSmall[" + getClusterId() + " - " + getNumberOfResources() + "]";
1106 TIntShortHashMap map = ft.getResourceHashMap();
1107 TIntHashSet set = new TIntHashSet();
1108 map.forEachKey(value -> {
1109 set.add(value & 0xfffff000);
1112 return "ClusterSmall[" + getClusterId() + " - " + getNumberOfResources() + " - " + foreignTable.getResourceHashMap().size() + " - " + set.size() + "]";
1113 } catch (Throwable e) {
1114 return "ClusterSmall[" + getNumberOfResources() + "]";
1118 public Table<?> getPredicateTable() {
1119 return predicateTable;
1122 public Table<?> getForeignTable() {
1123 return foreignTable;
1126 public int makeResourceKey(int pRef) throws DatabaseException {
1127 throw new UnsupportedOperationException();
1130 public Table<?> getCompleteTable() {
1131 return completeTable;
1134 public Table<?> getValueTable() {
1138 public Table<?> getObjectTable() {
1144 class ClusterStatus {
1145 public static final int ImmutableMaskClear = 0xFFFFFFFE;
1146 public static final int ImmutableMaskSet = 0x00000001;
1147 public static final int DeletedMaskClear = 0xFFFFFFFD;
1148 public static final int DeletedMaskSet = 0x00000002;