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) AddDoc(doc interface{}) error { self := ((*C.lucy_Indexer)(unsafe.Pointer(obj.TOPTR()))) stockDoc := C.LUCY_Indexer_Get_Stock_Doc(self) docFields := (*C.cfish_Hash)(C.LUCY_Doc_Get_Fields(stockDoc)) C.CFISH_Hash_Clear(docFields) // TODO: Support map as doc in addition to struct as doc. // Get reflection value and type for the supplied struct. var docValue reflect.Value if reflect.ValueOf(doc).Kind() == reflect.Ptr { temp := reflect.ValueOf(doc).Elem() if temp.Kind() == reflect.Struct { docValue = temp } } if docValue == (reflect.Value{}) { mess := fmt.Sprintf("Doc not struct pointer: %v", reflect.TypeOf(doc)) return clownfish.NewErr(mess) } docType := docValue.Type() for i := 0; i < docValue.NumField(); i++ { field := docType.Field(i).Name value := docValue.Field(i).String() fieldC := obj.findFieldC(field) valueC := clownfish.NewString(value) C.CFISH_Hash_Store(docFields, (*C.cfish_String)(unsafe.Pointer(fieldC)), C.cfish_inc_refcount(unsafe.Pointer(valueC.TOPTR()))) } // TODO create an additional method AddDocWithBoost which allows the // client to supply `boost`. boost := 1.0 err := clownfish.TrapErr(func() { C.LUCY_Indexer_Add_Doc(self, stockDoc, C.float(boost)) }) return err }
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)) }) }