public OIndex<?> preProcessBeforeReturn(ODatabaseDocumentInternal database, final OIndex<?> index) { if (index instanceof OIndexMultiValues) //noinspection unchecked return new OIndexTxAwareMultiValue(database, (OIndex<Collection<OIdentifiable>>) index); else if (index instanceof OIndexDictionary) //noinspection unchecked return new OIndexTxAwareDictionary(database, (OIndex<OIdentifiable>) index); else if (index instanceof OIndexOneValue) //noinspection unchecked return new OIndexTxAwareOneValue(database, (OIndex<OIdentifiable>) index); return index; }
private Map.Entry<Object, OIdentifiable> calculateTxIndexEntry(final Object key, final OIdentifiable backendValue, final OTransactionIndexChanges indexChanges) { OIdentifiable result = backendValue; final OTransactionIndexChangesPerKey changesPerKey = indexChanges.getChangesPerKey(key); if (changesPerKey.entries.isEmpty()) { if (backendValue == null) { return null; } else { return createMapEntry(key, backendValue); } } for (OTransactionIndexEntry entry : changesPerKey.entries) { if (entry.operation == OPERATION.REMOVE) result = null; else if (entry.operation == OPERATION.PUT) result = entry.value; } if (result == null) return null; final OIdentifiable resultValue = result; return createMapEntry(key, resultValue); }
public PureTxBetweenIndexForwardCursor(Object fromKey, boolean fromInclusive, Object toKey, boolean toInclusive, OTransactionIndexChanges indexChanges) { this.indexChanges = indexChanges; fromKey = enhanceFromCompositeKeyBetweenAsc(fromKey, fromInclusive); toKey = enhanceToCompositeKeyBetweenAsc(toKey, toInclusive); final Object[] keys = indexChanges.firstAndLastKeys(fromKey, fromInclusive, toKey, toInclusive); if (keys.length == 0) { nextKey = null; } else { firstKey = keys[0]; lastKey = keys[1]; nextKey = firstKey; } }
public PureTxBetweenIndexBackwardCursor(Object fromKey, boolean fromInclusive, Object toKey, boolean toInclusive, OTransactionIndexChanges indexChanges) { this.indexChanges = indexChanges; fromKey = enhanceFromCompositeKeyBetweenDesc(fromKey, fromInclusive); toKey = enhanceToCompositeKeyBetweenDesc(toKey, toInclusive); final Object[] keys = indexChanges.firstAndLastKeys(fromKey, fromInclusive, toKey, toInclusive); if (keys.length == 0) { nextKey = null; } else { firstKey = keys[0]; lastKey = keys[1]; nextKey = lastKey; } }
@Override public OIdentifiable get(Object key) { final OTransactionIndexChanges indexChanges = database.getMicroOrRegularTransaction() .getIndexChangesInternal(delegate.getName()); if (indexChanges == null) return super.get(key); key = getCollatingValue(key); OIdentifiable result; if (!indexChanges.cleared) // BEGIN FROM THE UNDERLYING RESULT SET result = super.get(key); else // BEGIN FROM EMPTY RESULT SET result = null; // FILTER RESULT SET WITH TRANSACTIONAL CHANGES final Map.Entry<Object, OIdentifiable> entry = calculateTxIndexEntry(key, result, indexChanges); if (entry == null) return null; return entry.getValue(); }
sortedKeys.add(getCollatingValue(key));
@Override public boolean contains(final Object key) { return get(key) != null; }
@Override public OIndexCursor iterateEntriesBetween(Object fromKey, final boolean fromInclusive, Object toKey, final boolean toInclusive, final boolean ascOrder) { final OTransactionIndexChanges indexChanges = database.getMicroOrRegularTransaction() .getIndexChangesInternal(delegate.getName()); if (indexChanges == null) return super.iterateEntriesBetween(fromKey, fromInclusive, toKey, toInclusive, ascOrder); fromKey = getCollatingValue(fromKey); toKey = getCollatingValue(toKey); final OIndexCursor txCursor; if (ascOrder) txCursor = new PureTxBetweenIndexForwardCursor(fromKey, fromInclusive, toKey, toInclusive, indexChanges); else txCursor = new PureTxBetweenIndexBackwardCursor(fromKey, fromInclusive, toKey, toInclusive, indexChanges); if (indexChanges.cleared) return txCursor; final OIndexCursor backedCursor = super.iterateEntriesBetween(fromKey, fromInclusive, toKey, toInclusive, ascOrder); return new OIndexTxCursor(txCursor, backedCursor, ascOrder, indexChanges); }
public OIndex<?> preProcessBeforeReturn(ODatabaseDocumentInternal database, final OIndex<?> index) { if (index instanceof OIndexRemoteMultiValue) return new OIndexTxAwareMultiValue(database, (OIndex<Collection<OIdentifiable>>) index); else if (index instanceof OIndexDictionary) return new OIndexTxAwareDictionary(database, (OIndex<OIdentifiable>) index); else if (index instanceof OIndexRemoteOneValue) return new OIndexTxAwareOneValue(database, (OIndex<OIdentifiable>) index); return index; }
@Override public OIndexCursor iterateEntriesMinor(Object toKey, boolean toInclusive, boolean ascOrder) { final OTransactionIndexChanges indexChanges = database.getMicroOrRegularTransaction() .getIndexChangesInternal(delegate.getName()); if (indexChanges == null) return super.iterateEntriesMinor(toKey, toInclusive, ascOrder); toKey = getCollatingValue(toKey); final OIndexCursor txCursor; final Object firstKey = indexChanges.getFirstKey(); if (ascOrder) txCursor = new PureTxBetweenIndexForwardCursor(firstKey, true, toKey, toInclusive, indexChanges); else txCursor = new PureTxBetweenIndexBackwardCursor(firstKey, true, toKey, toInclusive, indexChanges); if (indexChanges.cleared) return txCursor; final OIndexCursor backedCursor = super.iterateEntriesMinor(toKey, toInclusive, ascOrder); return new OIndexTxCursor(txCursor, backedCursor, ascOrder, indexChanges); }
private void load(final ODocument metadata) { // LOAD TREEMAP final String indexClassName = metadata.field(CONFIG_CLASSNAME); final String recordKeyValueMap = metadata.field(CONFIG_RECORD_MAP_NAME); if (VERTEX.equals(indexClassName)) this.indexClass = Vertex.class; else if (EDGE.equals(indexClassName)) this.indexClass = Edge.class; else try { this.indexClass = (Class<T>) Class.forName(indexClassName); } catch (ClassNotFoundException e) { throw new IllegalArgumentException("Index class '" + indexClassName + "' is not registered. Supported ones: Vertex, Edge and custom class that extends them", e); } if (recordKeyValueMap == null) recordKeyValueIndex = buildKeyValueIndex(metadata); else recordKeyValueIndex = new OIndexTxAwareOneValue(graph.getRawGraph(), (OIndex<OIdentifiable>) graph.getRawGraph() .getMetadata().getIndexManager().getIndex(recordKeyValueMap)); }
@Override public OIndexCursor iterateEntriesMajor(Object fromKey, boolean fromInclusive, boolean ascOrder) { final OTransactionIndexChanges indexChanges = database.getMicroOrRegularTransaction() .getIndexChangesInternal(delegate.getName()); if (indexChanges == null) return super.iterateEntriesMajor(fromKey, fromInclusive, ascOrder); fromKey = getCollatingValue(fromKey); final OIndexCursor txCursor; final Object lastKey = indexChanges.getLastKey(); if (ascOrder) txCursor = new PureTxBetweenIndexForwardCursor(fromKey, fromInclusive, lastKey, true, indexChanges); else txCursor = new PureTxBetweenIndexBackwardCursor(fromKey, fromInclusive, lastKey, true, indexChanges); if (indexChanges.cleared) return txCursor; final OIndexCursor backedCursor = super.iterateEntriesMajor(fromKey, fromInclusive, ascOrder); return new OIndexTxCursor(txCursor, backedCursor, ascOrder, indexChanges); }
private void create(final String indexName, final Class<? extends Element> indexClass, OType iKeyType) { this.indexClass = indexClass; if (iKeyType == null) iKeyType = OType.STRING; final OIndexFactory factory = OIndexes.getFactory(OClass.INDEX_TYPE.DICTIONARY.toString(), null); this.recordKeyValueIndex = new OIndexTxAwareOneValue(graph.getRawGraph(), (OIndex<OIdentifiable>) graph .getRawGraph() .getMetadata() .getIndexManager() .createIndex("__@recordmap@___" + indexName, OClass.INDEX_TYPE.DICTIONARY.toString(), new OSimpleKeyIndexDefinition(factory.getLastVersion(), OType.LINK, OType.STRING), null, null, null)); final String className; if (Vertex.class.isAssignableFrom(indexClass)) className = VERTEX; else if (Edge.class.isAssignableFrom(indexClass)) className = EDGE; else className = indexClass.getName(); final ODocument metadata = new ODocument(); metadata.field(CONFIG_CLASSNAME, className); metadata.field(CONFIG_RECORD_MAP_NAME, recordKeyValueIndex.getName()); final OIndexFactory nuFactory = OIndexes.getFactory(OClass.INDEX_TYPE.NOTUNIQUE.toString(), null); // CREATE THE MAP this.underlying = new OIndexTxAwareMultiValue(graph.getRawGraph(), (OIndex<Collection<OIdentifiable>>) graph .getRawGraph() .getMetadata() .getIndexManager() .createIndex(indexName, OClass.INDEX_TYPE.NOTUNIQUE.toString(), new OSimpleKeyIndexDefinition(nuFactory.getLastVersion(), iKeyType), null, null, metadata)); }
private OIndex<?> buildKeyValueIndex(final ODocument metadata) { final OIndexFactory factory = OIndexes.getFactory(OClass.INDEX_TYPE.DICTIONARY.toString(), null); final OIndex<?> recordKeyValueIndex = new OIndexTxAwareOneValue(graph.getRawGraph(), (OIndex<OIdentifiable>) graph .getRawGraph() .getMetadata() .getIndexManager() .createIndex("__@recordmap@___" + underlying.getName(), OClass.INDEX_TYPE.DICTIONARY.toString(), new OSimpleKeyIndexDefinition(factory.getLastVersion(), OType.LINK, OType.STRING), null, null, null)); final List<ODocument> entries = graph.getRawGraph().query( new OSQLSynchQuery<Object>("select from index:" + underlying.getName())); for (ODocument entry : entries) { final OIdentifiable rid = entry.field("rid"); if (rid != null) recordKeyValueIndex.put(new OCompositeKey(rid, entry.field("key")), rid); } metadata.field(CONFIG_RECORD_MAP_NAME, recordKeyValueIndex.getName()); return recordKeyValueIndex; }