Tune and test Go bindings for LexiconReader.
Project: http://git-wip-us.apache.org/repos/asf/lucy/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/3358bc29 Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/3358bc29 Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/3358bc29 Branch: refs/heads/master Commit: 3358bc298eaaecd0e705af869d6c59f2e869dc8e Parents: db08b69 Author: Marvin Humphrey <[email protected]> Authored: Thu Dec 10 18:53:08 2015 -0800 Committer: Marvin Humphrey <[email protected]> Committed: Thu Dec 10 19:04:59 2015 -0800 ---------------------------------------------------------------------- go/build.go | 6 ++++++ go/lucy/index.go | 43 +++++++++++++++++++++++++++++++++++++++++++ go/lucy/index_test.go | 31 ++++++++++++++++++++++++++++++- 3 files changed, 79 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy/blob/3358bc29/go/build.go ---------------------------------------------------------------------- diff --git a/go/build.go b/go/build.go index 09a31e5..36b487d 100644 --- a/go/build.go +++ b/go/build.go @@ -218,6 +218,12 @@ func specClasses(parcel *cfc.Parcel) { sortReaderBinding.SpecMethod("Fetch_Sort_Cache", "fetchSortCache(string) (SortCache, error)") sortReaderBinding.Register() + lexReaderBinding := cfc.NewGoClass(parcel, "Lucy::Index::LexiconReader") + lexReaderBinding.SpecMethod("Lexicon", "Lexicon(string, interface{}) (Lexicon, error)") + lexReaderBinding.SpecMethod("Doc_Freq", "DocFreq(string, interface{}) (uint32, error)") + lexReaderBinding.SpecMethod("Fetch_Term_Info", "fetchTermInfo(string, interface{}) (TermInfo, error)") + lexReaderBinding.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/3358bc29/go/lucy/index.go ---------------------------------------------------------------------- diff --git a/go/lucy/index.go b/go/lucy/index.go index 397e860..a0e3396 100644 --- a/go/lucy/index.go +++ b/go/lucy/index.go @@ -21,6 +21,7 @@ package lucy #include "Lucy/Index/IndexReader.h" #include "Lucy/Index/DataReader.h" #include "Lucy/Index/DocReader.h" +#include "Lucy/Index/LexiconReader.h" #include "Lucy/Index/HighlightReader.h" #include "Lucy/Index/SortReader.h" #include "Lucy/Index/IndexManager.h" @@ -486,6 +487,48 @@ func (d *DocReaderIMP) FetchDoc(docID int32) (doc HitDoc, err error) { return doc, err } +func (lr *LexiconReaderIMP) Lexicon(field string, term interface{}) (retval Lexicon, err error) { + err = clownfish.TrapErr(func() { + self := (*C.lucy_LexiconReader)(clownfish.Unwrap(lr, "lr")) + fieldC := (*C.cfish_String)(clownfish.GoToClownfish(field, unsafe.Pointer(C.CFISH_STRING), false)) + defer C.cfish_decref(unsafe.Pointer(fieldC)) + termC := (*C.cfish_Obj)(clownfish.GoToClownfish(term, unsafe.Pointer(C.CFISH_OBJ), true)) + defer C.cfish_decref(unsafe.Pointer(termC)) + retvalCF := C.LUCY_LexReader_Lexicon(self, fieldC, termC) + if retvalCF != nil { + retval = clownfish.ToGo(unsafe.Pointer(retvalCF)).(Lexicon) + } + }) + return retval, err +} + +func (lr *LexiconReaderIMP) DocFreq(field string, term interface{}) (retval uint32, err error) { + err = clownfish.TrapErr(func() { + self := (*C.lucy_LexiconReader)(clownfish.Unwrap(lr, "lr")) + fieldC := (*C.cfish_String)(clownfish.GoToClownfish(field, unsafe.Pointer(C.CFISH_STRING), false)) + defer C.cfish_decref(unsafe.Pointer(fieldC)) + termC := (*C.cfish_Obj)(clownfish.GoToClownfish(term, unsafe.Pointer(C.CFISH_OBJ), true)) + defer C.cfish_decref(unsafe.Pointer(termC)) + retval = uint32(C.LUCY_LexReader_Doc_Freq(self, fieldC, termC)) + }) + return retval, err +} + +func (lr *LexiconReaderIMP) fetchTermInfo(field string, term interface{}) (retval TermInfo, err error) { + err = clownfish.TrapErr(func() { + self := (*C.lucy_LexiconReader)(clownfish.Unwrap(lr, "lr")) + fieldC := (*C.cfish_String)(clownfish.GoToClownfish(field, unsafe.Pointer(C.CFISH_STRING), false)) + defer C.cfish_decref(unsafe.Pointer(fieldC)) + termC := (*C.cfish_Obj)(clownfish.GoToClownfish(term, unsafe.Pointer(C.CFISH_OBJ), true)) + defer C.cfish_decref(unsafe.Pointer(termC)) + retvalCF := C.LUCY_LexReader_Fetch_Term_Info(self, fieldC, termC) + if retvalCF != nil { + retval = clownfish.ToGo(unsafe.Pointer(retvalCF)).(TermInfo) + } + }) + return retval, err +} + func (h *HighlightReaderIMP) FetchDocVec(docID int32) (retval DocVector, err error) { err = clownfish.TrapErr(func() { self := (*C.lucy_HighlightReader)(clownfish.Unwrap(h, "h")) http://git-wip-us.apache.org/repos/asf/lucy/blob/3358bc29/go/lucy/index_test.go ---------------------------------------------------------------------- diff --git a/go/lucy/index_test.go b/go/lucy/index_test.go index efbe0f0..18d1e22 100644 --- a/go/lucy/index_test.go +++ b/go/lucy/index_test.go @@ -649,7 +649,7 @@ func TestLexiconBasics(t *testing.T) { ixReader, _ := OpenIndexReader(folder, nil, nil) segReaders := ixReader.SegReaders() lexReader := segReaders[0].Fetch("Lucy::Index::LexiconReader").(LexiconReader) - segLex := lexReader.Lexicon("content", nil).(Lexicon) + segLex, _ := lexReader.Lexicon("content", nil) if field := segLex.getField(); field != "content" { t.Errorf("getField: %s", field) } @@ -820,6 +820,35 @@ func TestPolyDocReaderMisc(t *testing.T) { runDataReaderCommon(t, reader, true) } +func TestLexReaderMisc(t *testing.T) { + folder := createTestIndex("a", "b", "c") + ixReader, _ := OpenIndexReader(folder, nil, nil) + segReaders := ixReader.SegReaders() + lexReader := segReaders[0].Fetch("Lucy::Index::LexiconReader").(LexiconReader) + if got, err := lexReader.Lexicon("content", nil); got == nil || err != nil { + t.Errorf("Lexicon should succeed: %v", err) + } + if got, err := lexReader.Lexicon("content", "foo"); got == nil || err != nil { + t.Errorf("Lexicon with term should succeed: %v", err) + } + if got, err := lexReader.Lexicon("nope", nil); got != nil || err != nil { + t.Errorf("Lexicon for non-field should return nil: %v", err) + } + if got, err := lexReader.DocFreq("content", "b"); got != 1 || err != nil { + t.Errorf("DocFreq: %d, %v", got, err) + } + if got, err := lexReader.DocFreq("content", "nope"); got != 0 || err != nil { + t.Errorf("DocFreq should be 0: %d, %v", got, err) + } + if got, err := lexReader.fetchTermInfo("content", "a"); got == nil || err != nil { + t.Errorf("fetchTermInfo should succeed: %v", err) + } + if got, err := lexReader.fetchTermInfo("content", "nope"); got != nil || err != nil { + t.Errorf("fetchTermInfo with non-existent term should return nil: %v", err) + } + runDataReaderCommon(t, lexReader, false) +} + func TestHighlightReaderMisc(t *testing.T) { folder := createTestIndex("a", "b", "c") ixReader, _ := OpenIndexReader(folder, nil, nil)
