blob: 6e8142e9668346a3919923521bb736a2ab9c576f [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.
*/
package lucy
/*
#include "Lucy/Index/Indexer.h"
#include "Lucy/Index/IndexReader.h"
#include "Lucy/Index/DataReader.h"
#include "Lucy/Index/DataWriter.h"
#include "Lucy/Index/SegWriter.h"
#include "Lucy/Index/DeletionsWriter.h"
#include "Lucy/Index/DocReader.h"
#include "Lucy/Index/LexiconReader.h"
#include "Lucy/Index/PostingListReader.h"
#include "Lucy/Index/HighlightReader.h"
#include "Lucy/Index/SortReader.h"
#include "Lucy/Index/IndexManager.h"
#include "Lucy/Index/BackgroundMerger.h"
#include "Lucy/Index/TermVector.h"
#include "Lucy/Index/Segment.h"
#include "Lucy/Index/Snapshot.h"
#include "Lucy/Index/SortCache.h"
#include "Lucy/Document/Doc.h"
#include "Lucy/Plan/Schema.h"
#include "Clownfish/Hash.h"
#include "Clownfish/String.h"
#include "Clownfish/Vector.h"
#include "Clownfish/Err.h"
*/
import "C"
import "fmt"
import "reflect"
import "strings"
import "unsafe"
import "git-wip-us.apache.org/repos/asf/lucy-clownfish.git/runtime/go/clownfish"
type IndexerIMP struct {
clownfish.ObjIMP
fieldNames map[string]string
}
type OpenIndexerArgs struct {
Schema Schema
Index interface{}
Manager IndexManager
Create bool
Truncate bool
}
func OpenIndexer(args *OpenIndexerArgs) (obj Indexer, err error) {
schema := (*C.lucy_Schema)(clownfish.UnwrapNullable(args.Schema))
manager := (*C.lucy_IndexManager)(clownfish.UnwrapNullable(args.Manager))
index := (*C.cfish_Obj)(clownfish.GoToClownfish(args.Index, unsafe.Pointer(C.CFISH_OBJ), false))
defer C.cfish_decref(unsafe.Pointer(index))
var flags int32
if args.Create {
flags = flags | int32(C.lucy_Indexer_CREATE)
}
if args.Truncate {
flags = flags | int32(C.lucy_Indexer_TRUNCATE)
}
err = clownfish.TrapErr(func() {
cfObj := C.lucy_Indexer_new(schema, index, manager, C.int32_t(flags))
obj = WRAPIndexer(unsafe.Pointer(cfObj))
})
return obj, err
}
func (obj *IndexerIMP) Close() error {
// TODO: implement Close in core Lucy rather than bindings.
return nil // TODO catch errors
}
func (obj *IndexerIMP) addDocObj(doc Doc, boost float32) error {
self := (*C.lucy_Indexer)(clownfish.Unwrap(obj, "obj"))
d := (*C.lucy_Doc)(clownfish.Unwrap(doc, "doc"))
return clownfish.TrapErr(func() {
C.LUCY_Indexer_Add_Doc(self, d, C.float(boost))
})
}
func (obj *IndexerIMP) addMapAsDoc(doc map[string]interface{}, boost float32) error {
self := (*C.lucy_Indexer)(clownfish.Unwrap(obj, "obj"))
d := C.LUCY_Indexer_Get_Stock_Doc(self)
docFields := fetchDocFields(d)
for field := range docFields {
delete(docFields, field)
}
for key, value := range doc {
field, err := obj.findRealField(key)
if err != nil {
return err
}
docFields[field] = value
}
return clownfish.TrapErr(func() {
C.LUCY_Indexer_Add_Doc(self, d, C.float(boost))
})
}
func (obj *IndexerIMP) addStructAsDoc(doc interface{}, boost float32) error {
self := (*C.lucy_Indexer)(clownfish.Unwrap(obj, "obj"))
d := C.LUCY_Indexer_Get_Stock_Doc(self)
docFields := fetchDocFields(d)
for field := range docFields {
delete(docFields, field)
}
// Get reflection value and type for the supplied struct.
var docValue reflect.Value
var success bool
if reflect.ValueOf(doc).Kind() == reflect.Ptr {
temp := reflect.ValueOf(doc).Elem()
if temp.Kind() == reflect.Struct {
docValue = temp
success = true
}
}
if !success {
mess := fmt.Sprintf("Unexpected type for doc: %t", doc)
return clownfish.NewErr(mess)
}
// Copy field values into stockDoc.
docType := docValue.Type()
for i := 0; i < docValue.NumField(); i++ {
field := docType.Field(i).Name
value := docValue.Field(i).String()
realField, err := obj.findRealField(field)
if err != nil {
return err
}
docFields[realField] = value
}
return clownfish.TrapErr(func() {
C.LUCY_Indexer_Add_Doc(self, d, C.float(boost))
})
}
func (obj *IndexerIMP) AddDoc(doc interface{}) error {
// TODO create an additional method AddDocWithBoost which allows the
// client to supply `boost`.
boost := float32(1.0)
if suppliedDoc, ok := doc.(Doc); ok {
return obj.addDocObj(suppliedDoc, boost)
} else if m, ok := doc.(map[string]interface{}); ok {
return obj.addMapAsDoc(m, boost)
} else {
return obj.addStructAsDoc(doc, boost)
}
}
func (obj *IndexerIMP) findRealField(name string) (string, error) {
self := ((*C.lucy_Indexer)(unsafe.Pointer(obj.TOPTR())))
if obj.fieldNames == nil {
obj.fieldNames = make(map[string]string)
}
if field, ok := obj.fieldNames[name]; ok {
return field, nil
} else {
schema := C.LUCY_Indexer_Get_Schema(self)
fieldList := C.LUCY_Schema_All_Fields(schema)
defer C.cfish_dec_refcount(unsafe.Pointer(fieldList))
for i := 0; i < int(C.CFISH_Vec_Get_Size(fieldList)); i++ {
cfString := unsafe.Pointer(C.CFISH_Vec_Fetch(fieldList, C.size_t(i)))
field := clownfish.CFStringToGo(cfString)
if strings.EqualFold(name, field) {
obj.fieldNames[name] = field
return field, nil
}
}
}
return "", clownfish.NewErr(fmt.Sprintf("Unknown field: '%v'", name))
}
func (obj *IndexerIMP) AddIndex(index interface{}) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_Indexer)(clownfish.Unwrap(obj, "obj"))
indexC := (*C.cfish_Obj)(clownfish.GoToClownfish(index, unsafe.Pointer(C.CFISH_OBJ), false))
defer C.cfish_decref(unsafe.Pointer(indexC))
C.LUCY_Indexer_Add_Index(self, indexC)
})
}
func (obj *IndexerIMP) DeleteByTerm(field string, term interface{}) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_Indexer)(clownfish.Unwrap(obj, "obj"))
fieldC := (*C.cfish_String)(clownfish.GoToClownfish(field, unsafe.Pointer(C.CFISH_STRING), false))
defer C.cfish_decref(unsafe.Pointer(fieldC))
termC := (*C.cfish_Obj)(clownfish.GoToClownfish(term, unsafe.Pointer(C.CFISH_OBJ), false))
defer C.cfish_decref(unsafe.Pointer(termC))
C.LUCY_Indexer_Delete_By_Term(self, fieldC, termC)
})
}
func (obj *IndexerIMP) DeleteByQuery(query Query) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_Indexer)(clownfish.Unwrap(obj, "obj"))
queryC := (*C.lucy_Query)(clownfish.Unwrap(query, "query"))
C.LUCY_Indexer_Delete_By_Query(self, queryC)
})
}
func (obj *IndexerIMP) DeleteByDocID(docID int32) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_Indexer)(clownfish.Unwrap(obj, "obj"))
C.LUCY_Indexer_Delete_By_Doc_ID(self, C.int32_t(docID))
})
}
func (obj *IndexerIMP) PrepareCommit() error {
self := ((*C.lucy_Indexer)(unsafe.Pointer(obj.TOPTR())))
return clownfish.TrapErr(func() {
C.LUCY_Indexer_Prepare_Commit(self)
})
}
func (obj *IndexerIMP) Commit() error {
self := ((*C.lucy_Indexer)(unsafe.Pointer(obj.TOPTR())))
return clownfish.TrapErr(func() {
C.LUCY_Indexer_Commit(self)
})
}
func (d *DataWriterIMP) addInvertedDoc(inverter Inverter, docId int32) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_DataWriter)(clownfish.Unwrap(d, "d"))
inverterCF := (*C.lucy_Inverter)(clownfish.Unwrap(inverter, "inverter"))
C.LUCY_DataWriter_Add_Inverted_Doc(self, inverterCF, C.int32_t(docId))
})
}
func (d *DataWriterIMP) AddSegment(reader SegReader, docMap []int32) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_DataWriter)(clownfish.Unwrap(d, "d"))
readerCF := (*C.lucy_SegReader)(clownfish.Unwrap(reader, "reader"))
docMapConv := NewI32Array(docMap)
docMapCF := (*C.lucy_I32Array)(clownfish.UnwrapNullable(docMapConv))
C.LUCY_DataWriter_Add_Segment(self, readerCF, docMapCF)
})
}
func (d *DataWriterIMP) DeleteSegment(reader SegReader) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_DataWriter)(clownfish.Unwrap(d, "d"))
readerCF := (*C.lucy_SegReader)(clownfish.Unwrap(reader, "reader"))
C.LUCY_DataWriter_Delete_Segment(self, readerCF)
})
}
func (d *DataWriterIMP) MergeSegment(reader SegReader, docMap []int32) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_DataWriter)(clownfish.Unwrap(d, "d"))
readerCF := (*C.lucy_SegReader)(clownfish.Unwrap(reader, "reader"))
docMapConv := NewI32Array(docMap)
docMapCF := (*C.lucy_I32Array)(clownfish.UnwrapNullable(docMapConv))
C.LUCY_DataWriter_Merge_Segment(self, readerCF, docMapCF)
})
}
func (d *DataWriterIMP) Finish() error {
return clownfish.TrapErr(func() {
self := (*C.lucy_DataWriter)(clownfish.Unwrap(d, "d"))
C.LUCY_DataWriter_Finish(self)
})
}
func (s *SegWriterIMP) PrepSegDir() error {
return clownfish.TrapErr(func() {
self := (*C.lucy_SegWriter)(clownfish.Unwrap(s, "s"))
C.LUCY_SegWriter_Prep_Seg_Dir(self)
})
}
func (s *SegWriterIMP) AddDoc(doc Doc, boost float32) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_SegWriter)(clownfish.Unwrap(s, "s"))
docCF := (*C.lucy_Doc)(clownfish.Unwrap(doc, "doc"))
C.LUCY_SegWriter_Add_Doc(self, docCF, C.float(boost))
})
}
func (d *DeletionsWriterIMP) DeleteByTerm(field string, term interface{}) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_DeletionsWriter)(clownfish.Unwrap(d, "d"))
fieldCF := (*C.cfish_String)(clownfish.GoToClownfish(field, unsafe.Pointer(C.CFISH_STRING), false))
defer C.cfish_decref(unsafe.Pointer(fieldCF))
termCF := (*C.cfish_Obj)(clownfish.GoToClownfish(term, unsafe.Pointer(C.CFISH_OBJ), false))
defer C.cfish_decref(unsafe.Pointer(termCF))
C.LUCY_DelWriter_Delete_By_Term(self, fieldCF, termCF)
})
}
func (d *DeletionsWriterIMP) DeleteByQuery(query Query) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_DeletionsWriter)(clownfish.Unwrap(d, "d"))
queryCF := (*C.lucy_Query)(clownfish.Unwrap(query, "query"))
C.LUCY_DelWriter_Delete_By_Query(self, queryCF)
})
}
func (d *DeletionsWriterIMP) deleteByDocID(docId int32) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_DeletionsWriter)(clownfish.Unwrap(d, "d"))
C.LUCY_DelWriter_Delete_By_Doc_ID(self, C.int32_t(docId))
})
}
func (d *DeletionsWriterIMP) generateDocMap(deletions Matcher, docMax int32, offset int32) (retval []int32, err error) {
err = clownfish.TrapErr(func() {
self := (*C.lucy_DeletionsWriter)(clownfish.Unwrap(d, "d"))
deletionsCF := (*C.lucy_Matcher)(clownfish.Unwrap(deletions, "deletions"))
retvalCF := C.LUCY_DelWriter_Generate_Doc_Map(self, deletionsCF, C.int32_t(docMax), C.int32_t(offset))
defer C.cfish_decref(unsafe.Pointer(retvalCF))
retval = i32ArrayToSlice(retvalCF)
})
return retval, err
}
func (d *DeletionsWriterIMP) segDeletions(segReader SegReader) (retval Matcher, err error) {
err = clownfish.TrapErr(func() {
self := (*C.lucy_DeletionsWriter)(clownfish.Unwrap(d, "d"))
segReaderCF := (*C.lucy_SegReader)(clownfish.Unwrap(segReader, "segReader"))
retvalCF := C.LUCY_DelWriter_Seg_Deletions(self, segReaderCF)
if retvalCF != nil {
retval = clownfish.WRAPAny(unsafe.Pointer(retvalCF)).(Matcher)
}
})
return retval, err
}
func OpenBackgroundMerger(index interface{}, manager IndexManager) (bgm BackgroundMerger, err error) {
err = clownfish.TrapErr(func() {
indexC := (*C.cfish_Obj)(clownfish.GoToClownfish(index, unsafe.Pointer(C.CFISH_OBJ), false))
defer C.cfish_decref(unsafe.Pointer(indexC))
managerC := (*C.lucy_IndexManager)(clownfish.UnwrapNullable(manager))
cfObj := C.lucy_BGMerger_new(indexC, managerC)
bgm = WRAPBackgroundMerger(unsafe.Pointer(cfObj))
})
return bgm, err
}
func (bgm *BackgroundMergerIMP) PrepareCommit() error {
return clownfish.TrapErr(func() {
self := (*C.lucy_BackgroundMerger)(clownfish.Unwrap(bgm, "bgm"))
C.LUCY_BGMerger_Prepare_Commit(self)
})
}
func (bgm *BackgroundMergerIMP) Commit() error {
return clownfish.TrapErr(func() {
self := (*C.lucy_BackgroundMerger)(clownfish.Unwrap(bgm, "bgm"))
C.LUCY_BGMerger_Commit(self)
})
}
func (im *IndexManagerIMP) WriteMergeData(cutoff int64) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_IndexManager)(clownfish.Unwrap(im, "im"))
C.LUCY_IxManager_Write_Merge_Data(self, C.int64_t(cutoff))
})
}
func (im *IndexManagerIMP) ReadMergeData() (retval map[string]interface{}, err error) {
err = clownfish.TrapErr(func() {
self := (*C.lucy_IndexManager)(clownfish.Unwrap(im, "im"))
retvalC := C.LUCY_IxManager_Read_Merge_Data(self)
if retvalC != nil {
defer C.cfish_decref(unsafe.Pointer(retvalC))
retval = clownfish.ToGo(unsafe.Pointer(retvalC)).(map[string]interface{})
}
})
return retval, err
}
func (im *IndexManagerIMP) RemoveMergeData() error {
return clownfish.TrapErr(func() {
self := (*C.lucy_IndexManager)(clownfish.Unwrap(im, "im"))
C.LUCY_IxManager_Remove_Merge_Data(self)
})
}
func (im *IndexManagerIMP) Recycle(reader PolyReader, delWriter DeletionsWriter,
cutoff int64, optimize bool) (retval []SegReader, err error) {
err = clownfish.TrapErr(func() {
self := (*C.lucy_IndexManager)(clownfish.Unwrap(im, "im"))
readerC := (*C.lucy_PolyReader)(clownfish.Unwrap(reader, "reader"))
delWriterC := (*C.lucy_DeletionsWriter)(clownfish.Unwrap(delWriter, "delWriter"))
vec := C.LUCY_IxManager_Recycle(self, readerC, delWriterC,
C.int64_t(cutoff), C.bool(optimize))
if vec != nil {
defer C.cfish_decref(unsafe.Pointer(vec))
size := int(C.CFISH_Vec_Get_Size(vec))
retval = make([]SegReader, size)
for i := 0; i < size; i++ {
elem := C.CFISH_Vec_Fetch(vec, C.size_t(i))
retval[i] = WRAPSegReader(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(elem))))
}
}
})
return retval, err
}
func NewTermVector(field, text string, positions, startOffsets, endOffsets []int32) TermVector {
fieldC := (*C.cfish_String)(clownfish.GoToClownfish(field, unsafe.Pointer(C.CFISH_STRING), false))
textC := (*C.cfish_String)(clownfish.GoToClownfish(text, unsafe.Pointer(C.CFISH_STRING), false))
defer C.cfish_decref(unsafe.Pointer(fieldC))
defer C.cfish_decref(unsafe.Pointer(textC))
posits := NewI32Array(positions)
starts := NewI32Array(startOffsets)
ends := NewI32Array(endOffsets)
positsC := (*C.lucy_I32Array)(clownfish.Unwrap(posits, "posits"))
startsC := (*C.lucy_I32Array)(clownfish.Unwrap(starts, "starts"))
endsC := (*C.lucy_I32Array)(clownfish.Unwrap(ends, "ends"))
retvalC := C.lucy_TV_new(fieldC, textC, positsC, startsC, endsC)
return WRAPTermVector(unsafe.Pointer(retvalC))
}
func (tv *TermVectorIMP) GetPositions() []int32 {
self := (*C.lucy_TermVector)(clownfish.Unwrap(tv, "tv"))
return i32ArrayToSlice(C.LUCY_TV_Get_Positions(self))
}
func (tv *TermVectorIMP) GetStartOffsets() []int32 {
self := (*C.lucy_TermVector)(clownfish.Unwrap(tv, "tv"))
return i32ArrayToSlice(C.LUCY_TV_Get_Start_Offsets(self))
}
func (tv *TermVectorIMP) GetEndOffsets() []int32 {
self := (*C.lucy_TermVector)(clownfish.Unwrap(tv, "tv"))
return i32ArrayToSlice(C.LUCY_TV_Get_End_Offsets(self))
}
func (s *SnapshotIMP) List() []string {
self := (*C.lucy_Snapshot)(clownfish.Unwrap(s, "s"))
retvalC := C.LUCY_Snapshot_List(self)
defer C.cfish_decref(unsafe.Pointer(retvalC))
return vecToStringSlice(retvalC)
}
func (s *SnapshotIMP) ReadFile(folder Folder, path string) (Snapshot, error) {
err := clownfish.TrapErr(func() {
self := (*C.lucy_Snapshot)(clownfish.Unwrap(s, "s"))
folderC := (*C.lucy_Folder)(clownfish.Unwrap(folder, "folder"))
pathC := (*C.cfish_String)(clownfish.GoToClownfish(path, unsafe.Pointer(C.CFISH_STRING), false))
defer C.cfish_decref(unsafe.Pointer(pathC))
C.LUCY_Snapshot_Read_File(self, folderC, pathC)
})
return s, err
}
func (s *SnapshotIMP) WriteFile(folder Folder, path string) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_Snapshot)(clownfish.Unwrap(s, "s"))
folderC := (*C.lucy_Folder)(clownfish.Unwrap(folder, "folder"))
pathC := (*C.cfish_String)(clownfish.GoToClownfish(path, unsafe.Pointer(C.CFISH_STRING), false))
defer C.cfish_decref(unsafe.Pointer(pathC))
C.LUCY_Snapshot_Write_File(self, folderC, pathC)
})
}
func (s *SegmentIMP) WriteFile(folder Folder) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_Segment)(clownfish.Unwrap(s, "s"))
folderC := (*C.lucy_Folder)(clownfish.Unwrap(folder, "folder"))
C.LUCY_Seg_Write_File(self, folderC)
})
}
func (s *SegmentIMP) ReadFile(folder Folder) error {
return clownfish.TrapErr(func() {
self := (*C.lucy_Segment)(clownfish.Unwrap(s, "s"))
folderC := (*C.lucy_Folder)(clownfish.Unwrap(folder, "folder"))
C.LUCY_Seg_Read_File(self, folderC)
})
}
func (s *SortCacheIMP) Value(ord int32) (retval interface{}, err error) {
err = clownfish.TrapErr(func() {
self := (*C.lucy_SortCache)(clownfish.Unwrap(s, "s"))
retvalCF := C.LUCY_SortCache_Value(self, C.int32_t(ord))
defer C.cfish_decref(unsafe.Pointer(retvalCF))
retval = clownfish.ToGo(unsafe.Pointer(retvalCF))
})
return retval, err
}
func (s *SortCacheIMP) Ordinal(docId int32) (retval int32, err error) {
err = clownfish.TrapErr(func() {
self := (*C.lucy_SortCache)(clownfish.Unwrap(s, "s"))
retvalCF := C.LUCY_SortCache_Ordinal(self, C.int32_t(docId))
retval = int32(retvalCF)
})
return retval, err
}
func (s *SortCacheIMP) Find(term interface{}) (retval int32, err error) {
err = clownfish.TrapErr(func() {
self := (*C.lucy_SortCache)(clownfish.Unwrap(s, "s"))
termCF := (*C.cfish_Obj)(clownfish.GoToClownfish(term, unsafe.Pointer(C.CFISH_OBJ), true))
defer C.cfish_decref(unsafe.Pointer(termCF))
retvalCF := C.LUCY_SortCache_Find(self, termCF)
retval = int32(retvalCF)
})
return retval, err
}
func (d *DataReaderIMP) Aggregator(readers []DataReader, offsets []int32) (retval DataReader, err error) {
err = clownfish.TrapErr(func() {
self := (*C.lucy_DataReader)(clownfish.Unwrap(d, "d"))
size := len(readers)
readersC := C.cfish_Vec_new(C.size_t(size))
defer C.cfish_decref(unsafe.Pointer(readersC))
for i := 0; i < size; i++ {
elemC := clownfish.Unwrap(readers[i], "readers[i]")
C.CFISH_Vec_Push(readersC, C.cfish_incref(elemC))
}
offs := NewI32Array(offsets)
offsetsC := (*C.lucy_I32Array)(clownfish.Unwrap(offs, "offs"))
retvalCF := C.LUCY_DataReader_Aggregator(self, readersC, offsetsC)
defer C.cfish_decref(unsafe.Pointer(retvalCF))
if retvalCF != nil {
retval = clownfish.ToGo(unsafe.Pointer(retvalCF)).(DataReader)
}
})
return retval, err
}
func (d *DataReaderIMP) GetSegments() []Segment {
self := (*C.lucy_DataReader)(clownfish.Unwrap(d, "d"))
retvalCF := C.LUCY_DataReader_Get_Segments(self);
if retvalCF == nil {
return nil
}
size := C.CFISH_Vec_Get_Size(retvalCF)
retval := make([]Segment, int(size))
for i := 0; i < int(size); i++ {
elem := unsafe.Pointer(C.CFISH_Vec_Fetch(retvalCF, C.size_t(i)))
retval[i] = clownfish.ToGo(unsafe.Pointer(C.cfish_incref(elem))).(Segment)
}
return retval
}
func (d *DataReaderIMP) Close() error {
return clownfish.TrapErr(func() {
self := (*C.lucy_DataReader)(clownfish.Unwrap(d, "d"))
C.LUCY_DataReader_Close(self)
})
}
func (d *DocReaderIMP) ReadDoc(docID int32, doc interface{}) error {
self := (*C.lucy_DocReader)(clownfish.Unwrap(d, "d"))
class := clownfish.GetClass(d)
classC := ((*C.cfish_Class)(clownfish.Unwrap(class, "class")))
if classC == C.LUCY_DEFAULTDOCREADER {
return doReadDocData((*C.lucy_DefaultDocReader)(self), docID, doc)
} else if classC == C.LUCY_POLYDOCREADER {
return readDocPolyDR((*C.lucy_PolyDocReader)(self), docID, doc)
} else {
panic(clownfish.NewErr(fmt.Sprintf("Unexpected type: %s", class.GetName)))
}
}
func (d *DocReaderIMP) FetchDoc(docID int32) (doc HitDoc, err error) {
err = clownfish.TrapErr(func() {
self := (*C.lucy_DocReader)(clownfish.Unwrap(d, "d"))
docC := C.LUCY_DocReader_Fetch_Doc(self, C.int32_t(docID))
doc = WRAPHitDoc(unsafe.Pointer(docC))
})
return doc, err
}
func (lr *LexiconReaderIMP) Lexicon(field string, term interface{}) (retval Lexicon, err error) {
err = clownfish.TrapErr(func() {
self := (*C.lucy_LexiconReader)(clownfish.Unwrap(lr, "lr"))
fieldC := (*C.cfish_String)(clownfish.GoToClownfish(field, unsafe.Pointer(C.CFISH_STRING), false))
defer C.cfish_decref(unsafe.Pointer(fieldC))
termC := (*C.cfish_Obj)(clownfish.GoToClownfish(term, unsafe.Pointer(C.CFISH_OBJ), true))
defer C.cfish_decref(unsafe.Pointer(termC))
retvalCF := C.LUCY_LexReader_Lexicon(self, fieldC, termC)
if retvalCF != nil {
retval = clownfish.ToGo(unsafe.Pointer(retvalCF)).(Lexicon)
}
})
return retval, err
}
func (lr *LexiconReaderIMP) DocFreq(field string, term interface{}) (retval uint32, err error) {
err = clownfish.TrapErr(func() {
self := (*C.lucy_LexiconReader)(clownfish.Unwrap(lr, "lr"))
fieldC := (*C.cfish_String)(clownfish.GoToClownfish(field, unsafe.Pointer(C.CFISH_STRING), false))
defer C.cfish_decref(unsafe.Pointer(fieldC))
termC := (*C.cfish_Obj)(clownfish.GoToClownfish(term, unsafe.Pointer(C.CFISH_OBJ), true))
defer C.cfish_decref(unsafe.Pointer(termC))
retval = uint32(C.LUCY_LexReader_Doc_Freq(self, fieldC, termC))
})
return retval, err
}
func (lr *LexiconReaderIMP) fetchTermInfo(field string, term interface{}) (retval TermInfo, err error) {
err = clownfish.TrapErr(func() {
self := (*C.lucy_LexiconReader)(clownfish.Unwrap(lr, "lr"))
fieldC := (*C.cfish_String)(clownfish.GoToClownfish(field, unsafe.Pointer(C.CFISH_STRING), false))
defer C.cfish_decref(unsafe.Pointer(fieldC))
termC := (*C.cfish_Obj)(clownfish.GoToClownfish(term, unsafe.Pointer(C.CFISH_OBJ), true))
defer C.cfish_decref(unsafe.Pointer(termC))
retvalCF := C.LUCY_LexReader_Fetch_Term_Info(self, fieldC, termC)
if retvalCF != nil {
retval = clownfish.ToGo(unsafe.Pointer(retvalCF)).(TermInfo)
}
})
return retval, err
}
func (p *PostingListReaderIMP) PostingList(field string, term interface{}) (retval PostingList, err error) {
err = clownfish.TrapErr(func() {
self := (*C.lucy_PostingListReader)(clownfish.Unwrap(p, "p"))
fieldC := (*C.cfish_String)(clownfish.GoToClownfish(field, unsafe.Pointer(C.CFISH_STRING), false))
defer C.cfish_decref(unsafe.Pointer(fieldC))
termC := (*C.cfish_Obj)(clownfish.GoToClownfish(term, unsafe.Pointer(C.CFISH_OBJ), true))
defer C.cfish_decref(unsafe.Pointer(termC))
retvalCF := C.LUCY_PListReader_Posting_List(self, fieldC, termC)
if retvalCF != nil {
retval = clownfish.ToGo(unsafe.Pointer(retvalCF)).(PostingList)
}
})
return retval, err
}
func (h *HighlightReaderIMP) FetchDocVec(docID int32) (retval DocVector, err error) {
err = clownfish.TrapErr(func() {
self := (*C.lucy_HighlightReader)(clownfish.Unwrap(h, "h"))
retvalCF := C.LUCY_HLReader_Fetch_Doc_Vec(self, C.int32_t(docID))
retval = WRAPDocVector(unsafe.Pointer(retvalCF))
})
return retval, err
}
func (s *SortReaderIMP) fetchSortCache(field string) (retval SortCache, err error) {
err = clownfish.TrapErr(func() {
self := (*C.lucy_SortReader)(clownfish.Unwrap(s, "s"))
fieldC := (*C.cfish_String)(clownfish.GoToClownfish(field, unsafe.Pointer(C.CFISH_STRING), false))
defer C.cfish_decref(unsafe.Pointer(fieldC))
retvalCF := C.LUCY_SortReader_Fetch_Sort_Cache(self, fieldC)
if retvalCF != nil {
retval = clownfish.ToGo(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(retvalCF)))).(SortCache)
}
})
return retval, err
}
func OpenIndexReader(index interface{}, snapshot Snapshot, manager IndexManager) (retval IndexReader, err error) {
err = clownfish.TrapErr(func() {
indexC := (*C.cfish_Obj)(clownfish.GoToClownfish(index, unsafe.Pointer(C.CFISH_OBJ), false))
defer C.cfish_decref(unsafe.Pointer(indexC))
snapshotC := (*C.lucy_Snapshot)(clownfish.UnwrapNullable(snapshot))
managerC := (*C.lucy_IndexManager)(clownfish.UnwrapNullable(manager))
cfObj := C.lucy_IxReader_open(indexC, snapshotC, managerC)
retval = clownfish.WRAPAny(unsafe.Pointer(cfObj)).(IndexReader)
})
return retval, err
}
func (r *IndexReaderIMP) SegReaders() []SegReader {
self := (*C.lucy_IndexReader)(clownfish.Unwrap(r, "r"))
retvalCF := C.LUCY_IxReader_Seg_Readers(self);
defer C.cfish_decref(unsafe.Pointer(retvalCF))
if retvalCF == nil {
return nil
}
size := C.CFISH_Vec_Get_Size(retvalCF)
retval := make([]SegReader, int(size))
for i := 0; i < int(size); i++ {
elem := unsafe.Pointer(C.CFISH_Vec_Fetch(retvalCF, C.size_t(i)))
retval[i] = clownfish.ToGo(unsafe.Pointer(C.cfish_incref(elem))).(SegReader)
}
return retval
}
func (r *IndexReaderIMP) Offsets() []int32 {
self := (*C.lucy_IndexReader)(clownfish.Unwrap(r, "r"))
retvalCF := C.LUCY_IxReader_Offsets(self)
defer C.cfish_decref(unsafe.Pointer(retvalCF))
return i32ArrayToSlice(retvalCF)
}
func (r *IndexReaderIMP) Obtain(api string) (retval DataReader, err error) {
err = clownfish.TrapErr(func() {
self := (*C.lucy_IndexReader)(clownfish.Unwrap(r, "r"))
apiC := (*C.cfish_String)(clownfish.GoToClownfish(api, unsafe.Pointer(C.CFISH_STRING), false))
defer C.cfish_decref(unsafe.Pointer(apiC))
retvalCF := C.LUCY_IxReader_Obtain(self, apiC)
retval = clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(retvalCF)))).(DataReader)
})
return retval, err
}