private static void processIndexUpdateFieldAssignment(OIndex<?> index, ODocument iRecord, final Object origValue, final Object newValue) { if ((origValue instanceof Collection) && (newValue instanceof Collection)) { final Set<Object> valuesToRemove = new HashSet<Object>((Collection<?>) origValue); final Set<Object> valuesToAdd = new HashSet<Object>((Collection<?>) newValue); valuesToRemove.removeAll((Collection<?>) newValue); valuesToAdd.removeAll((Collection<?>) origValue); for (final Object valueToRemove : valuesToRemove) { if (valueToRemove != null) { index.remove(valueToRemove, iRecord); } } for (final Object valueToAdd : valuesToAdd) { if (valueToAdd != null) { index.put(valueToAdd, iRecord); } } } else { deleteIndexKey(index, iRecord, origValue); if (newValue instanceof Collection) { for (final Object newValueItem : (Collection<?>) newValue) { index.put(newValueItem, iRecord.placeholder()); } } else if (newValue != null) { index.put(newValue, iRecord.placeholder()); } } }
private static void processSingleIndexUpdate(final OIndex<?> index, final Set<String> dirtyFields, final ODocument iRecord) { final OIndexDefinition indexDefinition = index.getDefinition(); final List<String> indexFields = indexDefinition.getFields(); if (indexFields.isEmpty()) return; final String indexField = indexFields.get(0); if (!dirtyFields.contains(indexField)) return; final OMultiValueChangeTimeLine<?, ?> multiValueChangeTimeLine = iRecord.getCollectionTimeLine(indexField); if (multiValueChangeTimeLine != null) { final OIndexDefinitionMultiValue indexDefinitionMultiValue = (OIndexDefinitionMultiValue) indexDefinition; final Map<Object, Integer> keysToAdd = new HashMap<Object, Integer>(); final Map<Object, Integer> keysToRemove = new HashMap<Object, Integer>(); for (OMultiValueChangeEvent<?, ?> changeEvent : multiValueChangeTimeLine.getMultiValueChangeEvents()) { indexDefinitionMultiValue.processChangeEvent(changeEvent, keysToAdd, keysToRemove); } for (final Object keyToRemove : keysToRemove.keySet()) index.remove(keyToRemove, iRecord); for (final Object keyToAdd : keysToAdd.keySet()) index.put(keyToAdd, iRecord.placeholder()); } else { final Object origValue = indexDefinition.createValue(iRecord.getOriginalValue(indexField)); final Object newValue = indexDefinition.getDocumentValueToIndex(iRecord); processIndexUpdateFieldAssignment(index, iRecord, origValue, newValue); } }
index.put(newValue, iRecord.placeholder()); } else { final OMultiValueChangeTimeLine<?, ?> multiValueChangeTimeLine = iRecord.getCollectionTimeLine(multiValueField); index.put(keyToAdd, iRecord.placeholder()); } else { final OTrackedMultiValue fieldValue = iRecord.field(multiValueField);
private void addIndexesEntries(ODocument document) { document = checkForLoading(document); // STORE THE RECORD IF NEW, OTHERWISE ITS RID final OIdentifiable rid = document.getIdentity().isPersistent() ? document.placeholder() : document; final OClass cls = document.getSchemaClass(); if (cls != null) { final Collection<OIndex<?>> indexes = cls.getIndexes(); for (final OIndex<?> index : indexes) { final Object key = index.getDefinition().getDocumentValueToIndex(document); // SAVE A COPY TO AVOID PROBLEM ON RECYCLING OF THE RECORD if (key instanceof Collection) { for (final Object keyItem : (Collection<?>) key) if (keyItem != null) index.put(keyItem, rid); } else if (key != null) index.put(key, rid); } } }