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;

/** A specification for a search query.
 *
 * Query objects are simple containers which contain the minimum information
 * necessary to define a search query.
 *
 * The most common way to generate Query objects is to feed a search string
 * such as 'foo AND bar' to a [QueryParser's](cfish:QueryParser)
 * [](cfish:QueryParser.Parse) method, which outputs an abstract syntax tree built up from various
 * Query subclasses such as [](cfish:ANDQuery) and
 * [](cfish:TermQuery).  However, it is also possible
 * to use custom Query objects to build a search specification which cannot be
 * easily represented using a search string.
 *
 * Subclasses of Query must implement [](cfish:.Make_Compiler), which is the first step
 * in compiling a Query down to a [](cfish:Matcher) which
 * can actually match and score documents.
 */

public class Lucy::Search::Query inherits Clownfish::Obj {

    float boost;

    /** Abstract initializer.
     *
     * @param boost A scoring multiplier, affecting the Query's relative
     * contribution to each document's score.  Typically defaults to 1.0, but
     * subclasses which do not contribute to document scores such as NOTQuery
     * and MatchAllQuery default to 0.0 instead.
     */
    public inert Query*
    init(Query *self, float boost = 1.0);

    /** Abstract factory method returning a Compiler derived from this Query.
     *
     * @param searcher A Searcher.
     * @param boost A scoring multiplier.
     * @param subordinate Indicates whether the Query is a subquery (as
     * opposed to a top-level query).  If false, the implementation must
     * invoke [](cfish:Compiler.Normalize) on the newly minted Compiler object before returning
     * it.
     */
    public abstract incremented Compiler*
    Make_Compiler(Query *self, Searcher *searcher, float boost,
                  bool subordinate = false);

    /** Set the Query's boost.
     */
    public void
    Set_Boost(Query *self, float boost);

    /** Get the Query's boost.
     */
    public float
    Get_Boost(Query *self);

    void
    Serialize(Query *self, OutStream *outstream);

    incremented Query*
    Deserialize(decremented Query *self, InStream *instream);

    public incremented Obj*
    Dump(Query *self);

    public incremented Obj*
    Load(Query *self, Obj *dump);
}