You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by ma...@apache.org on 2015/12/28 21:10:51 UTC
[04/16] lucy git commit: Tune and test Go bindings for DocReader.
Tune and test Go bindings for DocReader.
Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/c1cdb4d7
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/c1cdb4d7
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/c1cdb4d7
Branch: refs/heads/master
Commit: c1cdb4d7912d0105ad5e00491769111eb8991d0b
Parents: 38bea5a
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Tue Dec 8 19:17:24 2015 -0800
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Thu Dec 10 18:22:53 2015 -0800
----------------------------------------------------------------------
go/build.go | 6 ++++++
go/lucy/index.go | 23 +++++++++++++++++++++++
go/lucy/index_test.go | 23 +++++++++++++++++++++++
go/lucy/lucy.go | 21 ++-------------------
go/lucy/search.go | 2 +-
5 files changed, 55 insertions(+), 20 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy/blob/c1cdb4d7/go/build.go
----------------------------------------------------------------------
diff --git a/go/build.go b/go/build.go
index 2bdab37..801654a 100644
--- a/go/build.go
+++ b/go/build.go
@@ -191,6 +191,12 @@ func specClasses(parcel *cfc.Parcel) {
dataReaderBinding.SpecMethod("Close", "Close() error")
dataReaderBinding.Register()
+
+ docReaderBinding := cfc.NewGoClass(parcel, "Lucy::Index::DocReader")
+ docReaderBinding.SpecMethod("", "ReadDoc(int32, interface{}) error")
+ docReaderBinding.SpecMethod("Fetch_Doc", "FetchDoc(int32) (HitDoc, error)")
+ docReaderBinding.Register()
+
bgMergerBinding := cfc.NewGoClass(parcel, "Lucy::Index::BackgroundMerger")
bgMergerBinding.SpecMethod("Prepare_Commit", "PrepareCommit() error")
bgMergerBinding.SpecMethod("Commit", "Commit() error")
http://git-wip-us.apache.org/repos/asf/lucy/blob/c1cdb4d7/go/lucy/index.go
----------------------------------------------------------------------
diff --git a/go/lucy/index.go b/go/lucy/index.go
index defa9f2..18d5ba1 100644
--- a/go/lucy/index.go
+++ b/go/lucy/index.go
@@ -19,6 +19,7 @@ package lucy
/*
#include "Lucy/Index/Indexer.h"
#include "Lucy/Index/DataReader.h"
+#include "Lucy/Index/DocReader.h"
#include "Lucy/Index/IndexManager.h"
#include "Lucy/Index/BackgroundMerger.h"
#include "Lucy/Index/TermVector.h"
@@ -459,3 +460,25 @@ func (d *DataReaderIMP) Close() error {
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
+}
http://git-wip-us.apache.org/repos/asf/lucy/blob/c1cdb4d7/go/lucy/index_test.go
----------------------------------------------------------------------
diff --git a/go/lucy/index_test.go b/go/lucy/index_test.go
index 40609e6..8934167 100644
--- a/go/lucy/index_test.go
+++ b/go/lucy/index_test.go
@@ -750,3 +750,26 @@ func TestIndexReaderMisc(t *testing.T) {
reader := searcher.GetReader()
runDataReaderCommon(t, reader, false)
}
+
+func TestDefaultDocReaderMisc(t *testing.T) {
+ folder := createTestIndex("a", "b", "c")
+ searcher, _ := OpenIndexSearcher(folder)
+ segReaders := searcher.GetReader().SegReaders()
+ reader := segReaders[0].(SegReader).Obtain("Lucy::Index::DocReader").(DefaultDocReader)
+ doc := make(map[string]interface{})
+ if err := reader.ReadDoc(2, doc); err != nil {
+ t.Errorf("ReadDoc: %v", err)
+ }
+ runDataReaderCommon(t, reader, true)
+}
+
+func TestPolyDocReaderMisc(t *testing.T) {
+ folder := createTestIndex("a", "b", "c")
+ searcher, _ := OpenIndexSearcher(folder)
+ reader := searcher.GetReader().Obtain("Lucy::Index::DocReader").(PolyDocReader)
+ doc := make(map[string]interface{})
+ if err := reader.ReadDoc(2, doc); err != nil {
+ t.Errorf("ReadDoc: %v", err)
+ }
+ runDataReaderCommon(t, reader, true)
+}
http://git-wip-us.apache.org/repos/asf/lucy/blob/c1cdb4d7/go/lucy/lucy.go
----------------------------------------------------------------------
diff --git a/go/lucy/lucy.go b/go/lucy/lucy.go
index 03307bb..175ceee 100644
--- a/go/lucy/lucy.go
+++ b/go/lucy/lucy.go
@@ -383,20 +383,8 @@ 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)
+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, segTick)
defDocReader := (*C.lucy_DefaultDocReader)(C.CFISH_Vec_Fetch(ivars.readers, C.size_t(segTick)))
@@ -414,11 +402,6 @@ func (pdr *PolyDocReaderIMP) readDoc(docID int32, doc interface{}) error {
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
http://git-wip-us.apache.org/repos/asf/lucy/blob/c1cdb4d7/go/lucy/search.go
----------------------------------------------------------------------
diff --git a/go/lucy/search.go b/go/lucy/search.go
index e202b9d..3f7845c 100644
--- a/go/lucy/search.go
+++ b/go/lucy/search.go
@@ -88,7 +88,7 @@ func (s *SearcherIMP) ReadDoc(docID int32, doc interface{}) error {
return clownfish.NewErr("No DocReader available")
}
docReaderGo := clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(docReader)))).(DocReader)
- return fetchDocFromDocReader(docReaderGo, docID, doc)
+ return docReaderGo.ReadDoc(docID, doc)
} else {
return clownfish.NewErr("Support for ReadDoc not implemented")
}