private static void processIndexUpdateFieldAssignment(OIndex<?> index, ODocument iRecord, final Object origValue,
final Object newValue, List<IndexChange> changes) {
final OIndexDefinition indexDefinition = index.getDefinition();
if ((origValue instanceof Collection) && (newValue instanceof Collection)) {
final Set<Object> valuesToRemove = new HashSet<>((Collection<?>) origValue);
final Set<Object> valuesToAdd = new HashSet<>((Collection<?>) newValue);
valuesToRemove.removeAll((Collection<?>) newValue);
valuesToAdd.removeAll((Collection<?>) origValue);
for (final Object valueToRemove : valuesToRemove) {
if (!indexDefinition.isNullValuesIgnored() || valueToRemove != null) {
addRemove(changes, index, valueToRemove, iRecord);
}
}
for (final Object valueToAdd : valuesToAdd) {
if (!indexDefinition.isNullValuesIgnored() || valueToAdd != null) {
addPut(changes, index, valueToAdd, iRecord);
}
}
} else {
deleteIndexKey(index, iRecord, origValue, changes);
if (newValue instanceof Collection) {
for (final Object newValueItem : (Collection<?>) newValue) {
addPut(changes, index, newValueItem, iRecord.getIdentity());
}
} else if (!indexDefinition.isNullValuesIgnored() || newValue != null) {
addPut(changes, index, newValue, iRecord.getIdentity());
}
}
}