作者:rlugoj
项目:luc
func (h *HitsIMP) Next(hit interface{}) bool {
self := (*C.lucy_Hits)(clownfish.Unwrap(h, "h"))
ivars := C.lucy_Hits_IVARS(self)
matchDoc := (*C.lucy_MatchDoc)(unsafe.Pointer(
C.CFISH_Vec_Fetch(ivars.match_docs, C.size_t(ivars.offset))))
ivars.offset += 1
if matchDoc == nil {
// Bail if there aren't any more *captured* hits. (There may be
// more total hits.)
return false
} else {
// Lazily fetch HitDoc, set score.
searcher := clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(
unsafe.Pointer(ivars.searcher)))).(Searcher)
docID := int32(C.LUCY_MatchDoc_Get_Doc_ID(matchDoc))
err := searcher.ReadDoc(docID, hit)
if err != nil {
h.err = err
return false
}
if ss, ok := hit.(setScorer); ok {
ss.SetScore(float32(C.LUCY_MatchDoc_Get_Score(matchDoc)))
}
return true
}
}
作者:lazycrazyow
项目:luc
func fetchEntry(ivars *C.lucy_InverterIVARS, fieldGo string) *C.lucy_InverterEntry {
field := (*C.cfish_String)(clownfish.GoToClownfish(fieldGo,
unsafe.Pointer(C.CFISH_STRING), false))
defer C.cfish_decref(unsafe.Pointer(field))
schema := ivars.schema
fieldNum := C.LUCY_Seg_Field_Num(ivars.segment, field)
if fieldNum == 0 {
// This field seems not to be in the segment yet. Try to find it in
// the Schema.
if C.LUCY_Schema_Fetch_Type(schema, field) != nil {
// The field is in the Schema. Get a field num from the Segment.
fieldNum = C.LUCY_Seg_Add_Field(ivars.segment, field)
} else {
// We've truly failed to find the field. The user must
// not have spec'd it.
fieldGo := clownfish.CFStringToGo(unsafe.Pointer(field))
err := clownfish.NewErr("Unknown field name: '" + fieldGo + "'")
panic(err)
}
}
entry := C.CFISH_Vec_Fetch(ivars.entry_pool, C.size_t(fieldNum))
if entry == nil {
newEntry := C.lucy_InvEntry_new(schema, field, fieldNum)
C.CFISH_Vec_Store(ivars.entry_pool, C.size_t(fieldNum),
(*C.cfish_Obj)(unsafe.Pointer(entry)))
return newEntry
}
return (*C.lucy_InverterEntry)(unsafe.Pointer(entry))
}
作者:rlugoj
项目:luc
func (spec *SortSpecIMP) GetRules() []SortRule {
self := (*C.lucy_SortSpec)(clownfish.Unwrap(spec, "spec"))
vec := C.LUCY_SortSpec_Get_Rules(self)
length := int(C.CFISH_Vec_Get_Size(vec))
slice := make([]SortRule, length)
for i := 0; i < length; i++ {
elem := C.cfish_incref(unsafe.Pointer(C.CFISH_Vec_Fetch(vec, C.size_t(i))))
slice[i] = WRAPSortRule(unsafe.Pointer(elem))
}
return slice
}
作者:rlugoj
项目:luc
func (td *TopDocsIMP) GetMatchDocs() []MatchDoc {
self := (*C.lucy_TopDocs)(clownfish.Unwrap(td, "td"))
vec := C.LUCY_TopDocs_Get_Match_Docs(self)
length := int(C.CFISH_Vec_Get_Size(vec))
slice := make([]MatchDoc, length)
for i := 0; i < length; i++ {
elem := C.cfish_incref(unsafe.Pointer(C.CFISH_Vec_Fetch(vec, C.size_t(i))))
slice[i] = WRAPMatchDoc(unsafe.Pointer(elem))
}
return slice
}
作者:rectan
项目:lucy-clownfis
func (h *HashIMP) Keys() []string {
self := (*C.cfish_Hash)(Unwrap(h, "h"))
keysCF := C.CFISH_Hash_Keys(self)
numKeys := C.CFISH_Vec_Get_Size(keysCF)
keys := make([]string, 0, int(numKeys))
for i := C.size_t(0); i < numKeys; i++ {
keys = append(keys, CFStringToGo(unsafe.Pointer(C.CFISH_Vec_Fetch(keysCF, i))))
}
C.cfish_decref(unsafe.Pointer(keysCF))
return keys
}
作者:rlugoj
项目:luc
func (p *PolyAnalyzerIMP) GetAnalyzers() []Analyzer {
self := (*C.lucy_PolyAnalyzer)(clownfish.Unwrap(p, "p"))
retvalCF := C.LUCY_PolyAnalyzer_Get_Analyzers(self)
size := C.CFISH_Vec_Get_Size(retvalCF)
retval := make([]Analyzer, int(size))
for i := 0; i < int(size); i++ {
child := unsafe.Pointer(C.CFISH_Vec_Fetch(retvalCF, C.size_t(i)))
retval[i] = clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(child))).(Analyzer)
}
return retval
}
作者:lazycrazyow
项目:luc
// Turn a Vector of Clownfish Strings into a slice of Go string. NULL
// elements in the Vector are not allowed.
func vecToStringSlice(v *C.cfish_Vector) []string {
if v == nil {
return nil
}
length := int(C.CFISH_Vec_Get_Size(v))
slice := make([]string, length)
for i := 0; i < length; i++ {
slice[i] = clownfish.CFStringToGo(unsafe.Pointer(C.CFISH_Vec_Fetch(v, C.size_t(i))))
}
return slice
}
作者:rectan
项目:lucy-clownfis
func (c *ClassIMP) GetMethods() []Method {
self := (*C.cfish_Class)(Unwrap(c, "c"))
methsVec := C.CFISH_Class_Get_Methods(self)
size := C.CFISH_Vec_Get_Size(methsVec)
meths := make([]Method, 0, int(size))
for i := C.size_t(0); i < size; i++ {
meths = append(meths, WRAPMethod(unsafe.Pointer(C.CFISH_Vec_Fetch(methsVec, i))))
}
C.cfish_decref(unsafe.Pointer(methsVec))
return meths
}
作者:rlugoj
项目:luc
func vecToSpanSlice(v *C.cfish_Vector) []Span {
if v == nil {
return nil
}
length := int(C.CFISH_Vec_Get_Size(v))
slice := make([]Span, length)
for i := 0; i < length; i++ {
elem := C.CFISH_Vec_Fetch(v, C.size_t(i))
slice[i] = clownfish.ToGo(unsafe.Pointer(elem)).(Span)
}
return slice
}
作者:rlugoj
项目:luc
func (sc *SortCollectorIMP) PopMatchDocs() []MatchDoc {
self := (*C.lucy_SortCollector)(clownfish.Unwrap(sc, "sc"))
matchDocsC := C.LUCY_SortColl_Pop_Match_Docs(self)
defer C.cfish_decref(unsafe.Pointer(matchDocsC))
length := int(C.CFISH_Vec_Get_Size(matchDocsC))
slice := make([]MatchDoc, length)
for i := 0; i < length; i++ {
elem := C.cfish_incref(unsafe.Pointer(C.CFISH_Vec_Fetch(matchDocsC, C.size_t(i))))
slice[i] = WRAPMatchDoc(unsafe.Pointer(elem))
}
return slice
}
作者:rlugoj
项目:luc
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
}
作者:rlugoj
项目:luc
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
}
作者:apach
项目:luc
func readDocPolyDR(pdr *C.lucy_PolyDocReader, docID int32, doc interface{}) error {
ivars := C.lucy_PolyDocReader_IVARS(pdr)
segTick := C.lucy_PolyReader_sub_tick(ivars.offsets, C.int32_t(docID))
offset := C.LUCY_I32Arr_Get(ivars.offsets, C.size_t(segTick))
defDocReader := (*C.lucy_DefaultDocReader)(C.CFISH_Vec_Fetch(ivars.readers, C.size_t(segTick)))
if defDocReader == nil {
return clownfish.NewErr(fmt.Sprintf("Invalid docID: %d", docID))
}
if !C.cfish_Obj_is_a((*C.cfish_Obj)(unsafe.Pointer(defDocReader)), C.LUCY_DEFAULTDOCREADER) {
panic(clownfish.NewErr("Unexpected type")) // sanity check
}
adjustedDocID := docID - int32(offset)
err := doReadDocData(defDocReader, adjustedDocID, doc)
if docDoc, ok := doc.(Doc); ok {
docDoc.SetDocID(docID)
}
return err
}
作者:rlugoj
项目:luc
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
}
作者:rectan
项目:lucy-clownfis
func VectorToGo(ptr unsafe.Pointer) []interface{} {
vec := (*C.cfish_Vector)(ptr)
if vec == nil {
return nil
}
class := C.cfish_Obj_get_class((*C.cfish_Obj)(ptr))
if class != C.CFISH_VECTOR {
mess := "Not a Vector: " + StringToGo(unsafe.Pointer(C.CFISH_Class_Get_Name(class)))
panic(NewErr(mess))
}
size := C.CFISH_Vec_Get_Size(vec)
if size > C.size_t(maxInt) {
panic(fmt.Sprintf("Overflow: %d > %d", size, maxInt))
}
slice := make([]interface{}, int(size))
for i := 0; i < int(size); i++ {
slice[i] = ToGo(unsafe.Pointer(C.CFISH_Vec_Fetch(vec, C.size_t(i))))
}
return slice
}
作者:kida
项目:luc
func (obj *IndexerIMP) findFieldC(name string) *C.cfish_String {
self := ((*C.lucy_Indexer)(unsafe.Pointer(obj.TOPTR())))
if obj.fieldNames == nil {
obj.fieldNames = make(map[string]clownfish.String)
}
f, ok := obj.fieldNames[name]
if !ok {
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) {
C.cfish_inc_refcount(cfString)
f = clownfish.WRAPString(cfString)
obj.fieldNames[name] = f
}
}
}
return (*C.cfish_String)(unsafe.Pointer(f.TOPTR()))
}
作者:rlugoj
项目:luc
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))
}