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;

/** Consolidate index segments in the background.
 *
 * Adding documents to an index is usually fast, but every once in a while the
 * index must be compacted and an update takes substantially longer to
 * complete.  See L<Lucy::Docs::Cookbook::FastUpdates> for how to use
 * this class to control worst-case index update performance.
 *
 * As with L<Indexer|Lucy::Index::Indexer>, see
 * L<Lucy::Docs::FileLocking> if your index is on a shared volume.
 */
class Lucy::Index::BackgroundMerger cnick BGMerger
    inherits Lucy::Object::Obj {

    Schema            *schema;
    Folder            *folder;
    Segment           *segment;
    IndexManager      *manager;
    PolyReader        *polyreader;
    Snapshot          *snapshot;
    SegWriter         *seg_writer;
    DeletionsWriter   *del_writer;
    FilePurger        *file_purger;
    Lock              *write_lock;
    Lock              *merge_lock;
    CharBuf           *snapfile;
    Hash              *doc_maps;
    int64_t            cutoff;
    bool_t             optimize;
    bool_t             needs_commit;
    bool_t             prepared;

    public inert incremented BackgroundMerger*
    new(Obj *index, IndexManager *manager = NULL);

    /** Open a new BackgroundMerger.
     *
     * @param index Either a string filepath or a Folder.
     * @param manager An IndexManager.  If not supplied, an IndexManager with
     * a 10-second write lock timeout will be created.
     */
    public inert BackgroundMerger*
    init(BackgroundMerger *self, Obj *index, IndexManager *manager = NULL);

    /** Optimize the index for search-time performance.  This may take a
     * while, as it can involve rewriting large amounts of data.
     */
    public void
    Optimize(BackgroundMerger *self);

    /** Commit any changes made to the index.  Until this is called, none of
     * the changes made during an indexing session are permanent.
     *
     * Calls Prepare_Commit() implicitly if it has not already been called.
     */
    public void
    Commit(BackgroundMerger *self);

    /** Perform the expensive setup for Commit() in advance, so that Commit()
     * completes quickly.
     *
     * Towards the end of Prepare_Commit(), the BackgroundMerger attempts to
     * re-acquire the write lock, which is then held until Commit() finishes
     * and releases it.
     */
    public void
    Prepare_Commit(BackgroundMerger *self);

    public void
    Destroy(BackgroundMerger *self);
}