@Override
    public <T> List<SearchResult<T>> search(SearchRequest request, Class<T> typeFilter) {
        SearchSession<T> session = new SearchSession<>(request, Collections.singleton(typeFilter));

        if (request.inParallel()) {
            ForkJoinPool commonPool = ForkJoinPool.commonPool();
            getProviderTasks(request, session).stream().map(commonPool::submit).forEach(ForkJoinTask::join);
        } else {
            getProviderTasks(request, session).forEach(Runnable::run);
        }

        return session.getResults();
    }
@Test
    public void testFuzzyLabel() {
        GraphGenerator generator = GraphGenerator.build().generateTinyGraph();

        Node node = generator.getGraph().getNode(GraphGenerator.FIRST_NODE);
        node.setLabel("foobar");

        List<Element> r1 = toList(controller.search(buildRequest("foo", generator), Element.class));
        List<Element> r2 = toList(controller.search(buildRequest("bar", generator), Element.class));
        List<Element> r3 = toList(controller.search(buildRequest("oo", generator), Element.class));

        Assert.assertEquals(List.of(node), r1);
        Assert.assertEquals(List.of(node), r2);
        Assert.assertEquals(List.of(node), r3);
    }