/* * 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 ); } } }