Refactoring LuceneFunction, LuceneQueryProvider, and LuceneQueryFactory LuceneFunction had a static RepositoryManager, I changed the code to get look up the RepositoryManager from the LuceneService.
As part of that work, I noticed StringQueryProvider really needed access to the index to lookup the field names, analyzer, etc. So I changed the getQuery method to take an index, and removed the unneeded string parameters. Finally, I removed some of the mocking from LuceneFunctionReadPathDUnitTest, which exposed some other issues: * I switched RepositoryManager.getRepositories back to using a RegionFunctionContext, because apparently context.getDataSet is *not* the local data set. * I canonicalized the regionPaths in LuceneService Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/8fb4ad7a Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/8fb4ad7a Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/8fb4ad7a Branch: refs/heads/develop Commit: 8fb4ad7a23db081377e1a93b7da839809095eb70 Parents: 58f13e2 Author: Dan Smith <[email protected]> Authored: Wed Sep 23 13:37:05 2015 -0700 Committer: Dan Smith <[email protected]> Committed: Wed Sep 23 15:42:38 2015 -0700 ---------------------------------------------------------------------- .../internal/cache/GemFireCacheImpl.java | 2 +- .../gemfire/internal/cache/InternalCache.java | 3 +- .../internal/cache/xmlcache/CacheCreation.java | 2 +- .../cache/lucene/LuceneQueryFactory.java | 16 ---- .../cache/lucene/LuceneQueryProvider.java | 3 +- .../cache/lucene/LuceneServiceProvider.java | 3 +- .../lucene/internal/InternalLuceneIndex.java | 10 +++ .../lucene/internal/InternalLuceneService.java | 9 ++ .../cache/lucene/internal/LuceneIndexImpl.java | 3 +- .../lucene/internal/LuceneQueryFactoryImpl.java | 31 ++----- .../cache/lucene/internal/LuceneQueryImpl.java | 11 +-- .../lucene/internal/LuceneServiceImpl.java | 20 +++-- .../internal/PartitionedRepositoryManager.java | 13 +-- .../lucene/internal/StringQueryProvider.java | 45 ++-------- .../internal/distributed/LuceneFunction.java | 26 +++--- .../distributed/LuceneFunctionContext.java | 26 ++++-- .../internal/repository/RepositoryManager.java | 2 +- .../internal/LuceneServiceImplJUnitTest.java | 12 +-- .../PartitionedRepositoryManagerJUnitTest.java | 13 ++- .../internal/StringQueryProviderJUnitTest.java | 22 ++--- .../LuceneFunctionContextJUnitTest.java | 8 +- .../distributed/LuceneFunctionJUnitTest.java | 95 +++++++++++++------- .../LuceneFunctionReadPathDUnitTest.java | 80 ++++++++--------- .../TopEntriesFunctionCollectorJUnitTest.java | 6 +- .../IndexRepositoryImplJUnitTest.java | 6 ++ 25 files changed, 239 insertions(+), 228 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8fb4ad7a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/GemFireCacheImpl.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/GemFireCacheImpl.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/GemFireCacheImpl.java index ed83a76..6fe639b 100644 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/GemFireCacheImpl.java +++ b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/GemFireCacheImpl.java @@ -238,7 +238,7 @@ import com.sun.jna.Platform; * @author Darrel Schneider */ @SuppressWarnings("deprecation") -public class GemFireCacheImpl implements InternalCache, ClientCache, HasCachePerfStats, DistributionAdvisee, Extensible<Cache> { +public class GemFireCacheImpl implements InternalCache, ClientCache, HasCachePerfStats, DistributionAdvisee { private static final Logger logger = LogService.getLogger(); // moved *SERIAL_NUMBER stuff to DistributionAdvisor http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8fb4ad7a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/InternalCache.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/InternalCache.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/InternalCache.java index 7c1fa8e..cf1a4dc 100644 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/InternalCache.java +++ b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/InternalCache.java @@ -14,6 +14,7 @@ import com.gemstone.gemfire.cache.hdfs.internal.HDFSStoreImpl; import com.gemstone.gemfire.cache.hdfs.internal.hoplog.HDFSStoreDirector; import com.gemstone.gemfire.cache.query.internal.cq.CqService; import com.gemstone.gemfire.distributed.DistributedMember; +import com.gemstone.gemfire.internal.cache.extension.Extensible; /** * The InternalCache interface is contract for implementing classes for defining internal cache operations that should @@ -23,7 +24,7 @@ import com.gemstone.gemfire.distributed.DistributedMember; * @see com.gemstone.gemfire.cache.Cache * @since 7.0 */ -public interface InternalCache extends Cache { +public interface InternalCache extends Cache, Extensible<Cache> { public DistributedMember getMyId(); http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8fb4ad7a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/xmlcache/CacheCreation.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/xmlcache/CacheCreation.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/xmlcache/CacheCreation.java index 04630ba..2e2ec2b 100644 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/xmlcache/CacheCreation.java +++ b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/xmlcache/CacheCreation.java @@ -126,7 +126,7 @@ import com.gemstone.gemfire.pdx.internal.TypeRegistry; * * @since 3.0 */ -public class CacheCreation implements InternalCache, Extensible<Cache> { +public class CacheCreation implements InternalCache { /** The amount of time to wait for a distributed lock */ private int lockTimeout = GemFireCacheImpl.DEFAULT_LOCK_TIMEOUT; http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8fb4ad7a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/LuceneQueryFactory.java ---------------------------------------------------------------------- diff --git a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/LuceneQueryFactory.java b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/LuceneQueryFactory.java index 1775b40..55f1b3a 100644 --- a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/LuceneQueryFactory.java +++ b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/LuceneQueryFactory.java @@ -1,6 +1,5 @@ package com.gemstone.gemfire.cache.lucene; -import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.queryparser.classic.ParseException; /** @@ -50,21 +49,6 @@ public interface LuceneQueryFactory { LuceneQueryFactory setProjectionFields(String... fieldNames); /** - * Create wrapper object for lucene's QueryParser object. - * The queryString is using lucene QueryParser's syntax. QueryParser is for easy-to-use - * with human understandable syntax. - * - * @param regionName region name - * @param indexName index name - * @param queryString query string in lucene QueryParser's syntax - * @param analyzer lucene Analyzer to parse the queryString - * @return LuceneQuery object - * @throws ParseException - */ - public LuceneQuery create(String indexName, String regionName, String queryString, - Analyzer analyzer) throws ParseException; - - /** * Create wrapper object for lucene's QueryParser object using default standard analyzer. * The queryString is using lucene QueryParser's syntax. QueryParser is for easy-to-use * with human understandable syntax. http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8fb4ad7a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/LuceneQueryProvider.java ---------------------------------------------------------------------- diff --git a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/LuceneQueryProvider.java b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/LuceneQueryProvider.java index 767bfa8..a113fab 100644 --- a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/LuceneQueryProvider.java +++ b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/LuceneQueryProvider.java @@ -17,7 +17,8 @@ import com.gemstone.gemfire.cache.query.QueryException; public interface LuceneQueryProvider extends Serializable { /** * @return A Lucene Query object which could be used for executing Lucene Search on indexed data + * @param The local lucene index the query is being constructed against. * @throws QueryException if the provider fails to construct the query object */ - public Query getQuery() throws QueryException; + public Query getQuery(LuceneIndex index) throws QueryException; } http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8fb4ad7a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/LuceneServiceProvider.java ---------------------------------------------------------------------- diff --git a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/LuceneServiceProvider.java b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/LuceneServiceProvider.java index b276b48..7d90b7d 100644 --- a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/LuceneServiceProvider.java +++ b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/LuceneServiceProvider.java @@ -1,6 +1,7 @@ package com.gemstone.gemfire.cache.lucene; import com.gemstone.gemfire.cache.Cache; +import com.gemstone.gemfire.cache.lucene.internal.InternalLuceneService; import com.gemstone.gemfire.cache.lucene.internal.LuceneServiceImpl; import com.gemstone.gemfire.internal.cache.extension.Extensible; @@ -17,7 +18,7 @@ public class LuceneServiceProvider { public static LuceneService get(Cache cache) { synchronized(LuceneService.class) { Extensible<Cache> extensible = (Extensible<Cache>) cache; - LuceneServiceImpl service = (LuceneServiceImpl) extensible.getExtensionPoint().getExtension(LuceneService.class); + InternalLuceneService service = (InternalLuceneService) extensible.getExtensionPoint().getExtension(LuceneService.class); if(service == null) { service = new LuceneServiceImpl(cache); extensible.getExtensionPoint().addExtension(LuceneService.class, service); http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8fb4ad7a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/InternalLuceneIndex.java ---------------------------------------------------------------------- diff --git a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/InternalLuceneIndex.java b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/InternalLuceneIndex.java new file mode 100644 index 0000000..ab2c924 --- /dev/null +++ b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/InternalLuceneIndex.java @@ -0,0 +1,10 @@ +package com.gemstone.gemfire.cache.lucene.internal; + +import com.gemstone.gemfire.cache.lucene.LuceneIndex; +import com.gemstone.gemfire.cache.lucene.internal.repository.RepositoryManager; + +public interface InternalLuceneIndex extends LuceneIndex { + + public RepositoryManager getRepositoryManager(); + +} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8fb4ad7a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/InternalLuceneService.java ---------------------------------------------------------------------- diff --git a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/InternalLuceneService.java b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/InternalLuceneService.java new file mode 100644 index 0000000..d09ef19 --- /dev/null +++ b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/InternalLuceneService.java @@ -0,0 +1,9 @@ +package com.gemstone.gemfire.cache.lucene.internal; + +import com.gemstone.gemfire.cache.Cache; +import com.gemstone.gemfire.cache.lucene.LuceneService; +import com.gemstone.gemfire.internal.cache.extension.Extension; + +public interface InternalLuceneService extends LuceneService, Extension<Cache> { + +} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8fb4ad7a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneIndexImpl.java ---------------------------------------------------------------------- diff --git a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneIndexImpl.java b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneIndexImpl.java index 799ef27..1a91292 100644 --- a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneIndexImpl.java +++ b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneIndexImpl.java @@ -7,12 +7,11 @@ import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import com.gemstone.gemfire.cache.Region; -import com.gemstone.gemfire.cache.lucene.LuceneIndex; import com.gemstone.gemfire.cache.lucene.internal.filesystem.ChunkKey; import com.gemstone.gemfire.cache.lucene.internal.filesystem.File; import com.gemstone.gemfire.cache.lucene.internal.repository.RepositoryManager; -public abstract class LuceneIndexImpl implements LuceneIndex { +public abstract class LuceneIndexImpl implements InternalLuceneIndex { static private final boolean CREATE_CACHE = Boolean.getBoolean("lucene.createCache"); static private final boolean USE_FS = Boolean.getBoolean("lucene.useFileSystem"); http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8fb4ad7a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneQueryFactoryImpl.java ---------------------------------------------------------------------- diff --git a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneQueryFactoryImpl.java b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneQueryFactoryImpl.java index f5d38bc..9210929 100644 --- a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneQueryFactoryImpl.java +++ b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneQueryFactoryImpl.java @@ -15,9 +15,9 @@ import com.gemstone.gemfire.cache.lucene.LuceneQueryFactory; import com.gemstone.gemfire.cache.lucene.LuceneQueryProvider; public class LuceneQueryFactoryImpl implements LuceneQueryFactory { - private int limit_attr = DEFAULT_LIMIT; - private int pageSize_attr = DEFAULT_PAGESIZE; - private Set<String> projection_fields_attr = new HashSet<String>(); + private int limit = DEFAULT_LIMIT; + private int pageSize = DEFAULT_PAGESIZE; + private Set<String> projectionFields = new HashSet<String>(); /* reference to the index. One index could have multiple Queries, but one Query must belong * to one index @@ -26,38 +26,25 @@ public class LuceneQueryFactoryImpl implements LuceneQueryFactory { @Override public LuceneQueryFactory setPageSize(int pageSize) { - this.pageSize_attr = pageSize; + this.pageSize = pageSize; return this; } @Override public LuceneQueryFactory setResultLimit(int limit) { - this.limit_attr = limit; + this.limit = limit; return this; } @Override public LuceneQuery create(String indexName, String regionName, - String queryString, Analyzer analyzer) throws ParseException { - QueryParser parser = new QueryParser(null, analyzer); - Query query = parser.parse(queryString); - LuceneQueryImpl luceneQuery = new LuceneQueryImpl(indexName, regionName, limit_attr, pageSize_attr, projection_fields_attr, query); - return luceneQuery; - } - - @Override - public LuceneQuery create(String indexName, String regionName, String queryString) throws ParseException { - StandardAnalyzer analyzer = new StandardAnalyzer(); - return create(indexName, regionName, queryString, analyzer); + return create(indexName, regionName, new StringQueryProvider(queryString)); } public LuceneQuery create(String indexName, String regionName, LuceneQueryProvider provider) { -// LuceneQueryImpl luceneQuery = new LuceneQueryImpl(indexName, regionName, limit_attr, pageSize_attr, -// resultType_attr, projection_fields_attr, query); -// return luceneQuery; - // TODO Auto-generated method stub - return null; + LuceneQueryImpl luceneQuery = new LuceneQueryImpl(indexName, regionName, provider, projectionFields, limit, pageSize); + return luceneQuery; } @@ -69,7 +56,7 @@ public class LuceneQueryFactoryImpl implements LuceneQueryFactory { public LuceneQueryFactory setProjectionFields(String... fieldNames) { if (fieldNames != null) { for (String fieldName:fieldNames) { - this.projection_fields_attr.add(fieldName); + this.projectionFields.add(fieldName); } } return this; http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8fb4ad7a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneQueryImpl.java ---------------------------------------------------------------------- diff --git a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneQueryImpl.java b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneQueryImpl.java index e93692f..714df95 100644 --- a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneQueryImpl.java +++ b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneQueryImpl.java @@ -6,6 +6,7 @@ import org.apache.lucene.search.Query; import com.gemstone.gemfire.cache.lucene.LuceneQuery; import com.gemstone.gemfire.cache.lucene.LuceneQueryFactory; +import com.gemstone.gemfire.cache.lucene.LuceneQueryProvider; import com.gemstone.gemfire.cache.lucene.LuceneQueryResults; public class LuceneQueryImpl implements LuceneQuery { @@ -18,16 +19,16 @@ public class LuceneQueryImpl implements LuceneQuery { private Set<String> projectedFieldNames; /* the lucene Query object to be wrapped here */ - private Query query; + private LuceneQueryProvider query; - LuceneQueryImpl(String indexName, String regionName, int limit, int pageSize, - Set<String> projectionFieldNames, Query query) { + LuceneQueryImpl(String indexName, String regionName, LuceneQueryProvider provider, Set<String> projectionFields, + int limit, int pageSize) { this.indexName = indexName; this.regionName = regionName; this.limit = limit; this.pageSize = pageSize; - this.projectedFieldNames = projectionFieldNames; - this.query = query; + this.projectedFieldNames = projectionFields; + this.query = provider; } @Override http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8fb4ad7a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneServiceImpl.java ---------------------------------------------------------------------- diff --git a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneServiceImpl.java b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneServiceImpl.java index 1d7178a..cb6e5fc 100644 --- a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneServiceImpl.java +++ b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/LuceneServiceImpl.java @@ -14,7 +14,6 @@ import com.gemstone.gemfire.cache.Region; import com.gemstone.gemfire.cache.execute.FunctionService; import com.gemstone.gemfire.cache.lucene.LuceneIndex; import com.gemstone.gemfire.cache.lucene.LuceneQueryFactory; -import com.gemstone.gemfire.cache.lucene.LuceneService; import com.gemstone.gemfire.cache.lucene.internal.distributed.EntryScore; import com.gemstone.gemfire.cache.lucene.internal.distributed.LuceneFunction; import com.gemstone.gemfire.cache.lucene.internal.distributed.LuceneFunctionContext; @@ -28,7 +27,6 @@ import com.gemstone.gemfire.internal.DataSerializableFixedID; import com.gemstone.gemfire.internal.cache.GemFireCacheImpl; import com.gemstone.gemfire.internal.cache.PartitionedRegion; import com.gemstone.gemfire.internal.cache.extension.Extensible; -import com.gemstone.gemfire.internal.cache.extension.Extension; import com.gemstone.gemfire.internal.cache.xmlcache.XmlGenerator; import com.gemstone.gemfire.internal.i18n.LocalizedStrings; import com.gemstone.gemfire.internal.logging.LogService; @@ -40,7 +38,7 @@ import com.gemstone.gemfire.internal.logging.LogService; * * @since 8.5 */ -public class LuceneServiceImpl implements LuceneService, Extension<Cache> { +public class LuceneServiceImpl implements InternalLuceneService { private final Cache cache; private final HashMap<String, LuceneIndex> indexMap; @@ -80,7 +78,7 @@ public class LuceneServiceImpl implements LuceneService, Extension<Cache> { // for this API, set index to use the default StandardAnalyzer for each field index.setAnalyzer(null); index.initialize(); - registerIndex(getUniqueIndexName(indexName, regionPath), index); + registerIndex(index); return index; } @@ -90,6 +88,9 @@ public class LuceneServiceImpl implements LuceneService, Extension<Cache> { logger.info("Data region "+regionPath+" not found"); return null; } + //Convert the region name into a canonical form + + regionPath = dataregion.getFullPath(); LuceneIndexImpl index = null; if (dataregion instanceof PartitionedRegion) { // partitioned region @@ -103,7 +104,11 @@ public class LuceneServiceImpl implements LuceneService, Extension<Cache> { @Override public LuceneIndex getIndex(String indexName, String regionPath) { - return indexMap.get(getUniqueIndexName(indexName, regionPath)); + Region region = cache.getRegion(regionPath); + if(region == null) { + return null; + } + return indexMap.get(getUniqueIndexName(indexName, region.getFullPath())); } @Override @@ -124,7 +129,7 @@ public class LuceneServiceImpl implements LuceneService, Extension<Cache> { } index.setAnalyzer(analyzer); index.initialize(); - registerIndex(getUniqueIndexName(indexName, regionPath), index); + registerIndex(index); return index; } @@ -152,7 +157,8 @@ public class LuceneServiceImpl implements LuceneService, Extension<Cache> { } - public void registerIndex(final String regionAndIndex, LuceneIndex index){ + public void registerIndex(LuceneIndex index){ + String regionAndIndex = getUniqueIndexName(index.getName(), index.getRegionPath()); if( !indexMap.containsKey( regionAndIndex )) { indexMap.put(regionAndIndex, index); } http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8fb4ad7a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/PartitionedRepositoryManager.java ---------------------------------------------------------------------- diff --git a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/PartitionedRepositoryManager.java b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/PartitionedRepositoryManager.java index 65c678c..91ad82c 100644 --- a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/PartitionedRepositoryManager.java +++ b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/PartitionedRepositoryManager.java @@ -11,15 +11,19 @@ import org.apache.lucene.index.IndexWriterConfig; import com.gemstone.gemfire.InternalGemFireError; import com.gemstone.gemfire.cache.Region; +import com.gemstone.gemfire.cache.execute.RegionFunctionContext; import com.gemstone.gemfire.cache.lucene.internal.directory.RegionDirectory; import com.gemstone.gemfire.cache.lucene.internal.repository.IndexRepository; import com.gemstone.gemfire.cache.lucene.internal.repository.IndexRepositoryImpl; import com.gemstone.gemfire.cache.lucene.internal.repository.RepositoryManager; import com.gemstone.gemfire.cache.lucene.internal.repository.serializer.LuceneSerializer; +import com.gemstone.gemfire.cache.partition.PartitionRegionHelper; import com.gemstone.gemfire.internal.cache.BucketNotFoundException; import com.gemstone.gemfire.internal.cache.BucketRegion; import com.gemstone.gemfire.internal.cache.LocalDataSet; import com.gemstone.gemfire.internal.cache.PartitionedRegion; +import com.gemstone.gemfire.internal.cache.PartitionedRegionHelper; +import com.gemstone.gemfire.internal.cache.execute.InternalRegionFunctionContext; import com.gemstone.gemfire.internal.util.concurrent.CopyOnWriteHashMap; /** @@ -77,13 +81,10 @@ public class PartitionedRepositoryManager implements RepositoryManager { } @Override - public Collection<IndexRepository> getRepositories(Region region) throws BucketNotFoundException { - if(!(region instanceof LocalDataSet)) { - throw new IllegalStateException("Trying to find the repositories for a region which is not the local data set of a function"); - } + public Collection<IndexRepository> getRepositories(RegionFunctionContext ctx) throws BucketNotFoundException { - LocalDataSet dataSet = (LocalDataSet) region; - Set<Integer> buckets = dataSet.getBucketSet(); + Region<Object, Object> region = ctx.getDataSet(); + Set<Integer> buckets = ((InternalRegionFunctionContext) ctx).getLocalBucketSet(region); ArrayList<IndexRepository> repos = new ArrayList<IndexRepository>(buckets.size()); for(Integer bucketId : buckets) { BucketRegion userBucket = userRegion.getDataStore().getLocalBucketById(bucketId); http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8fb4ad7a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/StringQueryProvider.java ---------------------------------------------------------------------- diff --git a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/StringQueryProvider.java b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/StringQueryProvider.java index 78a2f99..7e50bae 100644 --- a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/StringQueryProvider.java +++ b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/StringQueryProvider.java @@ -6,6 +6,7 @@ import java.io.IOException; import org.apache.logging.log4j.Logger; import org.apache.lucene.analysis.core.SimpleAnalyzer; +import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.queryparser.classic.MultiFieldQueryParser; import org.apache.lucene.queryparser.classic.ParseException; import org.apache.lucene.search.Query; @@ -29,37 +30,25 @@ public class StringQueryProvider implements LuceneQueryProvider, DataSerializabl // the following members hold input data and needs to be sent on wire private String query; - private String indexName; - private String regionPath; // the following members hold derived objects and need not be serialized - private Query luceneQuery; - private LuceneIndex index; + private transient Query luceneQuery; public StringQueryProvider() { - this(null, null); + this(null); } - public StringQueryProvider(LuceneIndex index, String query) { + public StringQueryProvider(String query) { this.query = query; - this.index = index; - if (index != null) { - this.indexName = index.getName(); - this.regionPath = index.getRegionPath(); - } } @Override - public synchronized Query getQuery() throws QueryException { + public synchronized Query getQuery(LuceneIndex index) throws QueryException { if (luceneQuery == null) { - String[] fields = null; - if (index != null) { - fields = index.getFieldNames(); - } else { - // TODO get index from lucene query service - } + String[] fields = index.getFieldNames(); - MultiFieldQueryParser parser = new MultiFieldQueryParser(fields, new SimpleAnalyzer()); + //TODO get the analyzer from the index + MultiFieldQueryParser parser = new MultiFieldQueryParser(fields, new StandardAnalyzer()); try { luceneQuery = parser.parse(query); } catch (ParseException e) { @@ -77,20 +66,6 @@ public class StringQueryProvider implements LuceneQueryProvider, DataSerializabl return query; } - /** - * @return name of the index on which this query will be executed - */ - public String getIndexName() { - return indexName; - } - - /** - * @return path of the region on which this query will be executed - */ - public String getRegionPath() { - return regionPath; - } - @Override public Version[] getSerializationVersions() { return null; @@ -104,14 +79,10 @@ public class StringQueryProvider implements LuceneQueryProvider, DataSerializabl @Override public void toData(DataOutput out) throws IOException { DataSerializer.writeString(query, out); - DataSerializer.writeString(index.getName(), out); - DataSerializer.writeString(index.getRegionPath(), out); } @Override public void fromData(DataInput in) throws IOException, ClassNotFoundException { query = DataSerializer.readString(in); - this.indexName = DataSerializer.readString(in); - this.regionPath = DataSerializer.readString(in); } } http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8fb4ad7a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunction.java ---------------------------------------------------------------------- diff --git a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunction.java b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunction.java index ca0e2d3..b8552fa 100644 --- a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunction.java +++ b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunction.java @@ -14,6 +14,9 @@ import com.gemstone.gemfire.cache.execute.RegionFunctionContext; import com.gemstone.gemfire.cache.execute.ResultSender; import com.gemstone.gemfire.cache.lucene.LuceneQueryFactory; import com.gemstone.gemfire.cache.lucene.LuceneQueryProvider; +import com.gemstone.gemfire.cache.lucene.LuceneService; +import com.gemstone.gemfire.cache.lucene.LuceneServiceProvider; +import com.gemstone.gemfire.cache.lucene.internal.InternalLuceneIndex; import com.gemstone.gemfire.cache.lucene.internal.repository.IndexRepository; import com.gemstone.gemfire.cache.lucene.internal.repository.IndexResultCollector; import com.gemstone.gemfire.cache.lucene.internal.repository.RepositoryManager; @@ -32,8 +35,6 @@ public class LuceneFunction extends FunctionAdapter { private static final Logger logger = LogService.getLogger(); - private static RepositoryManager repoManager; - @Override public void execute(FunctionContext context) { RegionFunctionContext ctx = (RegionFunctionContext) context; @@ -52,10 +53,14 @@ public class LuceneFunction extends FunctionAdapter { resultSender.sendException(new IllegalArgumentException("Missing query provider")); return; } + + LuceneService service = LuceneServiceProvider.get(region.getCache()); + InternalLuceneIndex index = (InternalLuceneIndex) service.getIndex(searchContext.getIndexName(), region.getFullPath()); + RepositoryManager repoManager = index.getRepositoryManager(); Query query = null; try { - query = queryProvider.getQuery(); + query = queryProvider.getQuery(index); } catch (QueryException e) { resultSender.sendException(e); return; @@ -65,19 +70,19 @@ public class LuceneFunction extends FunctionAdapter { logger.debug("Executing lucene query: {}, on region {}", query, region.getFullPath()); } + int resultLimit = searchContext.getLimit(); CollectorManager manager = (searchContext == null) ? null : searchContext.getCollectorManager(); if (manager == null) { - int resultLimit = (searchContext == null ? LuceneQueryFactory.DEFAULT_LIMIT : searchContext.getLimit()); manager = new TopEntriesCollectorManager(null, resultLimit); } Collection<IndexResultCollector> results = new ArrayList<>(); try { - Collection<IndexRepository> repositories = getIndexRepositories(ctx, region); + Collection<IndexRepository> repositories = repoManager.getRepositories(ctx); for (IndexRepository repo : repositories) { IndexResultCollector collector = manager.newCollector(repo.toString()); logger.debug("Executing search on repo: " + repo.toString()); - repo.query(query, 0, collector); + repo.query(query, resultLimit, collector); results.add(collector); } } catch (IOException e) { @@ -101,15 +106,6 @@ public class LuceneFunction extends FunctionAdapter { } } - private Collection<IndexRepository> getIndexRepositories(RegionFunctionContext ctx, Region region) throws BucketNotFoundException { - synchronized (LuceneFunction.class) { - return repoManager.getRepositories(region); - } - } - - static synchronized void setRepositoryManager(RepositoryManager manager) { - repoManager = manager; - } @Override public String getId() { http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8fb4ad7a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunctionContext.java ---------------------------------------------------------------------- diff --git a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunctionContext.java b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunctionContext.java index feeb768..d36bcc2 100644 --- a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunctionContext.java +++ b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunctionContext.java @@ -18,23 +18,24 @@ import com.gemstone.gemfire.internal.Version; public class LuceneFunctionContext<C extends IndexResultCollector> implements DataSerializableFixedID { private CollectorManager<C> manager; private int limit; - - LuceneQueryProvider queryProvider; + private LuceneQueryProvider queryProvider; + private String indexName; public LuceneFunctionContext() { - this(null, null); + this(null, null, null); } - public LuceneFunctionContext(LuceneQueryProvider provider) { - this(provider, null); + public LuceneFunctionContext(LuceneQueryProvider provider, String indexName) { + this(provider, indexName, null); } - public LuceneFunctionContext(LuceneQueryProvider provider, CollectorManager<C> manager) { - this(provider, manager, LuceneQueryFactory.DEFAULT_LIMIT); + public LuceneFunctionContext(LuceneQueryProvider provider, String indexName, CollectorManager<C> manager) { + this(provider, indexName, manager, LuceneQueryFactory.DEFAULT_LIMIT); } - public LuceneFunctionContext(LuceneQueryProvider provider, CollectorManager<C> manager, int limit) { + public LuceneFunctionContext(LuceneQueryProvider provider, String indexName, CollectorManager<C> manager, int limit) { this.queryProvider = provider; + this.indexName = indexName; this.manager = manager; this.limit = limit; } @@ -47,6 +48,13 @@ public class LuceneFunctionContext<C extends IndexResultCollector> implements Da } /** + * Get the name of the index to query + */ + public String getIndexName() { + return indexName; + } + + /** * On each member, search query is executed on one or more {@link IndexRepository}s. A {@link CollectorManager} could * be provided to customize the way results from these repositories is collected and merged. * @@ -70,6 +78,7 @@ public class LuceneFunctionContext<C extends IndexResultCollector> implements Da out.writeInt(limit); DataSerializer.writeObject(queryProvider, out); DataSerializer.writeObject(manager, out); + DataSerializer.writeString(indexName, out); } @Override @@ -77,6 +86,7 @@ public class LuceneFunctionContext<C extends IndexResultCollector> implements Da limit = in.readInt(); queryProvider = DataSerializer.readObject(in); manager = DataSerializer.readObject(in); + this.indexName = DataSerializer.readString(in); } @Override http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8fb4ad7a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/repository/RepositoryManager.java ---------------------------------------------------------------------- diff --git a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/repository/RepositoryManager.java b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/repository/RepositoryManager.java index b61e8be..cea4f89 100644 --- a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/repository/RepositoryManager.java +++ b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/repository/RepositoryManager.java @@ -22,5 +22,5 @@ public interface RepositoryManager { * @return a collection of {@link IndexRepository} instances * @throws BucketNotFoundException if any of the requested buckets is not found on this member */ - Collection<IndexRepository> getRepositories(Region localDataSet) throws BucketNotFoundException; + Collection<IndexRepository> getRepositories(RegionFunctionContext context) throws BucketNotFoundException; } http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8fb4ad7a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/LuceneServiceImplJUnitTest.java ---------------------------------------------------------------------- diff --git a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/LuceneServiceImplJUnitTest.java b/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/LuceneServiceImplJUnitTest.java index a7ed00d..10f4794 100644 --- a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/LuceneServiceImplJUnitTest.java +++ b/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/LuceneServiceImplJUnitTest.java @@ -127,7 +127,7 @@ public class LuceneServiceImplJUnitTest { assertTrue(index1 instanceof LuceneIndexForPartitionedRegion); LuceneIndexForPartitionedRegion index1PR = (LuceneIndexForPartitionedRegion)index1; assertEquals("index1", index1.getName()); - assertEquals("PR1", index1.getRegionPath()); + assertEquals("/PR1", index1.getRegionPath()); String[] fields1 = index1.getFieldNames(); assertEquals(3, fields1.length); Analyzer analyzer = index1PR.getAnalyzer(); @@ -135,8 +135,8 @@ public class LuceneServiceImplJUnitTest { RepositoryManager RepositoryManager = index1PR.getRepositoryManager(); assertTrue(RepositoryManager != null); - final String fileRegionName = LuceneServiceImpl.getUniqueIndexName("index1", "PR1")+".files"; - final String chunkRegionName = LuceneServiceImpl.getUniqueIndexName("index1", "PR1")+".chunks"; + final String fileRegionName = LuceneServiceImpl.getUniqueIndexName("index1", "/PR1")+".files"; + final String chunkRegionName = LuceneServiceImpl.getUniqueIndexName("index1", "/PR1")+".chunks"; PartitionedRegion filePR = (PartitionedRegion)cache.getRegion(fileRegionName); PartitionedRegion chunkPR = (PartitionedRegion)cache.getRegion(chunkRegionName); assertTrue(filePR != null); @@ -160,7 +160,7 @@ public class LuceneServiceImplJUnitTest { assertTrue(index1 instanceof LuceneIndexForPartitionedRegion); LuceneIndexForPartitionedRegion index1PR = (LuceneIndexForPartitionedRegion)index1; assertEquals("index1", index1.getName()); - assertEquals("PR1", index1.getRegionPath()); + assertEquals("/PR1", index1.getRegionPath()); String[] fields1 = index1.getFieldNames(); assertEquals(3, fields1.length); Analyzer analyzer = index1PR.getAnalyzer(); @@ -168,8 +168,8 @@ public class LuceneServiceImplJUnitTest { RepositoryManager RepositoryManager = index1PR.getRepositoryManager(); assertTrue(RepositoryManager != null); - final String fileRegionName = LuceneServiceImpl.getUniqueIndexName("index1", "PR1")+".files"; - final String chunkRegionName = LuceneServiceImpl.getUniqueIndexName("index1", "PR1")+".chunks"; + final String fileRegionName = LuceneServiceImpl.getUniqueIndexName("index1", "/PR1")+".files"; + final String chunkRegionName = LuceneServiceImpl.getUniqueIndexName("index1", "/PR1")+".chunks"; PartitionedRegion filePR = (PartitionedRegion)cache.getRegion(fileRegionName); PartitionedRegion chunkPR = (PartitionedRegion)cache.getRegion(chunkRegionName); assertTrue(filePR != null); http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8fb4ad7a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/PartitionedRepositoryManagerJUnitTest.java ---------------------------------------------------------------------- diff --git a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/PartitionedRepositoryManagerJUnitTest.java b/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/PartitionedRepositoryManagerJUnitTest.java index a2cc75e..1225aa1 100644 --- a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/PartitionedRepositoryManagerJUnitTest.java +++ b/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/PartitionedRepositoryManagerJUnitTest.java @@ -2,6 +2,7 @@ package com.gemstone.gemfire.cache.lucene.internal; import static org.junit.Assert.*; import static org.mockito.Matchers.*; +import static org.mockito.Mockito.*; import java.io.IOException; import java.util.Arrays; @@ -21,6 +22,7 @@ import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; +import com.gemstone.gemfire.cache.Region; import com.gemstone.gemfire.cache.lucene.internal.directory.RegionDirectory; import com.gemstone.gemfire.cache.lucene.internal.repository.IndexRepository; import com.gemstone.gemfire.cache.lucene.internal.repository.IndexRepositoryImpl; @@ -32,6 +34,7 @@ import com.gemstone.gemfire.internal.cache.LocalDataSet; import com.gemstone.gemfire.internal.cache.PartitionedRegion; import com.gemstone.gemfire.internal.cache.PartitionedRegion.RetryTimeKeeper; import com.gemstone.gemfire.internal.cache.PartitionedRegionDataStore; +import com.gemstone.gemfire.internal.cache.execute.InternalRegionFunctionContext; import com.gemstone.gemfire.test.junit.categories.UnitTest; @Category(UnitTest.class) @@ -147,8 +150,9 @@ public class PartitionedRepositoryManagerJUnitTest { BucketRegion mockBucket1 = getMockBucket(1); Set<Integer> buckets = new LinkedHashSet<Integer>(Arrays.asList(0, 1)); - LocalDataSet ldr = new LocalDataSet(null, buckets); - Collection<IndexRepository> repos = repoManager.getRepositories(ldr); + InternalRegionFunctionContext ctx = Mockito.mock(InternalRegionFunctionContext.class); + Mockito.when(ctx.getLocalBucketSet((any(Region.class)))).thenReturn(buckets); + Collection<IndexRepository> repos = repoManager.getRepositories(ctx); assertEquals(2, repos.size()); Iterator<IndexRepository> itr = repos.iterator(); @@ -173,9 +177,10 @@ public class PartitionedRepositoryManagerJUnitTest { BucketRegion mockBucket0 = getMockBucket(0); Set<Integer> buckets = new LinkedHashSet<Integer>(Arrays.asList(0, 1)); - LocalDataSet ldr = new LocalDataSet(userRegion, buckets); - repoManager.getRepositories(ldr); + InternalRegionFunctionContext ctx = Mockito.mock(InternalRegionFunctionContext.class); + Mockito.when(ctx.getLocalBucketSet((any(Region.class)))).thenReturn(buckets); + repoManager.getRepositories(ctx); } private void checkRepository(IndexRepositoryImpl repo0, int bucketId) { http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8fb4ad7a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/StringQueryProviderJUnitTest.java ---------------------------------------------------------------------- diff --git a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/StringQueryProviderJUnitTest.java b/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/StringQueryProviderJUnitTest.java index 078ae42..673fdf2 100644 --- a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/StringQueryProviderJUnitTest.java +++ b/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/StringQueryProviderJUnitTest.java @@ -5,6 +5,7 @@ import static org.junit.Assert.assertEquals; import org.apache.lucene.search.Query; import org.junit.Assert; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.experimental.categories.Category; import org.mockito.Mockito; @@ -31,41 +32,40 @@ public class StringQueryProviderJUnitTest { @Test public void testQueryConstruction() throws QueryException { - StringQueryProvider provider = new StringQueryProvider(null, "foo:bar"); - Query query = provider.getQuery(); + StringQueryProvider provider = new StringQueryProvider("foo:bar"); + Query query = provider.getQuery(mockIndex); Assert.assertNotNull(query); assertEquals("foo:bar", query.toString()); } @Test public void usesSearchableFieldsAsDefaults() throws QueryException { - StringQueryProvider provider = new StringQueryProvider(mockIndex, "findThis"); - Query query = provider.getQuery(); + StringQueryProvider provider = new StringQueryProvider("findThis"); + Query query = provider.getQuery(mockIndex); Assert.assertNotNull(query); assertEquals("field-1:findthis field-2:findthis", query.toString()); } @Test + @Ignore("Custom analyzer not yet supported, this is a duplicate test right now") public void usesCustomAnalyzer() throws QueryException { - StringQueryProvider provider = new StringQueryProvider(mockIndex, "findThis"); - Query query = provider.getQuery(); + StringQueryProvider provider = new StringQueryProvider("findThis"); + Query query = provider.getQuery(mockIndex); Assert.assertNotNull(query); assertEquals("field-1:findthis field-2:findthis", query.toString()); } @Test(expected = QueryException.class) public void errorsOnMalformedQueryString() throws QueryException { - StringQueryProvider provider = new StringQueryProvider(mockIndex, "invalid:lucene:query:string"); - provider.getQuery(); + StringQueryProvider provider = new StringQueryProvider("invalid:lucene:query:string"); + provider.getQuery(mockIndex); } @Test public void testSerialization() { LuceneServiceImpl.registerDataSerializables(); - StringQueryProvider provider = new StringQueryProvider(mockIndex, "text:search"); + StringQueryProvider provider = new StringQueryProvider("text:search"); StringQueryProvider copy = CopyHelper.deepCopy(provider); assertEquals("text:search", copy.getQueryString()); - assertEquals(mockIndex.getName(), copy.getIndexName()); - assertEquals(mockIndex.getRegionPath(), copy.getRegionPath()); } } http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8fb4ad7a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunctionContextJUnitTest.java ---------------------------------------------------------------------- diff --git a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunctionContextJUnitTest.java b/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunctionContextJUnitTest.java index 01a1690..98b48d8 100644 --- a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunctionContextJUnitTest.java +++ b/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunctionContextJUnitTest.java @@ -30,18 +30,16 @@ public class LuceneFunctionContextJUnitTest { public void testSerialization() { LuceneServiceImpl.registerDataSerializables(); - LuceneIndex mockIndex = Mockito.mock(LuceneIndex.class); - Mockito.doReturn("mockIndex").when(mockIndex).getName(); - LuceneQueryProvider provider = new StringQueryProvider(mockIndex, "text"); + LuceneQueryProvider provider = new StringQueryProvider("text"); CollectorManager<TopEntriesCollector> manager = new TopEntriesCollectorManager("test"); - LuceneFunctionContext<TopEntriesCollector> context = new LuceneFunctionContext<>(provider, manager, 123); + LuceneFunctionContext<TopEntriesCollector> context = new LuceneFunctionContext<>(provider, "testIndex", manager, 123); LuceneFunctionContext<TopEntriesCollector> copy = CopyHelper.deepCopy(context); assertEquals(123, copy.getLimit()); Assert.assertNotNull(copy.getQueryProvider()); assertEquals("text", ((StringQueryProvider) copy.getQueryProvider()).getQueryString()); - assertEquals("mockIndex", ((StringQueryProvider) copy.getQueryProvider()).getIndexName()); assertEquals(TopEntriesCollectorManager.class, copy.getCollectorManager().getClass()); assertEquals("test", ((TopEntriesCollectorManager) copy.getCollectorManager()).getId()); + assertEquals("testIndex", copy.getIndexName()); } } http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8fb4ad7a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunctionJUnitTest.java ---------------------------------------------------------------------- diff --git a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunctionJUnitTest.java b/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunctionJUnitTest.java index ba5f96a..6c37468 100644 --- a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunctionJUnitTest.java +++ b/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunctionJUnitTest.java @@ -1,6 +1,6 @@ package com.gemstone.gemfire.cache.lucene.internal.distributed; -import static org.junit.Assert.assertEquals; +import static org.junit.Assert.*; import java.io.IOException; import java.util.ArrayList; @@ -23,26 +23,35 @@ import org.junit.experimental.categories.Category; import com.gemstone.gemfire.cache.Region; import com.gemstone.gemfire.cache.execute.RegionFunctionContext; import com.gemstone.gemfire.cache.execute.ResultSender; +import com.gemstone.gemfire.cache.lucene.LuceneQueryFactory; import com.gemstone.gemfire.cache.lucene.LuceneQueryProvider; +import com.gemstone.gemfire.cache.lucene.LuceneService; +import com.gemstone.gemfire.cache.lucene.internal.InternalLuceneIndex; +import com.gemstone.gemfire.cache.lucene.internal.InternalLuceneService; import com.gemstone.gemfire.cache.lucene.internal.StringQueryProvider; import com.gemstone.gemfire.cache.lucene.internal.repository.IndexRepository; import com.gemstone.gemfire.cache.lucene.internal.repository.IndexResultCollector; import com.gemstone.gemfire.cache.lucene.internal.repository.RepositoryManager; import com.gemstone.gemfire.cache.query.QueryException; import com.gemstone.gemfire.internal.cache.BucketNotFoundException; +import com.gemstone.gemfire.internal.cache.InternalCache; +import com.gemstone.gemfire.internal.cache.execute.InternalRegionFunctionContext; +import com.gemstone.gemfire.internal.cache.extension.ExtensionPoint; import com.gemstone.gemfire.test.junit.categories.UnitTest; @Category(UnitTest.class) public class LuceneFunctionJUnitTest { Mockery mocker; + String regionPath = "/region"; + String indexName = "index"; final EntryScore r1_1 = new EntryScore("key-1-1", .5f); final EntryScore r1_2 = new EntryScore("key-1-2", .4f); final EntryScore r1_3 = new EntryScore("key-1-3", .3f); final EntryScore r2_1 = new EntryScore("key-2-1", .45f); final EntryScore r2_2 = new EntryScore("key-2-2", .35f); - RegionFunctionContext mockContext; + InternalRegionFunctionContext mockContext; ResultSender<TopEntriesCollector> mockResultSender; Region<Object, Object> mockRegion; @@ -50,12 +59,16 @@ public class LuceneFunctionJUnitTest { IndexRepository mockRepository1; IndexRepository mockRepository2; IndexResultCollector mockCollector; + InternalLuceneService mockService; + InternalLuceneIndex mockIndex; ArrayList<IndexRepository> repos; LuceneFunctionContext searchArgs; LuceneQueryProvider queryProvider; Query query; + private InternalCache mockCache; + @Test public void testRepoQueryAndMerge() throws Exception { final AtomicReference<TopEntriesCollector> result = new AtomicReference<>(); @@ -66,13 +79,13 @@ public class LuceneFunctionJUnitTest { oneOf(mockContext).getArguments(); will(returnValue(searchArgs)); - oneOf(mockRepoManager).getRepositories(mockRegion); + oneOf(mockRepoManager).getRepositories(mockContext); will(returnValue(repos)); oneOf(mockContext).getResultSender(); will(returnValue(mockResultSender)); - oneOf(mockRepository1).query(with(query), with(equal(0)), with(any(IndexResultCollector.class))); + oneOf(mockRepository1).query(with(query), with(equal(LuceneQueryFactory.DEFAULT_LIMIT)), with(any(IndexResultCollector.class))); will(new CustomAction("streamSearchResults") { @Override public Object invoke(Invocation invocation) throws Throwable { @@ -84,7 +97,7 @@ public class LuceneFunctionJUnitTest { } }); - oneOf(mockRepository2).query(with(query), with(equal(0)), with(any(IndexResultCollector.class))); + oneOf(mockRepository2).query(with(query), with(equal(LuceneQueryFactory.DEFAULT_LIMIT)), with(any(IndexResultCollector.class))); will(new CustomAction("streamSearchResults") { @Override public Object invoke(Invocation invocation) throws Throwable { @@ -107,7 +120,6 @@ public class LuceneFunctionJUnitTest { }); LuceneFunction function = new LuceneFunction(); - function.setRepositoryManager(mockRepoManager); function.execute(mockContext); List<EntryScore> hits = result.get().getEntries().getHits(); @@ -119,7 +131,7 @@ public class LuceneFunctionJUnitTest { public void testResultLimitClause() throws Exception { final AtomicReference<TopEntriesCollector> result = new AtomicReference<>(); - searchArgs = new LuceneFunctionContext<IndexResultCollector>(queryProvider, null, 3); + searchArgs = new LuceneFunctionContext<IndexResultCollector>(queryProvider, "indexName", null, 3); mocker.checking(new Expectations() { { @@ -131,10 +143,10 @@ public class LuceneFunctionJUnitTest { oneOf(mockContext).getResultSender(); will(returnValue(mockResultSender)); - oneOf(mockRepoManager).getRepositories(mockRegion); + oneOf(mockRepoManager).getRepositories(mockContext); will(returnValue(repos)); - oneOf(mockRepository1).query(with(query), with(equal(0)), with(any(IndexResultCollector.class))); + oneOf(mockRepository1).query(with(query), with(equal(3)), with(any(IndexResultCollector.class))); will(new CustomAction("streamSearchResults") { @Override public Object invoke(Invocation invocation) throws Throwable { @@ -146,7 +158,7 @@ public class LuceneFunctionJUnitTest { } }); - oneOf(mockRepository2).query(with(query), with(equal(0)), with(any(IndexResultCollector.class))); + oneOf(mockRepository2).query(with(query), with(equal(3)), with(any(IndexResultCollector.class))); will(new CustomAction("streamSearchResults") { @Override public Object invoke(Invocation invocation) throws Throwable { @@ -169,7 +181,6 @@ public class LuceneFunctionJUnitTest { }); LuceneFunction function = new LuceneFunction(); - function.setRepositoryManager(mockRepoManager); function.execute(mockContext); List<EntryScore> hits = result.get().getEntries().getHits(); @@ -180,7 +191,7 @@ public class LuceneFunctionJUnitTest { @Test public void injectCustomCollectorManager() throws Exception { final CollectorManager mockManager = mocker.mock(CollectorManager.class); - searchArgs = new LuceneFunctionContext<IndexResultCollector>(queryProvider, mockManager); + searchArgs = new LuceneFunctionContext<IndexResultCollector>(queryProvider, "indexName", mockManager); mocker.checking(new Expectations() { { oneOf(mockContext).getDataSet(); @@ -190,7 +201,7 @@ public class LuceneFunctionJUnitTest { oneOf(mockContext).getResultSender(); will(returnValue(mockResultSender)); - oneOf(mockRepoManager).getRepositories(mockRegion); + oneOf(mockRepoManager).getRepositories(mockContext); repos.remove(0); will(returnValue(repos)); @@ -209,7 +220,7 @@ public class LuceneFunctionJUnitTest { oneOf(mockCollector).collect("key-2-1", .45f); - oneOf(mockRepository2).query(with(query), with(equal(0)), with(any(IndexResultCollector.class))); + oneOf(mockRepository2).query(with(query), with(equal(LuceneQueryFactory.DEFAULT_LIMIT)), with(any(IndexResultCollector.class))); will(new CustomAction("streamSearchResults") { @Override public Object invoke(Invocation invocation) throws Throwable { @@ -224,7 +235,6 @@ public class LuceneFunctionJUnitTest { }); LuceneFunction function = new LuceneFunction(); - function.setRepositoryManager(mockRepoManager); function.execute(mockContext); } @@ -238,20 +248,19 @@ public class LuceneFunctionJUnitTest { oneOf(mockContext).getArguments(); will(returnValue(searchArgs)); - oneOf(mockRepoManager).getRepositories(mockRegion); + oneOf(mockRepoManager).getRepositories(mockContext); will(returnValue(repos)); oneOf(mockContext).getResultSender(); will(returnValue(mockResultSender)); oneOf(mockResultSender).sendException(with(any(IOException.class))); - oneOf(mockRepository1).query(with(query), with(equal(0)), with(any(IndexResultCollector.class))); + oneOf(mockRepository1).query(with(query), with(equal(LuceneQueryFactory.DEFAULT_LIMIT)), with(any(IndexResultCollector.class))); will(throwException(new IOException())); } }); LuceneFunction function = new LuceneFunction(); - function.setRepositoryManager(mockRepoManager); function.execute(mockContext); } @@ -265,7 +274,7 @@ public class LuceneFunctionJUnitTest { oneOf(mockContext).getArguments(); will(returnValue(searchArgs)); - oneOf(mockRepoManager).getRepositories(mockRegion); + oneOf(mockRepoManager).getRepositories(mockContext); will(throwException(new BucketNotFoundException(""))); oneOf(mockContext).getResultSender(); @@ -275,7 +284,6 @@ public class LuceneFunctionJUnitTest { }); LuceneFunction function = new LuceneFunction(); - function.setRepositoryManager(mockRepoManager); function.execute(mockContext); } @@ -283,7 +291,7 @@ public class LuceneFunctionJUnitTest { @Test public void testReduceError() throws Exception { final CollectorManager mockManager = mocker.mock(CollectorManager.class); - searchArgs = new LuceneFunctionContext<IndexResultCollector>(queryProvider, mockManager); + searchArgs = new LuceneFunctionContext<IndexResultCollector>(queryProvider, "indexName", mockManager); mocker.checking(new Expectations() { { oneOf(mockContext).getDataSet(); @@ -298,17 +306,16 @@ public class LuceneFunctionJUnitTest { oneOf(mockManager).reduce(with(any(Collection.class))); will(throwException(new IOException())); - oneOf(mockRepoManager).getRepositories(mockRegion); + oneOf(mockRepoManager).getRepositories(mockContext); repos.remove(1); will(returnValue(repos)); - oneOf(mockRepository1).query(query, 0, mockCollector); + oneOf(mockRepository1).query(query, LuceneQueryFactory.DEFAULT_LIMIT, mockCollector); oneOf(mockResultSender).sendException(with(any(IOException.class))); } }); LuceneFunction function = new LuceneFunction(); - function.setRepositoryManager(mockRepoManager); function.execute(mockContext); } @@ -316,7 +323,7 @@ public class LuceneFunctionJUnitTest { @Test public void queryProviderErrorIsHandled() throws Exception { queryProvider = mocker.mock(LuceneQueryProvider.class); - searchArgs = new LuceneFunctionContext<IndexResultCollector>(queryProvider, null); + searchArgs = new LuceneFunctionContext<IndexResultCollector>(queryProvider, "indexName"); mocker.checking(new Expectations() { { oneOf(mockContext).getDataSet(); @@ -326,7 +333,7 @@ public class LuceneFunctionJUnitTest { oneOf(mockContext).getArguments(); will(returnValue(searchArgs)); - oneOf(queryProvider).getQuery(); + oneOf(queryProvider).getQuery(mockIndex); will(throwException(new QueryException())); oneOf(mockResultSender).sendException(with(any(QueryException.class))); @@ -334,7 +341,6 @@ public class LuceneFunctionJUnitTest { }); LuceneFunction function = new LuceneFunction(); - function.setRepositoryManager(mockRepoManager); function.execute(mockContext); } @@ -354,7 +360,7 @@ public class LuceneFunctionJUnitTest { } }; - mockContext = mocker.mock(RegionFunctionContext.class); + mockContext = mocker.mock(InternalRegionFunctionContext.class); mockResultSender = mocker.mock(ResultSender.class); mockRegion = mocker.mock(Region.class); @@ -366,10 +372,35 @@ public class LuceneFunctionJUnitTest { repos = new ArrayList<IndexRepository>(); repos.add(mockRepository1); repos.add(mockRepository2); - - queryProvider = new StringQueryProvider(null, "gemfire:lucene"); - query = queryProvider.getQuery(); - searchArgs = new LuceneFunctionContext<IndexResultCollector>(queryProvider); + + mockIndex = mocker.mock(InternalLuceneIndex.class); + mockService = mocker.mock(InternalLuceneService.class); + mockCache = mocker.mock(InternalCache.class); + + queryProvider = new StringQueryProvider("gemfire:lucene"); + + searchArgs = new LuceneFunctionContext<IndexResultCollector>(queryProvider, "indexName"); + + final ExtensionPoint mockExtensionPoint = mocker.mock(ExtensionPoint.class); + mocker.checking(new Expectations() {{ + allowing(mockRegion).getCache(); + will(returnValue(mockCache)); + allowing(mockRegion).getFullPath(); + will(returnValue(regionPath)); + allowing(mockCache).getExtensionPoint(); + will(returnValue(mockExtensionPoint)); + allowing(mockExtensionPoint).getExtension(LuceneService.class); + will(returnValue(mockService)); + allowing(mockService).getIndex(with("indexName"), with(regionPath)); + will(returnValue(mockIndex)); + allowing(mockIndex).getRepositoryManager(); + will(returnValue(mockRepoManager)); + allowing(mockIndex).getFieldNames(); + will(returnValue(new String[] {"gemfire"})); + + }}); + + query = queryProvider.getQuery(mockIndex); } @After http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8fb4ad7a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunctionReadPathDUnitTest.java ---------------------------------------------------------------------- diff --git a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunctionReadPathDUnitTest.java b/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunctionReadPathDUnitTest.java index a950c8d..939790d 100644 --- a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunctionReadPathDUnitTest.java +++ b/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/distributed/LuceneFunctionReadPathDUnitTest.java @@ -1,40 +1,30 @@ package com.gemstone.gemfire.cache.lucene.internal.distributed; -import static org.mockito.Matchers.*; -import static org.mockito.Mockito.*; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; +import java.io.Serializable; import java.util.concurrent.TimeUnit; -import org.apache.lucene.search.Query; import org.junit.Assert; import org.junit.experimental.categories.Category; -import org.mockito.Mockito; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; import com.gemstone.gemfire.cache.Cache; import com.gemstone.gemfire.cache.Region; import com.gemstone.gemfire.cache.RegionFactory; import com.gemstone.gemfire.cache.RegionShortcut; -import com.gemstone.gemfire.cache.execute.FunctionException; import com.gemstone.gemfire.cache.execute.FunctionService; import com.gemstone.gemfire.cache.execute.ResultCollector; import com.gemstone.gemfire.cache.lucene.LuceneIndex; import com.gemstone.gemfire.cache.lucene.LuceneQueryProvider; import com.gemstone.gemfire.cache.lucene.LuceneService; import com.gemstone.gemfire.cache.lucene.LuceneServiceProvider; +import com.gemstone.gemfire.cache.lucene.internal.InternalLuceneIndex; import com.gemstone.gemfire.cache.lucene.internal.StringQueryProvider; import com.gemstone.gemfire.cache.lucene.internal.repository.IndexRepository; -import com.gemstone.gemfire.cache.lucene.internal.repository.IndexResultCollector; -import com.gemstone.gemfire.cache.lucene.internal.repository.RepositoryManager; import com.gemstone.gemfire.cache30.CacheTestCase; import com.gemstone.gemfire.internal.cache.BucketNotFoundException; import com.gemstone.gemfire.test.junit.categories.DistributedTest; import dunit.Host; +import dunit.SerializableCallable; import dunit.SerializableRunnable; import dunit.VM; @@ -61,43 +51,36 @@ public class LuceneFunctionReadPathDUnitTest extends CacheTestCase { } public void testEnd2EndFunctionExecution() { - SerializableRunnable createPartitionRegion = new SerializableRunnable("createRegion") { + SerializableCallable createPartitionRegion = new SerializableCallable("createRegion") { private static final long serialVersionUID = 1L; - public void run() { + public Object call() throws Exception { final Cache cache = getCache(); assertNotNull(cache); RegionFactory<Object, Object> regionFactory = cache.createRegionFactory(RegionShortcut.PARTITION); - regionFactory.create(REGION_NAME); + Region<Object, Object> region = regionFactory.create(REGION_NAME); + LuceneService service = LuceneServiceProvider.get(cache); - service.createIndex(INDEX_NAME, REGION_NAME); - - IndexRepository mockRepo = mock(IndexRepository.class); - Collection<IndexRepository> repos = new ArrayList<IndexRepository>(); - repos.add(mockRepo); - - RepositoryManager mockManager = mock(RepositoryManager.class); - // TODO avoid using repository manager mock. The manager choice depends on the region type - LuceneFunction.setRepositoryManager(mockManager); + InternalLuceneIndex index = (InternalLuceneIndex) service.createIndex(INDEX_NAME, REGION_NAME, "text"); + + + region.put(1, new TestObject("hello world")); + region.put(2, new TestObject("goodbye world")); + + //TODO - the async event queue hasn't been hooked up, so we'll fake out + //writing the entry to the repository. try { - Mockito.doReturn(repos).when(mockManager).getRepositories(any(Region.class)); - } catch (BucketNotFoundException e) { - fail("", e); - } - - try { - Mockito.doAnswer(new Answer<Object>() { - public Object answer(InvocationOnMock invocation) { - Object[] args = invocation.getArguments(); - IndexResultCollector collector = (IndexResultCollector) args[2]; - collector.collect(cache.getDistributedSystem().getDistributedMember().getProcessId(), .1f); - return null; - } - }).when(mockRepo).query(any(Query.class), Mockito.anyInt(), any(IndexResultCollector.class)); - } catch (IOException e) { - fail("", e); + IndexRepository repository1 = index.getRepositoryManager().getRepository(region, 1, null); + repository1.create(1, new TestObject("hello world")); + repository1.commit(); + IndexRepository repository2 = index.getRepositoryManager().getRepository(region, 2, null); + repository2.create(2, new TestObject("hello world")); + repository2.commit(); + } catch(BucketNotFoundException e) { + //thats ok, one of the data stores does not host these buckets. } + return null; } }; @@ -115,9 +98,9 @@ public class LuceneFunctionReadPathDUnitTest extends CacheTestCase { LuceneService service = LuceneServiceProvider.get(cache); LuceneIndex index = service.getIndex(INDEX_NAME, REGION_NAME); - LuceneQueryProvider provider = new StringQueryProvider(index, "text:search"); + LuceneQueryProvider provider = new StringQueryProvider("text:world"); - LuceneFunctionContext<TopEntriesCollector> context = new LuceneFunctionContext<>(provider, + LuceneFunctionContext<TopEntriesCollector> context = new LuceneFunctionContext<>(provider, index.getName(), new TopEntriesCollectorManager()); TopEntriesFunctionCollector collector = new TopEntriesFunctionCollector(); @@ -135,4 +118,15 @@ public class LuceneFunctionReadPathDUnitTest extends CacheTestCase { server1.invoke(executeSearch); } + + private static class TestObject implements Serializable { + private String text; + + public TestObject(String text) { + this.text = text; + } + + + } + } http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8fb4ad7a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/distributed/TopEntriesFunctionCollectorJUnitTest.java ---------------------------------------------------------------------- diff --git a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/distributed/TopEntriesFunctionCollectorJUnitTest.java b/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/distributed/TopEntriesFunctionCollectorJUnitTest.java index a66f2fc..5f7dc3d 100644 --- a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/distributed/TopEntriesFunctionCollectorJUnitTest.java +++ b/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/distributed/TopEntriesFunctionCollectorJUnitTest.java @@ -184,7 +184,7 @@ public class TopEntriesFunctionCollectorJUnitTest { @Test public void mergeShardAndLimitResults() throws Exception { - LuceneFunctionContext<TopEntriesCollector> context = new LuceneFunctionContext<>(null, null, 3); + LuceneFunctionContext<TopEntriesCollector> context = new LuceneFunctionContext<>(null, null, null, 3); TopEntriesFunctionCollector collector = new TopEntriesFunctionCollector(context); collector.addResult(null, result1); @@ -226,7 +226,7 @@ public class TopEntriesFunctionCollectorJUnitTest { } })); - LuceneFunctionContext<TopEntriesCollector> context = new LuceneFunctionContext<>(null, mockManager); + LuceneFunctionContext<TopEntriesCollector> context = new LuceneFunctionContext<>(null, null, mockManager); TopEntriesFunctionCollector collector = new TopEntriesFunctionCollector(context); collector.addResult(null, result1); collector.addResult(null, result2); @@ -255,7 +255,7 @@ public class TopEntriesFunctionCollectorJUnitTest { TopEntriesCollectorManager mockManager = mock(TopEntriesCollectorManager.class); Mockito.doThrow(new IOException()).when(mockManager).reduce(any(Collection.class)); - LuceneFunctionContext<TopEntriesCollector> context = new LuceneFunctionContext<>(null, mockManager); + LuceneFunctionContext<TopEntriesCollector> context = new LuceneFunctionContext<>(null, null, mockManager); TopEntriesFunctionCollector collector = new TopEntriesFunctionCollector(context); collector.endResults(); collector.getResult(); http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/8fb4ad7a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/repository/IndexRepositoryImplJUnitTest.java ---------------------------------------------------------------------- diff --git a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/repository/IndexRepositoryImplJUnitTest.java b/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/repository/IndexRepositoryImplJUnitTest.java index 3a25c97..ede267c 100644 --- a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/repository/IndexRepositoryImplJUnitTest.java +++ b/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/repository/IndexRepositoryImplJUnitTest.java @@ -65,6 +65,12 @@ public class IndexRepositoryImplJUnitTest { repo.commit(); checkQuery("Cream", "s", "key2", "key4"); + checkQuery("NotARealWord", "s"); + } + + @Test + public void testEmptyRepo() throws IOException, ParseException { + checkQuery("NotARealWord", "s"); } @Test
