Tune and test Go bindings for DataReader.
Project: http://git-wip-us.apache.org/repos/asf/lucy/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/38bea5a6 Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/38bea5a6 Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/38bea5a6 Branch: refs/heads/master Commit: 38bea5a604fd4d190bb49719f50d05e1a1c58de5 Parents: d262be9 Author: Marvin Humphrey <[email protected]> Authored: Tue Dec 8 18:32:52 2015 -0800 Committer: Marvin Humphrey <[email protected]> Committed: Thu Dec 10 18:22:53 2015 -0800 ---------------------------------------------------------------------- go/build.go | 6 ++++++ go/lucy/index.go | 44 ++++++++++++++++++++++++++++++++++++++++++++ go/lucy/index_test.go | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy/blob/38bea5a6/go/build.go ---------------------------------------------------------------------- diff --git a/go/build.go b/go/build.go index 692702d..2bdab37 100644 --- a/go/build.go +++ b/go/build.go @@ -185,6 +185,12 @@ func specClasses(parcel *cfc.Parcel) { indexerBinding.SetSuppressStruct(true) indexerBinding.Register() + dataReaderBinding := cfc.NewGoClass(parcel, "Lucy::Index::DataReader") + dataReaderBinding.SpecMethod("Aggregator", "Aggregator([]DataReader, []int32) (DataReader, error)") + dataReaderBinding.SpecMethod("Get_Segments", "GetSegments() []Segment") + dataReaderBinding.SpecMethod("Close", "Close() error") + dataReaderBinding.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/38bea5a6/go/lucy/index.go ---------------------------------------------------------------------- diff --git a/go/lucy/index.go b/go/lucy/index.go index 230e050..defa9f2 100644 --- a/go/lucy/index.go +++ b/go/lucy/index.go @@ -18,6 +18,7 @@ package lucy /* #include "Lucy/Index/Indexer.h" +#include "Lucy/Index/DataReader.h" #include "Lucy/Index/IndexManager.h" #include "Lucy/Index/BackgroundMerger.h" #include "Lucy/Index/TermVector.h" @@ -415,3 +416,46 @@ func (s *SortCacheIMP) Find(term interface{}) (retval int32, err error) { }) return retval, err } + +func (d *DataReaderIMP) Aggregator(readers []DataReader, offsets []int32) (retval DataReader, err error) { + err = clownfish.TrapErr(func() { + self := (*C.lucy_DataReader)(clownfish.Unwrap(d, "d")) + size := len(readers) + readersC := C.cfish_Vec_new(C.size_t(size)) + defer C.cfish_decref(unsafe.Pointer(readersC)) + for i := 0; i < size; i++ { + elemC := clownfish.Unwrap(readers[i], "readers[i]") + C.CFISH_Vec_Push(readersC, C.cfish_incref(elemC)) + } + offs := NewI32Array(offsets) + offsetsC := (*C.lucy_I32Array)(clownfish.Unwrap(offs, "offs")) + retvalCF := C.LUCY_DataReader_Aggregator(self, readersC, offsetsC) + defer C.cfish_decref(unsafe.Pointer(retvalCF)) + if retvalCF != nil { + retval = clownfish.ToGo(unsafe.Pointer(retvalCF)).(DataReader) + } + }) + return retval, err +} + +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 +} + +func (d *DataReaderIMP) Close() error { + return clownfish.TrapErr(func() { + self := (*C.lucy_DataReader)(clownfish.Unwrap(d, "d")) + C.LUCY_DataReader_Close(self) + }) +} http://git-wip-us.apache.org/repos/asf/lucy/blob/38bea5a6/go/lucy/index_test.go ---------------------------------------------------------------------- diff --git a/go/lucy/index_test.go b/go/lucy/index_test.go index 88e8924..40609e6 100644 --- a/go/lucy/index_test.go +++ b/go/lucy/index_test.go @@ -712,3 +712,41 @@ func TestPostingBasics(t *testing.T) { t.Errorf("getFreq: %d", got) } } + +// This function runs Close(), so the reader becomes unusable afterwards. +func runDataReaderCommon(t *testing.T, reader DataReader, runAggregator bool) { + if runAggregator { + got, err := reader.Aggregator([]DataReader{}, []int32{}) + if got == nil || err != nil { + t.Errorf("Aggregator: %#v, %v", got, err) + } + } + if got := reader.GetSchema(); false { + t.Errorf("GetSchema: %v", got) + } + if got := reader.GetFolder(); false { + t.Errorf("GetFolder: %v", got) + } + if got := reader.GetSnapshot(); false { + t.Errorf("GetSnapshot: %v", got) + } + if got := reader.GetSegments(); false { + t.Errorf("GetSegments: %#v", got) + } + if got := reader.GetSegment(); false { + t.Errorf("GetSegment: %#v", got) + } + if got := reader.GetSegTick(); false { + t.Errorf("GetSegTick: %d", got) + } + if err := reader.Close(); err != nil { + t.Errorf("Close: %v", err) + } +} + +func TestIndexReaderMisc(t *testing.T) { + folder := createTestIndex("a", "b", "c") + searcher, _ := OpenIndexSearcher(folder) + reader := searcher.GetReader() + runDataReaderCommon(t, reader, false) +}
