Private readDoc for DocReader Go bindings. Make it possible to supply multiple types to DocReader.
Project: http://git-wip-us.apache.org/repos/asf/lucy/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/34ffe42c Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/34ffe42c Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/34ffe42c Branch: refs/heads/master Commit: 34ffe42cbc21d248508c76c3bfdd081eb48b23f9 Parents: 776c9aa Author: Marvin Humphrey <[email protected]> Authored: Fri Sep 25 19:59:06 2015 -0700 Committer: Marvin Humphrey <[email protected]> Committed: Mon Sep 28 12:54:39 2015 -0700 ---------------------------------------------------------------------- go/lucy/lucy.go | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy/blob/34ffe42c/go/lucy/lucy.go ---------------------------------------------------------------------- diff --git a/go/lucy/lucy.go b/go/lucy/lucy.go index 6a61cb1..595f777 100644 --- a/go/lucy/lucy.go +++ b/go/lucy/lucy.go @@ -25,6 +25,7 @@ package lucy #define C_LUCY_DEFAULTDOCREADER #define C_LUCY_INVERTER #define C_LUCY_INVERTERENTRY +#define C_LUCY_POLYDOCREADER #include "lucy_parcel.h" #include "Lucy/Analysis/RegexTokenizer.h" @@ -46,9 +47,12 @@ package lucy #include "Lucy/Document/HitDoc.h" #include "Lucy/Plan/FieldType.h" #include "Lucy/Plan/Schema.h" +#include "Lucy/Index/DocReader.h" +#include "Lucy/Index/PolyReader.h" #include "Lucy/Index/Segment.h" #include "Lucy/Store/InStream.h" #include "Lucy/Store/OutStream.h" +#include "Lucy/Object/I32Array.h" #include "Lucy/Util/Freezer.h" extern lucy_RegexTokenizer* @@ -377,6 +381,42 @@ func fetchEntry(ivars *C.lucy_InverterIVARS, fieldGo string) *C.lucy_InverterEnt return (*C.lucy_InverterEntry)(unsafe.Pointer(entry)) } +func fetchDocFromDocReader(dr DocReader, docID int32, doc interface{}) error { + switch v := dr.(type) { + case *DefaultDocReaderIMP: + return v.readDoc(docID, doc) + case *PolyDocReaderIMP: + return v.readDoc(docID, doc) + default: + panic(clownfish.NewErr(fmt.Sprintf("Unexpected type: %T", v))) + } +} + +func (pdr *PolyDocReaderIMP) readDoc(docID int32, doc interface{}) error { + self := (*C.lucy_PolyDocReader)(clownfish.Unwrap(pdr, "pdr")) + ivars := C.lucy_PolyDocReader_IVARS(self) + segTick := C.lucy_PolyReader_sub_tick(ivars.offsets, C.int32_t(docID)) + offset := C.LUCY_I32Arr_Get(ivars.offsets, 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 +} + +func (ddr *DefaultDocReaderIMP) readDoc(docID int32, doc interface{}) error { + self := (*C.lucy_DefaultDocReader)(clownfish.Unwrap(ddr, "ddr")) + return doReadDocData(self, docID, doc) +} + func setMapField(store interface{}, field string, val interface{}) error { m := store.(map[string]interface{}) m[field] = val
