org.hibernate.search.spatial.impl.ConstantScoreWeight.java Source code

Java tutorial

Introduction

Here is the source code for org.hibernate.search.spatial.impl.ConstantScoreWeight.java

Source

/*
 * Hibernate Search, full-text search for your domain model
 *
 * License: GNU Lesser General Public License (LGPL), version 2.1 or later
 * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
 */
package org.hibernate.search.spatial.impl;

import java.io.IOException;
import java.util.Set;

import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.Explanation;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Scorer;
import org.apache.lucene.search.TwoPhaseIterator;
import org.apache.lucene.search.Weight;

/**
 * A copy of Lucene's ConstantScoreWeight implementation,
 * necessary because the one in Lucene is marked as "internal".
 *
 * @author Yoann Rodiere
 */
abstract class ConstantScoreWeight extends Weight {

    private float boost;
    private float queryNorm;
    private float queryWeight;

    protected ConstantScoreWeight(Query query) {
        super(query);
        normalize(1f, 1f);
    }

    @Override
    public void extractTerms(Set<Term> terms) {
        // most constant-score queries don't wrap index terms
        // eg. geo filters, doc values queries, ...
        // override if your constant-score query does wrap terms
    }

    @Override
    public final float getValueForNormalization() throws IOException {
        return queryWeight * queryWeight;
    }

    @Override
    public void normalize(float norm, float boost) {
        this.boost = boost;
        queryNorm = norm;
        queryWeight = queryNorm * boost;
    }

    protected final float score() {
        return queryWeight;
    }

    @Override
    public Explanation explain(LeafReaderContext context, int doc) throws IOException {
        final Scorer s = scorer(context);
        final boolean exists;
        if (s == null) {
            exists = false;
        } else {
            final TwoPhaseIterator twoPhase = s.twoPhaseIterator();
            if (twoPhase == null) {
                exists = s.iterator().advance(doc) == doc;
            } else {
                exists = twoPhase.approximation().advance(doc) == doc && twoPhase.matches();
            }
        }

        if (exists) {
            return Explanation.match(queryWeight, getQuery().toString() + ", product of:",
                    Explanation.match(boost, "boost"), Explanation.match(queryNorm, "queryNorm"));
        } else {
            return Explanation.noMatch(getQuery().toString() + " doesn't match id " + doc);
        }
    }
}