/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System; namespace Lucene.Net.Search { /// A Scorer for queries with a required part and an optional part. /// Delays skipTo() on the optional part until a score() is needed. ///
/// This Scorer implements . ///
class ReqOptSumScorer:Scorer { /// The scorers passed from the constructor. /// These are set to null as soon as their next() or skipTo() returns false. /// private Scorer reqScorer; private Scorer optScorer; /// Construct a ReqOptScorer. /// The required scorer. This must match. /// /// The optional scorer. This is used for scoring only. /// public ReqOptSumScorer(Scorer reqScorer, Scorer optScorer):base(null) { // No similarity used. this.reqScorer = reqScorer; this.optScorer = optScorer; } public override int NextDoc() { return reqScorer.NextDoc(); } public override int Advance(int target) { return reqScorer.Advance(target); } public override int DocID() { return reqScorer.DocID(); } /// Returns the score of the current document matching the query. /// Initially invalid, until is called the first time. /// /// The score of the required scorer, eventually increased by the score /// of the optional scorer when it also matches the current document. /// public override float Score() { int curDoc = reqScorer.DocID(); float reqScore = reqScorer.Score(); if (optScorer == null) { return reqScore; } int optScorerDoc = optScorer.DocID(); if (optScorerDoc < curDoc && (optScorerDoc = optScorer.Advance(curDoc)) == NO_MORE_DOCS) { optScorer = null; return reqScore; } return optScorerDoc == curDoc?reqScore + optScorer.Score():reqScore; } } }