Tune and test TopDocs Go binding. Use slice of MatchDocs rather than Vector.
Project: http://git-wip-us.apache.org/repos/asf/lucy/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/d0388c8c Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/d0388c8c Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/d0388c8c Branch: refs/heads/master Commit: d0388c8c705dba826ab828c35d0690498da30dd1 Parents: b8b4b8e Author: Marvin Humphrey <[email protected]> Authored: Thu Sep 10 19:37:45 2015 -0700 Committer: Marvin Humphrey <[email protected]> Committed: Tue Sep 15 15:54:50 2015 -0700 ---------------------------------------------------------------------- go/build.go | 6 ++++++ go/lucy/search.go | 33 +++++++++++++++++++++++++++++++++ go/lucy/search_test.go | 27 +++++++++++++++++++++++++++ 3 files changed, 66 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy/blob/d0388c8c/go/build.go ---------------------------------------------------------------------- diff --git a/go/build.go b/go/build.go index 10ec5cf..f18252e 100644 --- a/go/build.go +++ b/go/build.go @@ -191,6 +191,12 @@ func specClasses(parcel *cfc.Parcel) { mockMatcherBinding := cfc.NewGoClass(parcel, "LucyX::Search::MockMatcher") mockMatcherBinding.SetSuppressCtor(true) mockMatcherBinding.Register() + + topDocsBinding := cfc.NewGoClass(parcel, "Lucy::Search::TopDocs") + topDocsBinding.SetSuppressCtor(true) + topDocsBinding.SpecMethod("Set_Match_Docs", "SetMatchDocs([]MatchDoc)") + topDocsBinding.SpecMethod("Get_Match_Docs", "GetMatchDocs() []MatchDoc") + topDocsBinding.Register() } func build() { http://git-wip-us.apache.org/repos/asf/lucy/blob/d0388c8c/go/lucy/search.go ---------------------------------------------------------------------- diff --git a/go/lucy/search.go b/go/lucy/search.go index 18ac6bc..4865072 100644 --- a/go/lucy/search.go +++ b/go/lucy/search.go @@ -27,11 +27,13 @@ package lucy #include "Lucy/Search/ANDMatcher.h" #include "Lucy/Search/ORMatcher.h" #include "Lucy/Search/SeriesMatcher.h" +#include "Lucy/Search/TopDocs.h" #include "Lucy/Document/HitDoc.h" #include "LucyX/Search/MockMatcher.h" #include "Clownfish/Blob.h" #include "Clownfish/Hash.h" #include "Clownfish/HashIterator.h" +#include "Clownfish/Vector.h" static inline void float32_set(float *floats, size_t i, float value) { @@ -175,6 +177,37 @@ func (obj *HitsIMP) Error() error { return obj.err } +func NewTopDocs(matchDocs []MatchDoc, totalHits uint32) TopDocs { + vec := clownfish.NewVector(len(matchDocs)) + for _, matchDoc := range matchDocs { + vec.Push(matchDoc) + } + cfObj := C.lucy_TopDocs_new(((*C.cfish_Vector)(clownfish.Unwrap(vec, "matchDocs"))), + C.uint32_t(totalHits)) + return WRAPTopDocs(unsafe.Pointer(cfObj)) +} + +func (td *TopDocsIMP) SetMatchDocs(matchDocs []MatchDoc) { + self := (*C.lucy_TopDocs)(clownfish.Unwrap(td, "td")) + vec := clownfish.NewVector(len(matchDocs)) + for _, matchDoc := range matchDocs { + vec.Push(matchDoc) + } + C.LUCY_TopDocs_Set_Match_Docs(self, (*C.cfish_Vector)(clownfish.Unwrap(vec, "matchDocs"))) +} + +func (td *TopDocsIMP) GetMatchDocs() []MatchDoc { + self := (*C.lucy_TopDocs)(clownfish.Unwrap(td, "td")) + vec := C.LUCY_TopDocs_Get_Match_Docs(self) + length := int(C.CFISH_Vec_Get_Size(vec)) + slice := make([]MatchDoc, length) + for i := 0; i < length; i++ { + elem := C.cfish_incref(unsafe.Pointer(C.CFISH_Vec_Fetch(vec, C.size_t(i)))) + slice[i] = WRAPMatchDoc(unsafe.Pointer(elem)) + } + return slice +} + func NewANDQuery(children []Query) ANDQuery { vec := clownfish.NewVector(len(children)) for _, child := range children { http://git-wip-us.apache.org/repos/asf/lucy/blob/d0388c8c/go/lucy/search_test.go ---------------------------------------------------------------------- diff --git a/go/lucy/search_test.go b/go/lucy/search_test.go index 83fdc71..4225799 100644 --- a/go/lucy/search_test.go +++ b/go/lucy/search_test.go @@ -327,3 +327,30 @@ func TestSeriesMatcherBasics(t *testing.T) { matcher := NewSeriesMatcher([]Matcher{a, b, c}, []int32{0, 42, 80}) checkMatcher(t, matcher, false) } + +func TestTopDocsBasics(t *testing.T) { + matchDocs := []MatchDoc{ + NewMatchDoc(42, 2.0, nil), + NewMatchDoc(100, 3.0, nil), + } + td := NewTopDocs(matchDocs, 50) + td.SetTotalHits(20) + if totalHits := td.GetTotalHits(); totalHits != 20 { + t.Errorf("Expected 20 total hits, got %d", totalHits) + } + td.SetMatchDocs(matchDocs) + fetched := td.GetMatchDocs() + if docID := fetched[0].GetDocID(); docID != 42 { + t.Errorf("Set/Get MatchDocs expected 42, got %d", docID) + } + + folder := NewRAMFolder("") + outstream := folder.OpenOut("foo") + td.Serialize(outstream) + outstream.Close() + inStream := folder.OpenIn("foo") + dupe := clownfish.GetClass(td).MakeObj().(TopDocs).Deserialize(inStream) + if dupe.GetTotalHits() != td.GetTotalHits() { + t.Errorf("Failed round-trip serializetion of TopDocs") + } +}
