private void lockKeyedProperty(TitanProperty prop, StoreMutator mutator) throws StorageException { TitanKey pt = prop.getPropertyKey(); assert pt.isSimple(); if (pt.hasIndex() && pt.isUnique()) { if (prop.isNew()) { mutator.acquireIndexLock(getIndexKey(prop.getAttribute()), getKeyedIndexColumn(pt), null); } else { assert prop.isRemoved(); mutator.acquireIndexLock( getIndexKey(prop.getAttribute()), getKeyedIndexColumn(pt), getIndexValue(prop)); } } }
@Override public long[] indexRetrieval(Object key, TitanKey pt, InternalTitanTransaction tx) { Preconditions.checkArgument( pt.isSimple(), "Currently, only simple properties are supported for index retrieval"); Preconditions.checkArgument( pt.hasIndex(), "Cannot retrieve for given property key - it does not have an index"); long[] vertices = null; Preconditions.checkArgument( pt.getDataType().isInstance(key), "Specified object is incompatible with property data type [" + pt.getName() + "]"); for (int readAttempt = 0; readAttempt < maxReadRetryAttempts; readAttempt++) { try { if (pt.isUnique()) { ByteBuffer value = propertyIndex.get(getIndexKey(key), getKeyedIndexColumn(pt), tx.getTxHandle()); if (value != null) { vertices = new long[1]; vertices[0] = VariableLong.readPositive(value); } } else { ByteBuffer startColumn = VariableLong.positiveByteBuffer(pt.getID()); List<Entry> entries = propertyIndex.getSlice( getIndexKey(key), startColumn, ByteBufferUtil.nextBiggerBuffer(startColumn), tx.getTxHandle()); vertices = new long[entries.size()]; int i = 0; for (Entry ent : entries) { vertices[i++] = VariableLong.readPositive(ent.getValue()); } } break; } catch (StorageException e) { if (e instanceof TemporaryStorageException) { if (readAttempt < maxReadRetryAttempts - 1) temporaryStorageException(e); else throw readException(e, maxReadRetryAttempts); } else throw readException(e); } } if (vertices == null) return new long[0]; else return vertices; }
private void addIndexEntry(TitanProperty prop, StoreMutator mutator) throws StorageException { TitanKey pt = prop.getPropertyKey(); assert pt.isSimple(); if (pt.hasIndex()) { if (pt.isUnique()) { mutator.mutateIndex( getIndexKey(prop.getAttribute()), Lists.newArrayList(new Entry(getKeyedIndexColumn(pt), getIndexValue(prop))), null); } else { mutator.mutateIndex( getIndexKey(prop.getAttribute()), Lists.newArrayList(new Entry(getIndexColumn(pt, prop.getID()), getIndexValue(prop))), null); } } }
private ByteBuffer getIndexColumn(TitanKey type, long propertyID) { assert !type.isUnique(); return VariableLong.positiveByteBuffer(new long[] {type.getID(), propertyID}); }
private ByteBuffer getKeyedIndexColumn(TitanKey type) { assert type.isUnique(); return VariableLong.positiveByteBuffer(type.getID()); }