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

Reply via email to