private void assertTransformed(String queryString, String expected, Query.Type mode, Language actualLanguage,
                                   Language queryLanguage, Linguistics linguistics) {
        Parser parser = ParserFactory.newInstance(mode, new ParserEnvironment()
                .setIndexFacts(indexFacts)
                .setLinguistics(linguistics));
        Item root = parser.parse(new Parsable().setQuery(queryString).setLanguage(actualLanguage)).getRoot();
        assertFalse(root instanceof NullItem);

        Query query = new Query("?language=" + queryLanguage.languageCode());
        query.getModel().getQueryTree().setRoot(root);

        new Execution(new Chain<Searcher>(new CJKSearcher()),
                      Execution.Context.createContextStub(indexFacts, linguistics)).search(query);
        assertEquals(expected, query.getModel().getQueryTree().getRoot().toString());
    }
Overlapping tokens splits some sequences of "bcd" into "bc" "cd" instead of e.g. "b",
"cd". This improves recall in some cases. Vespa
must combine overlapping tokens as PHRASE, not AND to avoid a too high recall because of the token overlap.
container-search/src/test/java/com/yahoo/prelude/querytransform/test/CJKSearcherTestCase.java