blob: ac07964d5706135171f6d8a7421fdac625d84fd7 [file] [log] [blame]
/* 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;
/** Invert documents.
*
* Inverter's role is to prepare the content of a Doc for addition to various
* DataWriters, by associating fields with FieldTypes, inverting their
* content when appropriate, and marshalling them into an iterable form.
*/
class Lucy::Index::Inverter inherits Lucy::Object::Obj {
Schema *schema;
Segment *segment;
Doc *doc;
VArray *entries; /* Entries for the current Doc. */
VArray *entry_pool; /* Cached entry per field. */
InverterEntry *current; /* Current entry while iterating. */
InverterEntry *blank; /* Used when iterator is exhausted. */
float boost;
int32_t tick;
bool_t sorted;
inert incremented Inverter*
new(Schema *schema, Segment *segment);
inert Inverter*
init(Inverter *self, Schema *schema, Segment *segment);
/** Invert the document, first calling Set_Doc(), then Add_Field() for
* each field in the Doc.
*/
public void
Invert_Doc(Inverter *self, Doc *doc);
/** Set the object's <code>doc</code> member. Calls Clear() as side
* effect.
*/
public void
Set_Doc(Inverter *self, Doc *doc);
/** Set the object's <code>boost</code> member.
*/
public void
Set_Boost(Inverter *self, float boost);
/** Add a field to the Inverter. If the field is indexed/analyzed, invert
* it.
*
* The InverterEntry's value should have already been set to the field's
* value when Add_Field() is called.
*/
void
Add_Field(Inverter *self, InverterEntry *entry);
/** Remove the cached Doc and everything derived from it.
*/
public void
Clear(Inverter *self);
/** Reset the iterator and prepare to cycle through any fields that have
* been added.
*
* @return the number of fields which will be iterated over.
*/
public uint32_t
Iterate(Inverter *self);
/** Proceed to the next field. Fields are iterated in order of Segment
* field number.
*/
public int32_t
Next(Inverter *self);
/** Return the current doc, or NULL if there isn't one.
*/
public nullable Doc*
Get_Doc(Inverter *self);
/** Return the current boost.
*/
public float
Get_Boost(Inverter *self);
/** Return the current field's name, or NULL if the iterator is exhausted.
*/
public nullable CharBuf*
Get_Field_Name(Inverter *self);
/** Return the current field's value, or NULL if the iterator is
* exhausted.
*/
public nullable Obj*
Get_Value(Inverter *self);
/** Return the FieldType for the current field, or NULL if the iterator is
* exhausted.
*/
public nullable FieldType*
Get_Type(Inverter *self);
/** Return the Analyzer for the current field, or NULL if the iterator is
* exhausted.
*/
public nullable Analyzer*
Get_Analyzer(Inverter *self);
/** Return the Analyzer for the current field, or NULL if the iterator is
* exhausted.
*/
public nullable Similarity*
Get_Similarity(Inverter *self);
/** Return the Inversion for the current field, provided that that field
* is indexed; return NULL if the iterator is exhausted.
*/
public nullable Inversion*
Get_Inversion(Inverter *self);
public void
Destroy(Inverter *self);
}
/** Cached information about fields.
*
* Inverter needs to check certain field characteristics frequently. Since
* field definitions are unchanging, we cache them in an InverterEntry object.
*/
private final class Lucy::Index::Inverter::InverterEntry cnick InvEntry
inherits Lucy::Object::Obj {
int32_t field_num;
CharBuf *field;
Obj *value;
Inversion *inversion;
FieldType *type;
Analyzer *analyzer;
Similarity *sim;
bool_t indexed;
bool_t highlightable;
inert incremented InverterEntry*
new(Schema *schema = NULL, const CharBuf *field_name, int32_t field_num);
inert InverterEntry*
init(InverterEntry *self = NULL, Schema *schema,
const CharBuf *field_name, int32_t field_num);
public int32_t
Compare_To(InverterEntry *self, Obj *other);
/** Expunge all transient data.
*/
void
Clear(InverterEntry *self);
public void
Destroy(InverterEntry *self);
}