The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
/* 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.
 */

parcel Lucy;

/** Multi-segment implementation of IndexReader.
 *
 * PolyReader conflates index data from multiple segments.  For instance, if
 * an index contains three segments with 10 documents each, PolyReader's
 * Doc_Max() method will return 30.
 *
 * Some of PolyReader's L<DataReader|Lucy::Index::DataReader> components
 * may be less efficient or complete than the single-segment implementations
 * accessed via L<SegReader|Lucy::Index::SegReader>.
 */
public class Lucy::Index::PolyReader inherits Lucy::Index::IndexReader {

    VArray   *sub_readers;
    int32_t   doc_max;
    int32_t   del_count;
    I32Array *offsets;

    public inert incremented nullable PolyReader*
    open(Obj *index, Snapshot *snapshot = NULL, IndexManager *manager = NULL);

    /**
     * @param index Either a string filepath or a L<Lucy::Folder>.
     * @param snapshot A Snapshot.  If not supplied, the most recent snapshot
     * file will be used.
     * @param manager An L<IndexManager|Lucy::Index::IndexManager>.
     * Read-locking is off by default; supplying this argument turns it on.
     */
    public inert nullable PolyReader*
    do_open(PolyReader *self, Obj *index, Snapshot *snapshot = NULL,
            IndexManager *manager = NULL);

    public inert incremented PolyReader*
    new(Schema *schema = NULL, Folder *folder, Snapshot *snapshot = NULL,
        IndexManager *manager = NULL, VArray *sub_readers = NULL);

    public inert PolyReader*
    init(PolyReader *self, Schema *schema = NULL, Folder *folder,
         Snapshot *snapshot = NULL, IndexManager *manager = NULL,
         VArray *sub_readers = NULL);

    inert String  *race_condition_debug1;
    inert int32_t  debug1_num_passes;

    /** Determine which sub-reader a document id belongs to.
     */
    inert uint32_t
    sub_tick(I32Array *offsets, int32_t doc_id);

    public int32_t
    Doc_Max(PolyReader *self);

    public int32_t
    Doc_Count(PolyReader *self);

    public int32_t
    Del_Count(PolyReader *self);

    public incremented I32Array*
    Offsets(PolyReader *self);

    public incremented VArray*
    Seg_Readers(PolyReader *self);

    VArray*
    Get_Seg_Readers(PolyReader *self);

    public void
    Close(PolyReader *self);

    public void
    Destroy(PolyReader *self);
}