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)

Reply via email to