diff --git a/core/src/main/java/org/infinispan/encoding/DataConversion.java b/core/src/main/java/org/infinispan/encoding/DataConversion.java index af9fff6756f5..5e6a37a0e892 100644 --- a/core/src/main/java/org/infinispan/encoding/DataConversion.java +++ b/core/src/main/java/org/infinispan/encoding/DataConversion.java @@ -238,8 +238,10 @@ public Object extractIndexable(Object stored) { Wrapper wrapper = getWrapper(); if (isKey) return wrapper.unwrap(stored); - // If the value wrapper is indexable, just use it - if (wrapper.isFilterable()) return stored; + if (wrapper.isFilterable()) { + // If the value wrapper is indexable, return the already wrapped value or wrap it otherwise + return stored.getClass().equals(wrapperClass) ? stored : wrapper.wrap(stored); + } // Otherwise convert to the request format Object unencoded = encoder.fromStorage(wrapper.unwrap(stored)); @@ -287,26 +289,26 @@ public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; DataConversion that = (DataConversion) o; return isKey == that.isKey && - Objects.equals(encoder, that.encoder) && - Objects.equals(customWrapper, that.customWrapper) && - Objects.equals(transcoder, that.transcoder) && - Objects.equals(requestMediaType, that.requestMediaType); + Objects.equals(encoder, that.encoder) && + Objects.equals(customWrapper, that.customWrapper) && + Objects.equals(transcoder, that.transcoder) && + Objects.equals(requestMediaType, that.requestMediaType); } @Override public String toString() { return "DataConversion{" + - "encoderClass=" + encoderClass + - ", wrapperClass=" + wrapperClass + - ", requestMediaType=" + requestMediaType + - ", storageMediaType=" + storageMediaType + - ", encoderId=" + encoderId + - ", wrapperId=" + wrapperId + - ", encoder=" + encoder + - ", wrapper=" + customWrapper + - ", isKey=" + isKey + - ", transcoder=" + transcoder + - '}'; + "encoderClass=" + encoderClass + + ", wrapperClass=" + wrapperClass + + ", requestMediaType=" + requestMediaType + + ", storageMediaType=" + storageMediaType + + ", encoderId=" + encoderId + + ", wrapperId=" + wrapperId + + ", encoder=" + encoder + + ", wrapper=" + customWrapper + + ", isKey=" + isKey + + ", transcoder=" + transcoder + + '}'; } @Override diff --git a/query/src/main/java/org/infinispan/query/impl/massindex/IndexWorker.java b/query/src/main/java/org/infinispan/query/impl/massindex/IndexWorker.java index 6de78b8f115a..c9dcfd0d2909 100644 --- a/query/src/main/java/org/infinispan/query/impl/massindex/IndexWorker.java +++ b/query/src/main/java/org/infinispan/query/impl/massindex/IndexWorker.java @@ -11,7 +11,6 @@ import java.util.stream.Stream; import org.infinispan.AdvancedCache; -import org.infinispan.commons.dataconversion.Wrapper; import org.infinispan.commons.marshall.AbstractExternalizer; import org.infinispan.commons.time.TimeService; import org.infinispan.container.entries.CacheEntry; @@ -47,10 +46,8 @@ public final class IndexWorker implements Function { public Void apply(EmbeddedCacheManager embeddedCacheManager) { AdvancedCache cache = SecurityActions.getUnwrappedCache(embeddedCacheManager.getCache(cacheName)).getAdvancedCache(); DataConversion valueDataConversion = cache.getValueDataConversion(); - Wrapper valueWrapper = valueDataConversion.getWrapper(); - boolean valueFilterable = valueWrapper.isFilterable(); - AdvancedCache reindexCache = valueFilterable ? cache.withStorageMediaType() : cache; + AdvancedCache reindexCache = cache.withStorageMediaType(); SearchMapping searchMapping = ComponentRegistryUtils.getSearchMapping(cache); TimeService timeService = ComponentRegistryUtils.getTimeService(cache); @@ -59,7 +56,6 @@ public Void apply(EmbeddedCacheManager embeddedCacheManager) { IndexUpdater indexUpdater = new IndexUpdater(searchMapping); KeyPartitioner keyPartitioner = ComponentRegistryUtils.getKeyPartitioner(cache); - DataConversion keyDataConversion = reindexCache.getKeyDataConversion(); if (keys == null || keys.size() == 0) { preIndex(cache, indexUpdater); MassIndexerProgressState progressState = new MassIndexerProgressState(notifier); @@ -68,26 +64,23 @@ public Void apply(EmbeddedCacheManager embeddedCacheManager) { .cacheEntrySet().stream()) { stream.forEach(entry -> { Object key = entry.getKey(); - Object storedKey = keyDataConversion.toStorage(key); - Object value = entry.getValue(); - if (valueFilterable) { - value = valueWrapper.wrap(value); - } - int segment = keyPartitioner.getSegment(storedKey); + Object value = valueDataConversion.extractIndexable(entry.getValue()); + int segment = keyPartitioner.getSegment(key); if (value != null && indexedTypes.contains(indexUpdater.toConvertedEntityJavaClass(value))) { - progressState.addItem(entry.getKey(), value, - indexUpdater.updateIndex(entry.getKey(), value, segment)); + progressState.addItem(key, value, + indexUpdater.updateIndex(key, value, segment)); } }); } } postIndex(indexUpdater, progressState, notifier); } else { + DataConversion keyDataConversion = cache.getKeyDataConversion(); Set> classSet = new HashSet<>(); for (Object key : keys) { Object storedKey = keyDataConversion.toStorage(key); - Object unwrappedKey = keyDataConversion.getWrapper().unwrap(storedKey); + Object unwrappedKey = keyDataConversion.extractIndexable(storedKey); Object value = cache.get(key); if (value != null) { indexUpdater.updateIndex(unwrappedKey, value, keyPartitioner.getSegment(storedKey));