public override void Collect(int parentDoc)
{
//System.out.println("\nC parentDoc=" + parentDoc);
totalHitCount++;
float score = float.NaN;
if (trackMaxScore)
{
score = scorer.Score();
maxScore = Math.Max(maxScore, score);
}
// TODO: we could sweep all joinScorers here and
// aggregate total child hit count, so we can fill this
// in getTopGroups (we wire it to 0 now)
if (queueFull)
{
//System.out.println(" queueFull");
// Fastmatch: return if this hit is not competitive
for (int i = 0; ; i++)
{
int c = reverseMul[i] * comparators[i].CompareBottom(parentDoc);
if (c < 0)
{
// Definitely not competitive.
//System.out.println(" skip");
return;
}
if (c > 0)
{
// Definitely competitive.
break;
}
if (i == compEnd)
{
// Here c=0. If we're at the last comparator, this doc is not
// competitive, since docs are visited in doc Id order, which means
// this doc cannot compete with any other document in the queue.
//System.out.println(" skip");
return;
}
}
//System.out.println(" competes! doc=" + (docBase + parentDoc));
// This hit is competitive - replace bottom element in queue & adjustTop
for (int i = 0; i < comparators.Length; i++)
{
comparators[i].Copy(bottom.Slot, parentDoc);
}
if (!trackMaxScore && trackScores)
{
score = scorer.Score();
}
bottom.Doc = docBase + parentDoc;
bottom.readerContext = currentReaderContext;
bottom.Score = score;
CopyGroups(bottom);
bottom = queue.UpdateTop();
for (int i = 0; i < comparators.Length; i++)
{
comparators[i].Bottom = bottom.Slot;
}
}
else
{
// Startup transient: queue is not yet full:
int comparatorSlot = totalHitCount - 1;
// Copy hit into queue
for (int i = 0; i < comparators.Length; i++)
{
comparators[i].Copy(comparatorSlot, parentDoc);
}
//System.out.println(" startup: new OG doc=" + (docBase+parentDoc));
if (!trackMaxScore && trackScores)
{
score = scorer.Score();
}
OneGroup og = new OneGroup(comparatorSlot, docBase + parentDoc, score, joinScorers.Length, trackScores);
og.readerContext = currentReaderContext;
CopyGroups(og);
bottom = queue.Add(og);
queueFull = totalHitCount == numParentHits;
if (queueFull)
{
// End of startup transient: queue just filled up:
for (int i = 0; i < comparators.Length; i++)
{
comparators[i].Bottom = bottom.Slot;
}
}
}
}