package org.infinispan.query.dsl.embedded.impl; import java.util.Arrays; import java.util.Comparator; import java.util.Map; import org.infinispan.AdvancedCache; import org.infinispan.CacheStream; import org.infinispan.commons.util.CloseableIterator; import org.infinispan.commons.util.Closeables; import org.infinispan.container.entries.CacheEntry; import org.infinispan.filter.CacheFilters; import org.infinispan.objectfilter.ObjectFilter; import org.infinispan.query.dsl.QueryFactory; /** * Non-indexed embedded-mode query. * * @author anistor@redhat,com * @since 7.0 */ final class EmbeddedQuery extends BaseEmbeddedQuery { private final QueryEngine queryEngine; private IckleFilterAndConverter<?, ?> filter; EmbeddedQuery(QueryEngine queryEngine, QueryFactory queryFactory, AdvancedCache<?, ?> cache, String queryString, Map<String, Object> namedParameters, String[] projection, long startOffset, int maxResults) { super(queryFactory, cache, queryString, namedParameters, projection, startOffset, maxResults); this.queryEngine = queryEngine; } @Override public void resetQuery() { super.resetQuery(); filter = null; } private IckleFilterAndConverter createFilter() { // filter is created first time only if (filter == null) { filter = queryEngine.createAndWireFilter(queryString, namedParameters); // force early validation! filter.getObjectFilter(); } return filter; } @Override protected Comparator<Comparable[]> getComparator() { return createFilter().getObjectFilter().getComparator(); } @Override protected CloseableIterator<ObjectFilter.FilterResult> getIterator() { CacheStream<CacheEntry<?, ObjectFilter.FilterResult>> stream = (CacheStream<CacheEntry<?, ObjectFilter.FilterResult>>) CacheFilters.filterAndConvert(cache.cacheEntrySet().stream(), createFilter()); return Closeables.iterator(stream.map(CacheEntry::getValue)); } @Override public String toString() { return "EmbeddedQuery{" + "queryString=" + queryString + ", namedParameters=" + namedParameters + ", projection=" + Arrays.toString(projection) + ", startOffset=" + startOffset + ", maxResults=" + maxResults + '}'; } }