/*
* 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;
using Lucene.Net.Support;
using IndexReader = Lucene.Net.Index.IndexReader;
namespace Lucene.Net.Util
{
///
/// Common util methods for dealing with s.
///
public class ReaderUtil
{
/// Gathers sub-readers from reader into a List.
///
///
public static void GatherSubReaders(System.Collections.Generic.IList allSubReaders, IndexReader reader)
{
IndexReader[] subReaders = reader.GetSequentialSubReaders();
if (subReaders == null)
{
// Add the reader itself, and do not recurse
allSubReaders.Add(reader);
}
else
{
for (int i = 0; i < subReaders.Length; i++)
{
GatherSubReaders(allSubReaders, subReaders[i]);
}
}
}
/// Returns sub IndexReader that contains the given document id.
///
///
/// id of document
///
/// parent reader
///
/// sub reader of parent which contains the specified doc id
///
public static IndexReader SubReader(int doc, IndexReader reader)
{
var subReadersList = new System.Collections.Generic.List();
ReaderUtil.GatherSubReaders(subReadersList, reader);
IndexReader[] subReaders = subReadersList.ToArray();
int[] docStarts = new int[subReaders.Length];
int maxDoc = 0;
for (int i = 0; i < subReaders.Length; i++)
{
docStarts[i] = maxDoc;
maxDoc += subReaders[i].MaxDoc;
}
return subReaders[ReaderUtil.SubIndex(doc, docStarts)];
}
/// Returns sub-reader subIndex from reader.
///
///
/// parent reader
///
/// index of desired sub reader
///
/// the subreader at subINdex
///
public static IndexReader SubReader(IndexReader reader, int subIndex)
{
var subReadersList = new System.Collections.Generic.List();
ReaderUtil.GatherSubReaders(subReadersList, reader);
IndexReader[] subReaders = subReadersList.ToArray();
return subReaders[subIndex];
}
/// Returns index of the searcher/reader for document n in the
/// array used to construct this searcher/reader.
///
public static int SubIndex(int n, int[] docStarts)
{
// find
// searcher/reader for doc n:
int size = docStarts.Length;
int lo = 0; // search starts array
int hi = size - 1; // for first element less than n, return its index
while (hi >= lo)
{
int mid = Number.URShift((lo + hi), 1);
int midValue = docStarts[mid];
if (n < midValue)
hi = mid - 1;
else if (n > midValue)
lo = mid + 1;
else
{
// found a match
while (mid + 1 < size && docStarts[mid + 1] == midValue)
{
mid++; // scan to last match
}
return mid;
}
}
return hi;
}
}
}