Example usage for org.apache.lucene.search CollectorManager reduce

List of usage examples for org.apache.lucene.search CollectorManager reduce

Introduction

In this page you can find the example usage for org.apache.lucene.search CollectorManager reduce.

Prototype

T reduce(Collection<C> collectors) throws IOException;

Source Link

Document

Reduce the results of individual collectors into a meaningful result.

Usage

From source file:com.gemstone.gemfire.cache.lucene.internal.distributed.LuceneFunction.java

License:Apache License

@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) {
        resultSender.sendException(new IllegalArgumentException("Missing search context"));
        return;/*  w ww.  j a  v  a2s.  c  om*/
    }

    LuceneQueryProvider queryProvider = searchContext.getQueryProvider();
    if (queryProvider == null) {
        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(index);
    } catch (QueryException e) {
        resultSender.sendException(e);
        return;
    }

    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<>();
    try {
        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, resultLimit, collector);
            results.add(collector);
        }
    } catch (IOException e) {
        logger.warn("", e);
        resultSender.sendException(e);
        return;
    } catch (BucketNotFoundException e) {
        logger.warn("", e);
        resultSender.sendException(e);
        return;
    }

    TopEntriesCollector mergedResult;
    try {
        mergedResult = (TopEntriesCollector) manager.reduce(results);
        resultSender.lastResult(mergedResult);
    } catch (IOException e) {
        logger.warn("", e);
        resultSender.sendException(e);
        return;
    }
}

From source file:com.lucene.MyIndexSearcher.java

License:Apache License

public <C extends Collector, T> T search(Query query, CollectorManager<C, T> collectorManager)
        throws IOException {
    final C collector = collectorManager.newCollector();
    search(query, collector);/*from   w ww.j a v a2 s .c o m*/
    List<C> co = Collections.singletonList(collector);
    T coll = collectorManager.reduce(co);
    return coll;
}

From source file:org.apache.geode.cache.lucene.internal.distributed.LuceneFunction.java

License:Apache License

@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");
    }/*from  w  w  w  . ja  va 2  s.  com*/

    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();
        try {
            Collection<IndexRepository> 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());
        }
        resultSender.lastResult(mergedResult);
    } catch (IOException | BucketNotFoundException e) {
        logger.warn("", e);
        throw new FunctionException(e);
    }
}

From source file:org.apache.geode.cache.lucene.internal.distributed.LuceneFunctionJUnitTest.java

License:Apache License

@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);/*from  www .  ja  v  a2 s. c  o  m*/
    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));
}

From source file:org.apache.geode.cache.lucene.internal.distributed.LuceneFunctionJUnitTest.java

License:Apache License

@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);/*from w w w.  j a va2 s.  c  om*/
    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);
}

From source file:org.apache.geode.cache.lucene.internal.distributed.LuceneQueryFunction.java

License:Apache License

@Override
public void execute(FunctionContext<LuceneFunctionContext> 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");
    }/*w  w w. j a va 2s .c  o m*/

    LuceneQueryProvider queryProvider = searchContext.getQueryProvider();
    if (queryProvider == null) {
        throw new IllegalArgumentException("Missing query provider");
    }

    LuceneIndexImpl index = getLuceneIndex(region, searchContext);
    if (index == null) {
        throw new LuceneIndexNotFoundException(searchContext.getIndexName(), region.getFullPath());
    }
    RepositoryManager repoManager = index.getRepositoryManager();
    LuceneIndexStats stats = index.getIndexStats();

    Query query = getQuery(queryProvider, index);

    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 | CacheClosedException | PrimaryBucketException e) {
        logger.debug("Exception during lucene query function", e);
        throw new InternalFunctionInvocationTargetException(e);
    }
}

From source file:org.apache.geode.cache.lucene.internal.distributed.LuceneQueryFunctionJUnitTest.java

License:Apache License

@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);//from   w w w .j  a  va 2s  . c o  m
    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.getArgument(0);
        assertEquals(1, collectors.size());
        assertEquals(mockCollector, collectors.iterator().next());
        return new TopEntriesCollector(null);

    });

    doAnswer(invocation -> {
        IndexResultCollector collector = invocation.getArgument(2);
        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));
}

From source file:org.apache.geode.cache.lucene.internal.distributed.LuceneQueryFunctionJUnitTest.java

License:Apache License

@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);//  ww w . j a  v  a2  s.co m
    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);
}