Search in sources :

Example 6 with FullTextAnd

use of org.apache.jackrabbit.oak.query.fulltext.FullTextAnd in project jackrabbit-oak by apache.

the class AggregateIndex method hasCompositeExpression.

private static boolean hasCompositeExpression(FullTextExpression ft) {
    if (ft == null) {
        return false;
    }
    final AtomicReference<Boolean> composite = new AtomicReference<Boolean>();
    composite.set(false);
    ft.accept(new FullTextVisitor() {

        @Override
        public boolean visit(FullTextContains contains) {
            return contains.getBase().accept(this);
        }

        @Override
        public boolean visit(FullTextTerm term) {
            return true;
        }

        @Override
        public boolean visit(FullTextAnd and) {
            composite.set(true);
            return true;
        }

        @Override
        public boolean visit(FullTextOr or) {
            composite.set(true);
            return true;
        }
    });
    return composite.get() && !hasNegativeContains(ft);
}
Also used : FullTextVisitor(org.apache.jackrabbit.oak.query.fulltext.FullTextVisitor) FullTextTerm(org.apache.jackrabbit.oak.query.fulltext.FullTextTerm) FullTextOr(org.apache.jackrabbit.oak.query.fulltext.FullTextOr) FullTextContains(org.apache.jackrabbit.oak.query.fulltext.FullTextContains) FullTextAnd(org.apache.jackrabbit.oak.query.fulltext.FullTextAnd) AtomicReference(java.util.concurrent.atomic.AtomicReference)

Example 7 with FullTextAnd

use of org.apache.jackrabbit.oak.query.fulltext.FullTextAnd in project jackrabbit-oak by apache.

the class LuceneIndex method getFullTextQuery.

static Query getFullTextQuery(FullTextExpression ft, final Analyzer analyzer, final IndexReader reader) {
    // a reference to the query, so it can be set in the visitor
    // (a "non-local return")
    final AtomicReference<Query> result = new AtomicReference<Query>();
    ft.accept(new FullTextVisitor() {

        @Override
        public boolean visit(FullTextContains contains) {
            return contains.getBase().accept(this);
        }

        @Override
        public boolean visit(FullTextOr or) {
            BooleanQuery q = new BooleanQuery();
            for (FullTextExpression e : or.list) {
                Query x = getFullTextQuery(e, analyzer, reader);
                q.add(x, SHOULD);
            }
            result.set(q);
            return true;
        }

        @Override
        public boolean visit(FullTextAnd and) {
            BooleanQuery q = new BooleanQuery();
            for (FullTextExpression e : and.list) {
                Query x = getFullTextQuery(e, analyzer, reader);
                /* Only unwrap the clause if MUST_NOT(x) */
                boolean hasMustNot = false;
                if (x instanceof BooleanQuery) {
                    BooleanQuery bq = (BooleanQuery) x;
                    if ((bq.getClauses().length == 1) && (bq.getClauses()[0].getOccur() == BooleanClause.Occur.MUST_NOT)) {
                        hasMustNot = true;
                        q.add(bq.getClauses()[0]);
                    }
                }
                if (!hasMustNot) {
                    q.add(x, MUST);
                }
            }
            result.set(q);
            return true;
        }

        @Override
        public boolean visit(FullTextTerm term) {
            return visitTerm(term.getPropertyName(), term.getText(), term.getBoost(), term.isNot());
        }

        private boolean visitTerm(String propertyName, String text, String boost, boolean not) {
            String p = propertyName;
            if (p != null && p.indexOf('/') >= 0) {
                p = getName(p);
            }
            Query q = tokenToQuery(text, p, analyzer, reader);
            if (q == null) {
                return false;
            }
            if (boost != null) {
                q.setBoost(Float.parseFloat(boost));
            }
            if (not) {
                BooleanQuery bq = new BooleanQuery();
                bq.add(q, MUST_NOT);
                result.set(bq);
            } else {
                result.set(q);
            }
            return true;
        }
    });
    return result.get();
}
Also used : BooleanQuery(org.apache.lucene.search.BooleanQuery) Query(org.apache.lucene.search.Query) PhraseQuery(org.apache.lucene.search.PhraseQuery) PrefixQuery(org.apache.lucene.search.PrefixQuery) MatchAllDocsQuery(org.apache.lucene.search.MatchAllDocsQuery) WildcardQuery(org.apache.lucene.search.WildcardQuery) TermQuery(org.apache.lucene.search.TermQuery) BooleanQuery(org.apache.lucene.search.BooleanQuery) TermRangeQuery(org.apache.lucene.search.TermRangeQuery) FullTextOr(org.apache.jackrabbit.oak.query.fulltext.FullTextOr) FullTextContains(org.apache.jackrabbit.oak.query.fulltext.FullTextContains) AtomicReference(java.util.concurrent.atomic.AtomicReference) FullTextVisitor(org.apache.jackrabbit.oak.query.fulltext.FullTextVisitor) FullTextTerm(org.apache.jackrabbit.oak.query.fulltext.FullTextTerm) FullTextAnd(org.apache.jackrabbit.oak.query.fulltext.FullTextAnd) FullTextExpression(org.apache.jackrabbit.oak.query.fulltext.FullTextExpression)

Aggregations

FullTextAnd (org.apache.jackrabbit.oak.query.fulltext.FullTextAnd)7 FullTextExpression (org.apache.jackrabbit.oak.query.fulltext.FullTextExpression)6 FullTextContains (org.apache.jackrabbit.oak.query.fulltext.FullTextContains)5 FullTextOr (org.apache.jackrabbit.oak.query.fulltext.FullTextOr)5 FullTextTerm (org.apache.jackrabbit.oak.query.fulltext.FullTextTerm)5 FullTextVisitor (org.apache.jackrabbit.oak.query.fulltext.FullTextVisitor)5 AtomicReference (java.util.concurrent.atomic.AtomicReference)4 NodeBuilder (org.apache.jackrabbit.oak.spi.state.NodeBuilder)2 BooleanQuery (org.apache.lucene.search.BooleanQuery)2 MatchAllDocsQuery (org.apache.lucene.search.MatchAllDocsQuery)2 PrefixQuery (org.apache.lucene.search.PrefixQuery)2 Query (org.apache.lucene.search.Query)2 TermQuery (org.apache.lucene.search.TermQuery)2 TermRangeQuery (org.apache.lucene.search.TermRangeQuery)2 WildcardQuery (org.apache.lucene.search.WildcardQuery)2 Test (org.junit.Test)2 Function (com.google.common.base.Function)1 Iterator (java.util.Iterator)1 List (java.util.List)1 PlanResult (org.apache.jackrabbit.oak.plugins.index.lucene.IndexPlanner.PlanResult)1