Repository: geode Updated Branches: refs/heads/develop 2d72624cd -> 5547c2a02
GEODE-2529: Rename LuceneFunction to LuceneQueryFunction * Included new renamed file LuceneQueryFunction.java * Change thrown exception type to InternalFunctionInvocationTargetException instead of FunctionException Project: http://git-wip-us.apache.org/repos/asf/geode/repo Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/5547c2a0 Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/5547c2a0 Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/5547c2a0 Branch: refs/heads/develop Commit: 5547c2a025a74c0abae58c0d4a876a4d887eb506 Parents: 2d72624 Author: Jason Huynh <[email protected]> Authored: Wed Feb 22 16:35:57 2017 -0800 Committer: Jason Huynh <[email protected]> Committed: Wed Feb 22 16:54:23 2017 -0800 ---------------------------------------------------------------------- .../cache/lucene/internal/LuceneQueryImpl.java | 32 +- .../lucene/internal/LuceneServiceImpl.java | 5 +- .../internal/distributed/LuceneFunction.java | 138 --------- .../distributed/LuceneQueryFunction.java | 138 +++++++++ .../internal/distributed/package-info.java | 4 +- .../internal/LuceneQueryImplJUnitTest.java | 4 +- .../LuceneServiceImplIntegrationTest.java | 6 +- .../LuceneFunctionContextJUnitTest.java | 59 ---- .../distributed/LuceneFunctionJUnitTest.java | 300 ------------------- .../LuceneQueryFunctionContextJUnitTest.java | 59 ++++ .../LuceneQueryFunctionJUnitTest.java | 299 ++++++++++++++++++ 11 files changed, 519 insertions(+), 525 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/geode/blob/5547c2a0/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneQueryImpl.java ---------------------------------------------------------------------- diff --git a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneQueryImpl.java b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneQueryImpl.java index b41bb5f..b50996b 100644 --- a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneQueryImpl.java +++ b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneQueryImpl.java @@ -32,13 +32,12 @@ import org.apache.geode.cache.lucene.LuceneQueryProvider; import org.apache.geode.cache.lucene.LuceneResultStruct; import org.apache.geode.cache.lucene.PageableLuceneQueryResults; import org.apache.geode.cache.lucene.internal.distributed.EntryScore; -import org.apache.geode.cache.lucene.internal.distributed.LuceneFunction; +import org.apache.geode.cache.lucene.internal.distributed.LuceneQueryFunction; import org.apache.geode.cache.lucene.internal.distributed.LuceneFunctionContext; import org.apache.geode.cache.lucene.internal.distributed.TopEntries; import org.apache.geode.cache.lucene.internal.distributed.TopEntriesCollector; import org.apache.geode.cache.lucene.internal.distributed.TopEntriesCollectorManager; import org.apache.geode.cache.lucene.internal.distributed.TopEntriesFunctionCollector; -import org.apache.geode.internal.cache.BucketNotFoundException; import org.apache.geode.internal.logging.LogService; import org.apache.logging.log4j.Logger; @@ -107,23 +106,20 @@ public class LuceneQueryImpl<K, V> implements LuceneQuery<K, V> { // TODO provide a timeout to the user? TopEntries<K> entries = null; - while (entries == null) { - try { - TopEntriesFunctionCollector collector = new TopEntriesFunctionCollector(context); - ResultCollector<TopEntriesCollector, TopEntries<K>> rc = - (ResultCollector<TopEntriesCollector, TopEntries<K>>) onRegion().withArgs(context) - .withCollector(collector).execute(LuceneFunction.ID); - entries = rc.getResult(); - } catch (FunctionException e) { - if (e.getCause() instanceof BucketNotFoundException) { - entries = null; - } else if (e.getCause() instanceof LuceneQueryException) { - throw new LuceneQueryException(e); - } else { - e.printStackTrace(); - throw e; - } + try { + TopEntriesFunctionCollector collector = new TopEntriesFunctionCollector(context); + ResultCollector<TopEntriesCollector, TopEntries<K>> rc = + (ResultCollector<TopEntriesCollector, TopEntries<K>>) onRegion().withArgs(context) + .withCollector(collector).execute(LuceneQueryFunction.ID); + entries = rc.getResult(); + } catch (FunctionException e) { + if (e.getCause() instanceof LuceneQueryException) { + throw new LuceneQueryException(e); + } else { + e.printStackTrace(); + throw e; } + } return entries; } http://git-wip-us.apache.org/repos/asf/geode/blob/5547c2a0/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneServiceImpl.java ---------------------------------------------------------------------- diff --git a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneServiceImpl.java b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneServiceImpl.java index f1b1861..cf7b2c9 100644 --- a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneServiceImpl.java +++ b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneServiceImpl.java @@ -18,6 +18,7 @@ package org.apache.geode.cache.lucene.internal; import java.util.*; import java.util.concurrent.TimeUnit; +import org.apache.geode.cache.lucene.internal.distributed.LuceneQueryFunction; import org.apache.geode.cache.lucene.internal.management.LuceneServiceMBean; import org.apache.geode.cache.lucene.internal.management.ManagementIndexListener; import org.apache.geode.management.internal.beans.CacheServiceMBeanBase; @@ -39,7 +40,6 @@ import org.apache.geode.cache.lucene.LuceneIndex; import org.apache.geode.cache.lucene.LuceneQueryFactory; import org.apache.geode.cache.lucene.internal.directory.DumpDirectoryFiles; import org.apache.geode.cache.lucene.internal.distributed.EntryScore; -import org.apache.geode.cache.lucene.internal.distributed.LuceneFunction; import org.apache.geode.cache.lucene.internal.distributed.LuceneFunctionContext; import org.apache.geode.cache.lucene.internal.distributed.TopEntries; import org.apache.geode.cache.lucene.internal.distributed.TopEntriesCollector; @@ -55,7 +55,6 @@ import org.apache.geode.internal.cache.extension.Extensible; import org.apache.geode.internal.cache.CacheService; import org.apache.geode.internal.cache.GemFireCacheImpl; import org.apache.geode.internal.cache.InternalRegionArguments; -import org.apache.geode.internal.cache.PartitionedRegion; import org.apache.geode.internal.cache.RegionListener; import org.apache.geode.internal.cache.xmlcache.XmlGenerator; import org.apache.geode.internal.i18n.LocalizedStrings; @@ -89,7 +88,7 @@ public class LuceneServiceImpl implements InternalLuceneService { this.cache = gfc; - FunctionService.registerFunction(new LuceneFunction()); + FunctionService.registerFunction(new LuceneQueryFunction()); FunctionService.registerFunction(new WaitUntilFlushedFunction()); FunctionService.registerFunction(new DumpDirectoryFiles()); registerDataSerializables(); http://git-wip-us.apache.org/repos/asf/geode/blob/5547c2a0/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/distributed/LuceneFunction.java ---------------------------------------------------------------------- diff --git a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/distributed/LuceneFunction.java b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/distributed/LuceneFunction.java deleted file mode 100644 index a4c2c66..0000000 --- a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/distributed/LuceneFunction.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more contributor license - * agreements. See the NOTICE file distributed with this work for additional information regarding - * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. You may obtain a - * copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ - -package org.apache.geode.cache.lucene.internal.distributed; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; - -import org.apache.geode.cache.execute.Function; -import org.apache.geode.cache.lucene.internal.LuceneIndexImpl; -import org.apache.geode.cache.lucene.internal.LuceneIndexStats; -import org.apache.geode.internal.cache.execute.InternalFunctionInvocationTargetException; -import org.apache.logging.log4j.Logger; -import org.apache.lucene.search.Query; - -import org.apache.geode.cache.Region; -import org.apache.geode.cache.execute.FunctionAdapter; -import org.apache.geode.cache.execute.FunctionContext; -import org.apache.geode.cache.execute.FunctionException; -import org.apache.geode.cache.execute.RegionFunctionContext; -import org.apache.geode.cache.execute.ResultSender; -import org.apache.geode.cache.lucene.LuceneQueryException; -import org.apache.geode.cache.lucene.LuceneQueryProvider; -import org.apache.geode.cache.lucene.LuceneService; -import org.apache.geode.cache.lucene.LuceneServiceProvider; -import org.apache.geode.cache.lucene.internal.repository.IndexRepository; -import org.apache.geode.cache.lucene.internal.repository.IndexResultCollector; -import org.apache.geode.cache.lucene.internal.repository.RepositoryManager; -import org.apache.geode.internal.InternalEntity; -import org.apache.geode.internal.cache.BucketNotFoundException; -import org.apache.geode.internal.logging.LogService; - -/** - * {@link LuceneFunction} coordinates text search on a member. It receives text search query from - * the coordinator and arguments like region and buckets. It invokes search on the local index and - * provides a result collector. The locally collected results are sent to the search coordinator. - */ -public class LuceneFunction implements Function, InternalEntity { - private static final long serialVersionUID = 1L; - public static final String ID = LuceneFunction.class.getName(); - - private static final Logger logger = LogService.getLogger(); - - @Override - public void execute(FunctionContext context) { - RegionFunctionContext ctx = (RegionFunctionContext) context; - ResultSender<TopEntriesCollector> resultSender = ctx.getResultSender(); - - Region region = ctx.getDataSet(); - - LuceneFunctionContext<IndexResultCollector> searchContext = - (LuceneFunctionContext) ctx.getArguments(); - if (searchContext == null) { - throw new IllegalArgumentException("Missing search context"); - } - - LuceneQueryProvider queryProvider = searchContext.getQueryProvider(); - if (queryProvider == null) { - throw new IllegalArgumentException("Missing query provider"); - } - - LuceneService service = LuceneServiceProvider.get(region.getCache()); - LuceneIndexImpl index = - (LuceneIndexImpl) service.getIndex(searchContext.getIndexName(), region.getFullPath()); - RepositoryManager repoManager = index.getRepositoryManager(); - LuceneIndexStats stats = index.getIndexStats(); - - Query query = null; - try { - query = queryProvider.getQuery(index); - } catch (LuceneQueryException e) { - logger.warn("", e); - throw new FunctionException(e); - } - - if (logger.isDebugEnabled()) { - logger.debug("Executing lucene query: {}, on region {}", query, region.getFullPath()); - } - - int resultLimit = searchContext.getLimit(); - CollectorManager manager = (searchContext == null) ? null : searchContext.getCollectorManager(); - if (manager == null) { - manager = new TopEntriesCollectorManager(null, resultLimit); - } - - Collection<IndexResultCollector> results = new ArrayList<>(); - TopEntriesCollector mergedResult = null; - try { - long start = stats.startQuery(); - Collection<IndexRepository> repositories = null; - - try { - repositories = repoManager.getRepositories(ctx); - - for (IndexRepository repo : repositories) { - IndexResultCollector collector = manager.newCollector(repo.toString()); - if (logger.isDebugEnabled()) { - logger.debug("Executing search on repo: " + repo.toString()); - } - repo.query(query, resultLimit, collector); - results.add(collector); - } - mergedResult = (TopEntriesCollector) manager.reduce(results); - } finally { - stats.endQuery(start, mergedResult == null ? 0 : mergedResult.size()); - } - stats.incNumberOfQueryExecuted(); - resultSender.lastResult(mergedResult); - } catch (IOException | BucketNotFoundException e) { - logger.debug("Exception during lucene query function", e); - throw new FunctionException(e); - } - } - - - @Override - public String getId() { - return ID; - } - - @Override - public boolean optimizeForWrite() { - return true; - } -} http://git-wip-us.apache.org/repos/asf/geode/blob/5547c2a0/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/distributed/LuceneQueryFunction.java ---------------------------------------------------------------------- diff --git a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/distributed/LuceneQueryFunction.java b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/distributed/LuceneQueryFunction.java new file mode 100644 index 0000000..e0a0a22 --- /dev/null +++ b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/distributed/LuceneQueryFunction.java @@ -0,0 +1,138 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. You may obtain a + * copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ + +package org.apache.geode.cache.lucene.internal.distributed; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; + +import org.apache.geode.cache.execute.Function; +import org.apache.geode.cache.lucene.internal.LuceneIndexImpl; +import org.apache.geode.cache.lucene.internal.LuceneIndexStats; +import org.apache.geode.internal.cache.execute.InternalFunctionInvocationTargetException; +import org.apache.logging.log4j.Logger; +import org.apache.lucene.search.Query; + +import org.apache.geode.cache.Region; +import org.apache.geode.cache.execute.FunctionContext; +import org.apache.geode.cache.execute.FunctionException; +import org.apache.geode.cache.execute.RegionFunctionContext; +import org.apache.geode.cache.execute.ResultSender; +import org.apache.geode.cache.lucene.LuceneQueryException; +import org.apache.geode.cache.lucene.LuceneQueryProvider; +import org.apache.geode.cache.lucene.LuceneService; +import org.apache.geode.cache.lucene.LuceneServiceProvider; +import org.apache.geode.cache.lucene.internal.repository.IndexRepository; +import org.apache.geode.cache.lucene.internal.repository.IndexResultCollector; +import org.apache.geode.cache.lucene.internal.repository.RepositoryManager; +import org.apache.geode.internal.InternalEntity; +import org.apache.geode.internal.cache.BucketNotFoundException; +import org.apache.geode.internal.logging.LogService; + +/** + * {@link LuceneQueryFunction} coordinates text search on a member. It receives text search query + * from the coordinator and arguments like region and buckets. It invokes search on the local index + * and provides a result collector. The locally collected results are sent to the search + * coordinator. + */ +public class LuceneQueryFunction implements Function, InternalEntity { + private static final long serialVersionUID = 1L; + public static final String ID = LuceneQueryFunction.class.getName(); + + private static final Logger logger = LogService.getLogger(); + + @Override + public void execute(FunctionContext context) { + RegionFunctionContext ctx = (RegionFunctionContext) context; + ResultSender<TopEntriesCollector> resultSender = ctx.getResultSender(); + + Region region = ctx.getDataSet(); + + LuceneFunctionContext<IndexResultCollector> searchContext = + (LuceneFunctionContext) ctx.getArguments(); + if (searchContext == null) { + throw new IllegalArgumentException("Missing search context"); + } + + LuceneQueryProvider queryProvider = searchContext.getQueryProvider(); + if (queryProvider == null) { + throw new IllegalArgumentException("Missing query provider"); + } + + LuceneService service = LuceneServiceProvider.get(region.getCache()); + LuceneIndexImpl index = + (LuceneIndexImpl) service.getIndex(searchContext.getIndexName(), region.getFullPath()); + RepositoryManager repoManager = index.getRepositoryManager(); + LuceneIndexStats stats = index.getIndexStats(); + + Query query = null; + try { + query = queryProvider.getQuery(index); + } catch (LuceneQueryException e) { + logger.warn("", e); + throw new FunctionException(e); + } + + if (logger.isDebugEnabled()) { + logger.debug("Executing lucene query: {}, on region {}", query, region.getFullPath()); + } + + int resultLimit = searchContext.getLimit(); + CollectorManager manager = (searchContext == null) ? null : searchContext.getCollectorManager(); + if (manager == null) { + manager = new TopEntriesCollectorManager(null, resultLimit); + } + + Collection<IndexResultCollector> results = new ArrayList<>(); + TopEntriesCollector mergedResult = null; + try { + long start = stats.startQuery(); + Collection<IndexRepository> repositories = null; + + try { + repositories = repoManager.getRepositories(ctx); + + for (IndexRepository repo : repositories) { + IndexResultCollector collector = manager.newCollector(repo.toString()); + if (logger.isDebugEnabled()) { + logger.debug("Executing search on repo: " + repo.toString()); + } + repo.query(query, resultLimit, collector); + results.add(collector); + } + mergedResult = (TopEntriesCollector) manager.reduce(results); + } finally { + stats.endQuery(start, mergedResult == null ? 0 : mergedResult.size()); + } + stats.incNumberOfQueryExecuted(); + resultSender.lastResult(mergedResult); + } catch (IOException | BucketNotFoundException e) { + logger.debug("Exception during lucene query function", e); + throw new InternalFunctionInvocationTargetException(e); + } + } + + + @Override + public String getId() { + return ID; + } + + @Override + public boolean optimizeForWrite() { + return true; + } +} http://git-wip-us.apache.org/repos/asf/geode/blob/5547c2a0/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/distributed/package-info.java ---------------------------------------------------------------------- diff --git a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/distributed/package-info.java b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/distributed/package-info.java index f6c1018..b718c29 100644 --- a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/distributed/package-info.java +++ b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/distributed/package-info.java @@ -14,8 +14,8 @@ */ /** * Classes used for distributing lucene queries to geode nodes. Contains the lucene related - * functions like {@link org.apache.geode.cache.lucene.internal.distributed.LuceneFunction} as well - * as objects that are passed between nodes like + * functions like {@link org.apache.geode.cache.lucene.internal.distributed.LuceneQueryFunction} as + * well as objects that are passed between nodes like * {@link org.apache.geode.cache.lucene.internal.distributed.EntryScore} */ http://git-wip-us.apache.org/repos/asf/geode/blob/5547c2a0/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneQueryImplJUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneQueryImplJUnitTest.java b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneQueryImplJUnitTest.java index 4a31e96..9f826d5 100644 --- a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneQueryImplJUnitTest.java +++ b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneQueryImplJUnitTest.java @@ -27,6 +27,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.apache.geode.cache.lucene.internal.distributed.LuceneQueryFunction; import org.junit.Before; import org.junit.Test; import org.junit.experimental.categories.Category; @@ -40,7 +41,6 @@ import org.apache.geode.cache.lucene.LuceneQueryProvider; import org.apache.geode.cache.lucene.PageableLuceneQueryResults; import org.apache.geode.cache.lucene.LuceneResultStruct; import org.apache.geode.cache.lucene.internal.distributed.EntryScore; -import org.apache.geode.cache.lucene.internal.distributed.LuceneFunction; import org.apache.geode.cache.lucene.internal.distributed.LuceneFunctionContext; import org.apache.geode.cache.lucene.internal.distributed.TopEntries; import org.apache.geode.cache.lucene.internal.distributed.TopEntriesCollector; @@ -127,7 +127,7 @@ public class LuceneQueryImplJUnitTest { addValueToResults(); PageableLuceneQueryResults<Object, Object> results = query.findPages(); - verify(execution).execute(eq(LuceneFunction.ID)); + verify(execution).execute(eq(LuceneQueryFunction.ID)); ArgumentCaptor<LuceneFunctionContext> captor = ArgumentCaptor.forClass(LuceneFunctionContext.class); verify(execution).withArgs(captor.capture()); http://git-wip-us.apache.org/repos/asf/geode/blob/5547c2a0/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneServiceImplIntegrationTest.java ---------------------------------------------------------------------- diff --git a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneServiceImplIntegrationTest.java b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneServiceImplIntegrationTest.java index 9e3a13c..9b382e6 100644 --- a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneServiceImplIntegrationTest.java +++ b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneServiceImplIntegrationTest.java @@ -23,7 +23,7 @@ import org.apache.geode.cache.execute.Function; import org.apache.geode.cache.execute.FunctionService; import org.apache.geode.cache.lucene.LuceneService; import org.apache.geode.cache.lucene.LuceneServiceProvider; -import org.apache.geode.cache.lucene.internal.distributed.LuceneFunction; +import org.apache.geode.cache.lucene.internal.distributed.LuceneQueryFunction; import org.apache.geode.test.junit.categories.IntegrationTest; import org.junit.After; import org.junit.Rule; @@ -55,13 +55,13 @@ public class LuceneServiceImplIntegrationTest { // lucene service will register query execution function on initialization @Test public void shouldRegisterQueryFunction() { - Function function = FunctionService.getFunction(LuceneFunction.ID); + Function function = FunctionService.getFunction(LuceneQueryFunction.ID); assertNull(function); cache = getCache(); new LuceneServiceImpl().init(cache); - function = FunctionService.getFunction(LuceneFunction.ID); + function = FunctionService.getFunction(LuceneQueryFunction.ID); assertNotNull(function); } http://git-wip-us.apache.org/repos/asf/geode/blob/5547c2a0/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/distributed/LuceneFunctionContextJUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/distributed/LuceneFunctionContextJUnitTest.java b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/distributed/LuceneFunctionContextJUnitTest.java deleted file mode 100644 index 1a6ed59..0000000 --- a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/distributed/LuceneFunctionContextJUnitTest.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more contributor license - * agreements. See the NOTICE file distributed with this work for additional information regarding - * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. You may obtain a - * copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.apache.geode.cache.lucene.internal.distributed; - -import static org.apache.geode.cache.lucene.test.LuceneTestUtilities.DEFAULT_FIELD; -import static org.junit.Assert.*; - -import org.junit.Test; -import org.junit.experimental.categories.Category; - -import org.apache.geode.CopyHelper; -import org.apache.geode.cache.lucene.LuceneQueryFactory; -import org.apache.geode.cache.lucene.LuceneQueryProvider; -import org.apache.geode.cache.lucene.internal.LuceneServiceImpl; -import org.apache.geode.cache.lucene.internal.StringQueryProvider; -import org.apache.geode.cache.lucene.internal.repository.IndexResultCollector; -import org.apache.geode.internal.DataSerializableFixedID; -import org.apache.geode.test.junit.categories.UnitTest; - -@Category(UnitTest.class) -public class LuceneFunctionContextJUnitTest { - - @Test - public void testLuceneFunctionArgsDefaults() { - LuceneFunctionContext<IndexResultCollector> context = new LuceneFunctionContext<>(); - assertEquals(LuceneQueryFactory.DEFAULT_LIMIT, context.getLimit()); - assertEquals(DataSerializableFixedID.LUCENE_FUNCTION_CONTEXT, context.getDSFID()); - } - - @Test - public void testSerialization() { - LuceneServiceImpl.registerDataSerializables(); - - LuceneQueryProvider provider = new StringQueryProvider("text", DEFAULT_FIELD); - CollectorManager<TopEntriesCollector> manager = new TopEntriesCollectorManager("test"); - LuceneFunctionContext<TopEntriesCollector> context = - new LuceneFunctionContext<>(provider, "testIndex", manager, 123); - - LuceneFunctionContext<TopEntriesCollector> copy = CopyHelper.deepCopy(context); - assertEquals(123, copy.getLimit()); - assertNotNull(copy.getQueryProvider()); - assertEquals("text", ((StringQueryProvider) copy.getQueryProvider()).getQueryString()); - assertEquals(TopEntriesCollectorManager.class, copy.getCollectorManager().getClass()); - assertEquals("test", ((TopEntriesCollectorManager) copy.getCollectorManager()).getId()); - assertEquals("testIndex", copy.getIndexName()); - } -} http://git-wip-us.apache.org/repos/asf/geode/blob/5547c2a0/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/distributed/LuceneFunctionJUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/distributed/LuceneFunctionJUnitTest.java b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/distributed/LuceneFunctionJUnitTest.java deleted file mode 100644 index fe05248..0000000 --- a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/distributed/LuceneFunctionJUnitTest.java +++ /dev/null @@ -1,300 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more contributor license - * agreements. See the NOTICE file distributed with this work for additional information regarding - * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. You may obtain a - * copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ - -package org.apache.geode.cache.lucene.internal.distributed; - -import static org.apache.geode.cache.lucene.test.LuceneTestUtilities.DEFAULT_FIELD; -import static org.junit.Assert.*; -import static org.mockito.Mockito.*; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import org.apache.geode.cache.Region; -import org.apache.geode.cache.execute.FunctionException; -import org.apache.geode.cache.execute.ResultSender; -import org.apache.geode.cache.lucene.LuceneQueryException; -import org.apache.geode.cache.lucene.LuceneQueryFactory; -import org.apache.geode.cache.lucene.LuceneQueryProvider; -import org.apache.geode.cache.lucene.internal.InternalLuceneService; -import org.apache.geode.cache.lucene.internal.LuceneIndexImpl; -import org.apache.geode.cache.lucene.internal.LuceneIndexStats; -import org.apache.geode.cache.lucene.internal.StringQueryProvider; -import org.apache.geode.cache.lucene.internal.repository.IndexRepository; -import org.apache.geode.cache.lucene.internal.repository.IndexResultCollector; -import org.apache.geode.cache.lucene.internal.repository.RepositoryManager; -import org.apache.geode.internal.cache.BucketNotFoundException; -import org.apache.geode.internal.cache.InternalCache; -import org.apache.geode.internal.cache.execute.InternalRegionFunctionContext; -import org.apache.geode.test.junit.categories.UnitTest; - -import org.apache.lucene.analysis.Analyzer; -import org.apache.lucene.analysis.standard.StandardAnalyzer; -import org.apache.lucene.search.Query; -import org.junit.Before; -import org.junit.Test; -import org.junit.experimental.categories.Category; -import org.mockito.ArgumentCaptor; -import org.mockito.Mockito; - -@Category(UnitTest.class) -public class LuceneFunctionJUnitTest { - - String regionPath = "/region"; - String indexName = "index"; - final EntryScore<String> r1_1 = new EntryScore<String>("key-1-1", .5f); - final EntryScore<String> r1_2 = new EntryScore<String>("key-1-2", .4f); - final EntryScore<String> r1_3 = new EntryScore<String>("key-1-3", .3f); - final EntryScore<String> r2_1 = new EntryScore<String>("key-2-1", .45f); - final EntryScore<String> r2_2 = new EntryScore<String>("key-2-2", .35f); - - InternalRegionFunctionContext mockContext; - ResultSender<TopEntriesCollector> mockResultSender; - Region<Object, Object> mockRegion; - - RepositoryManager mockRepoManager; - IndexRepository mockRepository1; - IndexRepository mockRepository2; - IndexResultCollector mockCollector; - InternalLuceneService mockService; - LuceneIndexImpl mockIndex; - LuceneIndexStats mockStats; - - ArrayList<IndexRepository> repos; - LuceneFunctionContext<IndexResultCollector> searchArgs; - LuceneQueryProvider queryProvider; - Query query; - - private InternalCache mockCache; - - @Test - public void testRepoQueryAndMerge() throws Exception { - when(mockContext.getDataSet()).thenReturn(mockRegion); - when(mockContext.getArguments()).thenReturn(searchArgs); - when(mockContext.<TopEntriesCollector>getResultSender()).thenReturn(mockResultSender); - when(mockRepoManager.getRepositories(eq(mockContext))).thenReturn(repos); - doAnswer(invocation -> { - IndexResultCollector collector = invocation.getArgumentAt(2, IndexResultCollector.class); - collector.collect(r1_1.getKey(), r1_1.getScore()); - collector.collect(r1_2.getKey(), r1_2.getScore()); - collector.collect(r1_3.getKey(), r1_3.getScore()); - return null; - }).when(mockRepository1).query(eq(query), eq(LuceneQueryFactory.DEFAULT_LIMIT), - any(IndexResultCollector.class)); - - doAnswer(invocation -> { - IndexResultCollector collector = invocation.getArgumentAt(2, IndexResultCollector.class); - collector.collect(r2_1.getKey(), r2_1.getScore()); - collector.collect(r2_2.getKey(), r2_2.getScore()); - return null; - }).when(mockRepository2).query(eq(query), eq(LuceneQueryFactory.DEFAULT_LIMIT), - any(IndexResultCollector.class)); - - LuceneFunction function = new LuceneFunction(); - - function.execute(mockContext); - - ArgumentCaptor<TopEntriesCollector> resultCaptor = - ArgumentCaptor.forClass(TopEntriesCollector.class); - verify(mockResultSender).lastResult(resultCaptor.capture()); - TopEntriesCollector result = resultCaptor.getValue(); - - - List<EntryScore> hits = result.getEntries().getHits(); - assertEquals(5, hits.size()); - TopEntriesJUnitTest.verifyResultOrder(result.getEntries().getHits(), r1_1, r2_1, r1_2, r2_2, - r1_3); - } - - @Test - public void testResultLimitClause() throws Exception { - - searchArgs = - new LuceneFunctionContext<IndexResultCollector>(queryProvider, "indexName", null, 3); - when(mockContext.getDataSet()).thenReturn(mockRegion); - when(mockContext.getArguments()).thenReturn(searchArgs); - when(mockContext.<TopEntriesCollector>getResultSender()).thenReturn(mockResultSender); - when(mockRepoManager.getRepositories(eq(mockContext))).thenReturn(repos); - - doAnswer(invocation -> { - IndexResultCollector collector = invocation.getArgumentAt(2, IndexResultCollector.class); - collector.collect(r1_1.getKey(), r1_1.getScore()); - collector.collect(r1_2.getKey(), r1_2.getScore()); - collector.collect(r1_3.getKey(), r1_3.getScore()); - return null; - }).when(mockRepository1).query(eq(query), eq(3), any(IndexResultCollector.class)); - - doAnswer(invocation -> { - IndexResultCollector collector = invocation.getArgumentAt(2, IndexResultCollector.class); - collector.collect(r2_1.getKey(), r2_1.getScore()); - collector.collect(r2_2.getKey(), r2_2.getScore()); - return null; - }).when(mockRepository2).query(eq(query), eq(3), any(IndexResultCollector.class)); - - - LuceneFunction function = new LuceneFunction(); - - function.execute(mockContext); - - ArgumentCaptor<TopEntriesCollector> resultCaptor = - ArgumentCaptor.forClass(TopEntriesCollector.class); - verify(mockResultSender).lastResult(resultCaptor.capture()); - TopEntriesCollector result = resultCaptor.getValue(); - - List<EntryScore> hits = result.getEntries().getHits(); - assertEquals(3, hits.size()); - TopEntriesJUnitTest.verifyResultOrder(result.getEntries().getHits(), r1_1, r2_1, r1_2); - } - - @Test - public void injectCustomCollectorManager() throws Exception { - final CollectorManager mockManager = mock(CollectorManager.class); - searchArgs = - new LuceneFunctionContext<IndexResultCollector>(queryProvider, "indexName", mockManager); - when(mockContext.getDataSet()).thenReturn(mockRegion); - when(mockContext.getArguments()).thenReturn(searchArgs); - when(mockContext.<TopEntriesCollector>getResultSender()).thenReturn(mockResultSender); - repos.remove(0); - when(mockRepoManager.getRepositories(eq(mockContext))).thenReturn(repos); - when(mockManager.newCollector(eq("repo2"))).thenReturn(mockCollector); - when(mockManager.reduce(any(Collection.class))).thenAnswer(invocation -> { - Collection<IndexResultCollector> collectors = invocation.getArgumentAt(0, Collection.class); - assertEquals(1, collectors.size()); - assertEquals(mockCollector, collectors.iterator().next()); - return new TopEntriesCollector(null); - - }); - - doAnswer(invocation -> { - IndexResultCollector collector = invocation.getArgumentAt(2, IndexResultCollector.class); - collector.collect(r2_1.getKey(), r2_1.getScore()); - return null; - }).when(mockRepository2).query(eq(query), eq(LuceneQueryFactory.DEFAULT_LIMIT), - any(IndexResultCollector.class)); - - - LuceneFunction function = new LuceneFunction(); - - function.execute(mockContext); - - verify(mockCollector).collect(eq("key-2-1"), eq(.45f)); - verify(mockResultSender).lastResult(any(TopEntriesCollector.class)); - } - - @Test(expected = FunctionException.class) - public void testIndexRepoQueryFails() throws Exception { - when(mockContext.getDataSet()).thenReturn(mockRegion); - when(mockContext.getArguments()).thenReturn(searchArgs); - when(mockContext.<TopEntriesCollector>getResultSender()).thenReturn(mockResultSender); - when(mockRepoManager.getRepositories(eq(mockContext))).thenReturn(repos); - doThrow(IOException.class).when(mockRepository1).query(eq(query), - eq(LuceneQueryFactory.DEFAULT_LIMIT), any(IndexResultCollector.class)); - - LuceneFunction function = new LuceneFunction(); - - function.execute(mockContext); - } - - // Disabled currently as we are retrying the function if a bucket is not found - // @Test(expected = FunctionException.class) - // public void testBucketNotFound() throws Exception { - // when(mockContext.getDataSet()).thenReturn(mockRegion); - // when(mockContext.getArguments()).thenReturn(searchArgs); - // when(mockContext.<TopEntriesCollector>getResultSender()).thenReturn(mockResultSender); - // when(mockRepoManager.getRepositories(eq(mockContext))) - // .thenThrow(new BucketNotFoundException("")); - // LuceneFunction function = new LuceneFunction(); - // - // function.execute(mockContext); - // - // verify(mockResultSender).sendException(any(BucketNotFoundException.class)); - // } - - @Test(expected = FunctionException.class) - public void testReduceError() throws Exception { - final CollectorManager mockManager = mock(CollectorManager.class); - searchArgs = - new LuceneFunctionContext<IndexResultCollector>(queryProvider, "indexName", mockManager); - - when(mockContext.getDataSet()).thenReturn(mockRegion); - when(mockContext.getArguments()).thenReturn(searchArgs); - when(mockContext.<TopEntriesCollector>getResultSender()).thenReturn(mockResultSender); - repos.remove(1); - when(mockRepoManager.getRepositories(eq(mockContext))).thenReturn(repos); - when(mockManager.newCollector(eq("repo1"))).thenReturn(mockCollector); - when(mockManager.reduce(any(Collection.class))).thenThrow(IOException.class); - - LuceneFunction function = new LuceneFunction(); - - function.execute(mockContext); - } - - @Test(expected = FunctionException.class) - public void queryProviderErrorIsHandled() throws Exception { - queryProvider = mock(LuceneQueryProvider.class); - searchArgs = new LuceneFunctionContext<IndexResultCollector>(queryProvider, "indexName"); - when(mockContext.getDataSet()).thenReturn(mockRegion); - when(mockContext.getArguments()).thenReturn(searchArgs); - when(mockContext.<TopEntriesCollector>getResultSender()).thenReturn(mockResultSender); - when(queryProvider.getQuery(eq(mockIndex))).thenThrow(LuceneQueryException.class); - LuceneFunction function = new LuceneFunction(); - - function.execute(mockContext); - } - - @Test - public void testQueryFunctionId() { - String id = new LuceneFunction().getId(); - assertEquals(LuceneFunction.class.getName(), id); - } - - @Before - public void createMocksAndCommonObjects() throws Exception { - mockContext = mock(InternalRegionFunctionContext.class); - mockResultSender = mock(ResultSender.class); - mockRegion = mock(Region.class); - - mockRepoManager = mock(RepositoryManager.class); - mockRepository1 = mock(IndexRepository.class, "repo1"); - mockRepository2 = mock(IndexRepository.class, "repo2"); - mockCollector = mock(IndexResultCollector.class); - mockStats = mock(LuceneIndexStats.class); - - repos = new ArrayList<IndexRepository>(); - repos.add(mockRepository1); - repos.add(mockRepository2); - - mockIndex = mock(LuceneIndexImpl.class); - mockService = mock(InternalLuceneService.class); - mockCache = mock(InternalCache.class); - Analyzer analyzer = new StandardAnalyzer(); - Mockito.doReturn(analyzer).when(mockIndex).getAnalyzer(); - queryProvider = new StringQueryProvider("gemfire:lucene", DEFAULT_FIELD); - - searchArgs = new LuceneFunctionContext<IndexResultCollector>(queryProvider, "indexName"); - - when(mockRegion.getCache()).thenReturn(mockCache); - when(mockRegion.getFullPath()).thenReturn(regionPath); - when(mockCache.getService(any())).thenReturn(mockService); - when(mockService.getIndex(eq("indexName"), eq(regionPath))).thenReturn(mockIndex); - when(mockIndex.getRepositoryManager()).thenReturn(mockRepoManager); - when(mockIndex.getFieldNames()).thenReturn(new String[] {"gemfire"}); - when(mockIndex.getIndexStats()).thenReturn(mockStats); - - query = queryProvider.getQuery(mockIndex); - } -} http://git-wip-us.apache.org/repos/asf/geode/blob/5547c2a0/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/distributed/LuceneQueryFunctionContextJUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/distributed/LuceneQueryFunctionContextJUnitTest.java b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/distributed/LuceneQueryFunctionContextJUnitTest.java new file mode 100644 index 0000000..ed77ed7 --- /dev/null +++ b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/distributed/LuceneQueryFunctionContextJUnitTest.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. You may obtain a + * copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.apache.geode.cache.lucene.internal.distributed; + +import static org.apache.geode.cache.lucene.test.LuceneTestUtilities.DEFAULT_FIELD; +import static org.junit.Assert.*; + +import org.junit.Test; +import org.junit.experimental.categories.Category; + +import org.apache.geode.CopyHelper; +import org.apache.geode.cache.lucene.LuceneQueryFactory; +import org.apache.geode.cache.lucene.LuceneQueryProvider; +import org.apache.geode.cache.lucene.internal.LuceneServiceImpl; +import org.apache.geode.cache.lucene.internal.StringQueryProvider; +import org.apache.geode.cache.lucene.internal.repository.IndexResultCollector; +import org.apache.geode.internal.DataSerializableFixedID; +import org.apache.geode.test.junit.categories.UnitTest; + +@Category(UnitTest.class) +public class LuceneQueryFunctionContextJUnitTest { + + @Test + public void testLuceneFunctionArgsDefaults() { + LuceneFunctionContext<IndexResultCollector> context = new LuceneFunctionContext<>(); + assertEquals(LuceneQueryFactory.DEFAULT_LIMIT, context.getLimit()); + assertEquals(DataSerializableFixedID.LUCENE_FUNCTION_CONTEXT, context.getDSFID()); + } + + @Test + public void testSerialization() { + LuceneServiceImpl.registerDataSerializables(); + + LuceneQueryProvider provider = new StringQueryProvider("text", DEFAULT_FIELD); + CollectorManager<TopEntriesCollector> manager = new TopEntriesCollectorManager("test"); + LuceneFunctionContext<TopEntriesCollector> context = + new LuceneFunctionContext<>(provider, "testIndex", manager, 123); + + LuceneFunctionContext<TopEntriesCollector> copy = CopyHelper.deepCopy(context); + assertEquals(123, copy.getLimit()); + assertNotNull(copy.getQueryProvider()); + assertEquals("text", ((StringQueryProvider) copy.getQueryProvider()).getQueryString()); + assertEquals(TopEntriesCollectorManager.class, copy.getCollectorManager().getClass()); + assertEquals("test", ((TopEntriesCollectorManager) copy.getCollectorManager()).getId()); + assertEquals("testIndex", copy.getIndexName()); + } +} http://git-wip-us.apache.org/repos/asf/geode/blob/5547c2a0/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/distributed/LuceneQueryFunctionJUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/distributed/LuceneQueryFunctionJUnitTest.java b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/distributed/LuceneQueryFunctionJUnitTest.java new file mode 100644 index 0000000..0d06cab --- /dev/null +++ b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/distributed/LuceneQueryFunctionJUnitTest.java @@ -0,0 +1,299 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. You may obtain a + * copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ + +package org.apache.geode.cache.lucene.internal.distributed; + +import static org.apache.geode.cache.lucene.test.LuceneTestUtilities.DEFAULT_FIELD; +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.apache.geode.cache.Region; +import org.apache.geode.cache.execute.FunctionException; +import org.apache.geode.cache.execute.ResultSender; +import org.apache.geode.cache.lucene.LuceneQueryException; +import org.apache.geode.cache.lucene.LuceneQueryFactory; +import org.apache.geode.cache.lucene.LuceneQueryProvider; +import org.apache.geode.cache.lucene.internal.InternalLuceneService; +import org.apache.geode.cache.lucene.internal.LuceneIndexImpl; +import org.apache.geode.cache.lucene.internal.LuceneIndexStats; +import org.apache.geode.cache.lucene.internal.StringQueryProvider; +import org.apache.geode.cache.lucene.internal.repository.IndexRepository; +import org.apache.geode.cache.lucene.internal.repository.IndexResultCollector; +import org.apache.geode.cache.lucene.internal.repository.RepositoryManager; +import org.apache.geode.internal.cache.InternalCache; +import org.apache.geode.internal.cache.execute.InternalRegionFunctionContext; +import org.apache.geode.test.junit.categories.UnitTest; + +import org.apache.lucene.analysis.Analyzer; +import org.apache.lucene.analysis.standard.StandardAnalyzer; +import org.apache.lucene.search.Query; +import org.junit.Before; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.mockito.ArgumentCaptor; +import org.mockito.Mockito; + +@Category(UnitTest.class) +public class LuceneQueryFunctionJUnitTest { + + String regionPath = "/region"; + String indexName = "index"; + final EntryScore<String> r1_1 = new EntryScore<String>("key-1-1", .5f); + final EntryScore<String> r1_2 = new EntryScore<String>("key-1-2", .4f); + final EntryScore<String> r1_3 = new EntryScore<String>("key-1-3", .3f); + final EntryScore<String> r2_1 = new EntryScore<String>("key-2-1", .45f); + final EntryScore<String> r2_2 = new EntryScore<String>("key-2-2", .35f); + + InternalRegionFunctionContext mockContext; + ResultSender<TopEntriesCollector> mockResultSender; + Region<Object, Object> mockRegion; + + RepositoryManager mockRepoManager; + IndexRepository mockRepository1; + IndexRepository mockRepository2; + IndexResultCollector mockCollector; + InternalLuceneService mockService; + LuceneIndexImpl mockIndex; + LuceneIndexStats mockStats; + + ArrayList<IndexRepository> repos; + LuceneFunctionContext<IndexResultCollector> searchArgs; + LuceneQueryProvider queryProvider; + Query query; + + private InternalCache mockCache; + + @Test + public void testRepoQueryAndMerge() throws Exception { + when(mockContext.getDataSet()).thenReturn(mockRegion); + when(mockContext.getArguments()).thenReturn(searchArgs); + when(mockContext.<TopEntriesCollector>getResultSender()).thenReturn(mockResultSender); + when(mockRepoManager.getRepositories(eq(mockContext))).thenReturn(repos); + doAnswer(invocation -> { + IndexResultCollector collector = invocation.getArgumentAt(2, IndexResultCollector.class); + collector.collect(r1_1.getKey(), r1_1.getScore()); + collector.collect(r1_2.getKey(), r1_2.getScore()); + collector.collect(r1_3.getKey(), r1_3.getScore()); + return null; + }).when(mockRepository1).query(eq(query), eq(LuceneQueryFactory.DEFAULT_LIMIT), + any(IndexResultCollector.class)); + + doAnswer(invocation -> { + IndexResultCollector collector = invocation.getArgumentAt(2, IndexResultCollector.class); + collector.collect(r2_1.getKey(), r2_1.getScore()); + collector.collect(r2_2.getKey(), r2_2.getScore()); + return null; + }).when(mockRepository2).query(eq(query), eq(LuceneQueryFactory.DEFAULT_LIMIT), + any(IndexResultCollector.class)); + + LuceneQueryFunction function = new LuceneQueryFunction(); + + function.execute(mockContext); + + ArgumentCaptor<TopEntriesCollector> resultCaptor = + ArgumentCaptor.forClass(TopEntriesCollector.class); + verify(mockResultSender).lastResult(resultCaptor.capture()); + TopEntriesCollector result = resultCaptor.getValue(); + + + List<EntryScore> hits = result.getEntries().getHits(); + assertEquals(5, hits.size()); + TopEntriesJUnitTest.verifyResultOrder(result.getEntries().getHits(), r1_1, r2_1, r1_2, r2_2, + r1_3); + } + + @Test + public void testResultLimitClause() throws Exception { + + searchArgs = + new LuceneFunctionContext<IndexResultCollector>(queryProvider, "indexName", null, 3); + when(mockContext.getDataSet()).thenReturn(mockRegion); + when(mockContext.getArguments()).thenReturn(searchArgs); + when(mockContext.<TopEntriesCollector>getResultSender()).thenReturn(mockResultSender); + when(mockRepoManager.getRepositories(eq(mockContext))).thenReturn(repos); + + doAnswer(invocation -> { + IndexResultCollector collector = invocation.getArgumentAt(2, IndexResultCollector.class); + collector.collect(r1_1.getKey(), r1_1.getScore()); + collector.collect(r1_2.getKey(), r1_2.getScore()); + collector.collect(r1_3.getKey(), r1_3.getScore()); + return null; + }).when(mockRepository1).query(eq(query), eq(3), any(IndexResultCollector.class)); + + doAnswer(invocation -> { + IndexResultCollector collector = invocation.getArgumentAt(2, IndexResultCollector.class); + collector.collect(r2_1.getKey(), r2_1.getScore()); + collector.collect(r2_2.getKey(), r2_2.getScore()); + return null; + }).when(mockRepository2).query(eq(query), eq(3), any(IndexResultCollector.class)); + + + LuceneQueryFunction function = new LuceneQueryFunction(); + + function.execute(mockContext); + + ArgumentCaptor<TopEntriesCollector> resultCaptor = + ArgumentCaptor.forClass(TopEntriesCollector.class); + verify(mockResultSender).lastResult(resultCaptor.capture()); + TopEntriesCollector result = resultCaptor.getValue(); + + List<EntryScore> hits = result.getEntries().getHits(); + assertEquals(3, hits.size()); + TopEntriesJUnitTest.verifyResultOrder(result.getEntries().getHits(), r1_1, r2_1, r1_2); + } + + @Test + public void injectCustomCollectorManager() throws Exception { + final CollectorManager mockManager = mock(CollectorManager.class); + searchArgs = + new LuceneFunctionContext<IndexResultCollector>(queryProvider, "indexName", mockManager); + when(mockContext.getDataSet()).thenReturn(mockRegion); + when(mockContext.getArguments()).thenReturn(searchArgs); + when(mockContext.<TopEntriesCollector>getResultSender()).thenReturn(mockResultSender); + repos.remove(0); + when(mockRepoManager.getRepositories(eq(mockContext))).thenReturn(repos); + when(mockManager.newCollector(eq("repo2"))).thenReturn(mockCollector); + when(mockManager.reduce(any(Collection.class))).thenAnswer(invocation -> { + Collection<IndexResultCollector> collectors = invocation.getArgumentAt(0, Collection.class); + assertEquals(1, collectors.size()); + assertEquals(mockCollector, collectors.iterator().next()); + return new TopEntriesCollector(null); + + }); + + doAnswer(invocation -> { + IndexResultCollector collector = invocation.getArgumentAt(2, IndexResultCollector.class); + collector.collect(r2_1.getKey(), r2_1.getScore()); + return null; + }).when(mockRepository2).query(eq(query), eq(LuceneQueryFactory.DEFAULT_LIMIT), + any(IndexResultCollector.class)); + + + LuceneQueryFunction function = new LuceneQueryFunction(); + + function.execute(mockContext); + + verify(mockCollector).collect(eq("key-2-1"), eq(.45f)); + verify(mockResultSender).lastResult(any(TopEntriesCollector.class)); + } + + @Test(expected = FunctionException.class) + public void testIndexRepoQueryFails() throws Exception { + when(mockContext.getDataSet()).thenReturn(mockRegion); + when(mockContext.getArguments()).thenReturn(searchArgs); + when(mockContext.<TopEntriesCollector>getResultSender()).thenReturn(mockResultSender); + when(mockRepoManager.getRepositories(eq(mockContext))).thenReturn(repos); + doThrow(IOException.class).when(mockRepository1).query(eq(query), + eq(LuceneQueryFactory.DEFAULT_LIMIT), any(IndexResultCollector.class)); + + LuceneQueryFunction function = new LuceneQueryFunction(); + + function.execute(mockContext); + } + + // Disabled currently as we are retrying the function if a bucket is not found + // @Test(expected = FunctionException.class) + // public void testBucketNotFound() throws Exception { + // when(mockContext.getDataSet()).thenReturn(mockRegion); + // when(mockContext.getArguments()).thenReturn(searchArgs); + // when(mockContext.<TopEntriesCollector>getResultSender()).thenReturn(mockResultSender); + // when(mockRepoManager.getRepositories(eq(mockContext))) + // .thenThrow(new BucketNotFoundException("")); + // LuceneQueryFunction function = new LuceneQueryFunction(); + // + // function.execute(mockContext); + // + // verify(mockResultSender).sendException(any(BucketNotFoundException.class)); + // } + + @Test(expected = FunctionException.class) + public void testReduceError() throws Exception { + final CollectorManager mockManager = mock(CollectorManager.class); + searchArgs = + new LuceneFunctionContext<IndexResultCollector>(queryProvider, "indexName", mockManager); + + when(mockContext.getDataSet()).thenReturn(mockRegion); + when(mockContext.getArguments()).thenReturn(searchArgs); + when(mockContext.<TopEntriesCollector>getResultSender()).thenReturn(mockResultSender); + repos.remove(1); + when(mockRepoManager.getRepositories(eq(mockContext))).thenReturn(repos); + when(mockManager.newCollector(eq("repo1"))).thenReturn(mockCollector); + when(mockManager.reduce(any(Collection.class))).thenThrow(IOException.class); + + LuceneQueryFunction function = new LuceneQueryFunction(); + + function.execute(mockContext); + } + + @Test(expected = FunctionException.class) + public void queryProviderErrorIsHandled() throws Exception { + queryProvider = mock(LuceneQueryProvider.class); + searchArgs = new LuceneFunctionContext<IndexResultCollector>(queryProvider, "indexName"); + when(mockContext.getDataSet()).thenReturn(mockRegion); + when(mockContext.getArguments()).thenReturn(searchArgs); + when(mockContext.<TopEntriesCollector>getResultSender()).thenReturn(mockResultSender); + when(queryProvider.getQuery(eq(mockIndex))).thenThrow(LuceneQueryException.class); + LuceneQueryFunction function = new LuceneQueryFunction(); + + function.execute(mockContext); + } + + @Test + public void testQueryFunctionId() { + String id = new LuceneQueryFunction().getId(); + assertEquals(LuceneQueryFunction.class.getName(), id); + } + + @Before + public void createMocksAndCommonObjects() throws Exception { + mockContext = mock(InternalRegionFunctionContext.class); + mockResultSender = mock(ResultSender.class); + mockRegion = mock(Region.class); + + mockRepoManager = mock(RepositoryManager.class); + mockRepository1 = mock(IndexRepository.class, "repo1"); + mockRepository2 = mock(IndexRepository.class, "repo2"); + mockCollector = mock(IndexResultCollector.class); + mockStats = mock(LuceneIndexStats.class); + + repos = new ArrayList<IndexRepository>(); + repos.add(mockRepository1); + repos.add(mockRepository2); + + mockIndex = mock(LuceneIndexImpl.class); + mockService = mock(InternalLuceneService.class); + mockCache = mock(InternalCache.class); + Analyzer analyzer = new StandardAnalyzer(); + Mockito.doReturn(analyzer).when(mockIndex).getAnalyzer(); + queryProvider = new StringQueryProvider("gemfire:lucene", DEFAULT_FIELD); + + searchArgs = new LuceneFunctionContext<IndexResultCollector>(queryProvider, "indexName"); + + when(mockRegion.getCache()).thenReturn(mockCache); + when(mockRegion.getFullPath()).thenReturn(regionPath); + when(mockCache.getService(any())).thenReturn(mockService); + when(mockService.getIndex(eq("indexName"), eq(regionPath))).thenReturn(mockIndex); + when(mockIndex.getRepositoryManager()).thenReturn(mockRepoManager); + when(mockIndex.getFieldNames()).thenReturn(new String[] {"gemfire"}); + when(mockIndex.getIndexStats()).thenReturn(mockStats); + + query = queryProvider.getQuery(mockIndex); + } +}
