/**
* License Agreement for OpenSearchServer
*
* Copyright (C) 2014 Emmanuel Keller / Jaeksoft
*
* http://www.open-search-server.com
*
* This file is part of OpenSearchServer.
*
* OpenSearchServer is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenSearchServer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenSearchServer.
* If not, see <http://www.gnu.org/licenses/>.
**/
package com.jaeksoft.searchlib.result.collector.docsethit;
import java.io.IOException;
import com.jaeksoft.searchlib.index.ReaderAbstract;
import com.jaeksoft.searchlib.result.collector.AbstractBaseCollector;
import com.jaeksoft.searchlib.scoring.AdvancedScore;
import com.jaeksoft.searchlib.scoring.AdvancedScoreItem;
import com.jaeksoft.searchlib.scoring.AdvancedScoreItemValue;
public class ScoreBufferAdvancedCollector extends ScoreBufferCollector {
private final ScoreBufferCollector scoreBufferCollector;
private final float scoreWeight;
private final AdvancedScoreItemValue[] scoreItemValues;
private int size;
public ScoreBufferAdvancedCollector(final ReaderAbstract reader,
final AdvancedScore advancedScore,
final DocSetHitBaseCollector base,
final ScoreBufferCollector scoreBufferCollector,
final DistanceCollector distanceCollector) throws IOException {
super(base);
this.scoreBufferCollector = scoreBufferCollector;
AdvancedScoreItem[] scoreItems = advancedScore.getArray();
scoreItemValues = new AdvancedScoreItemValue[scoreItems == null ? 0
: scoreItems.length];
int i = 0;
if (scoreItems != null)
for (AdvancedScoreItem scoreItem : scoreItems)
scoreItemValues[i++] = new AdvancedScoreItemValue(reader,
scoreItem, distanceCollector);
this.scoreWeight = (float) advancedScore.getScoreWeight();
size = 0;
}
private ScoreBufferAdvancedCollector(final DocSetHitBaseCollector base,
final ScoreBufferAdvancedCollector src) {
super(base, src);
scoreBufferCollector = src.scoreBufferCollector;
scoreWeight = src.scoreWeight;
scoreItemValues = src.scoreItemValues == null ? null
: new AdvancedScoreItemValue[src.scoreItemValues.length];
if (scoreItemValues != null)
for (int i = 0; i < scoreItemValues.length; i++)
scoreItemValues[i] = src.scoreItemValues[i];
size = src.size;
}
@Override
public ScoreBufferAdvancedCollector duplicate(
final AbstractBaseCollector<?> base) {
parent.duplicate(base);
return new ScoreBufferAdvancedCollector((DocSetHitBaseCollector) base,
this);
}
@Override
final public void collectDoc(final int doc) throws IOException {
parent.collectDoc(doc);
for (AdvancedScoreItemValue scoreItemValue : scoreItemValues)
scoreItemValue.collect(doc);
size++;
}
@Override
final public void endCollection() {
parent.endCollection();
for (AdvancedScoreItemValue scoreItemValue : scoreItemValues)
scoreItemValue.endCollection();
if (scoreWeight <= 0)
endCollectionWithoutVSMScore();
else
endCollectionWithVSMScore(scoreBufferCollector.getScores());
scores = scoreCollector.getFinalArray();
}
final private void endCollectionWithoutVSMScore() {
for (int i = 0; i < size; i++) {
float sc = 0;
for (AdvancedScoreItemValue scoreItemValue : scoreItemValues)
sc += scoreItemValue.finalArray[i];
scoreCollector.add(sc);
}
}
final private void endCollectionWithVSMScore(float[] scores) {
for (int i = 0; i < size; i++) {
float sc = scores[i] * scoreWeight;
for (AdvancedScoreItemValue scoreItemValue : scoreItemValues)
sc += scoreItemValue.finalArray[i];
scoreCollector.add(sc);
}
}
}