Customize and test Collector Go bindings. * Custom binding for SortCollector's PopMatchDocs. * Tests for BitCollector, OffsetCollector, SortCollector
Project: http://git-wip-us.apache.org/repos/asf/lucy/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/40a1eecb Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/40a1eecb Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/40a1eecb Branch: refs/heads/master Commit: 40a1eecbec1b212d6d2b7742bfeba7d546467d15 Parents: d850571 Author: Marvin Humphrey <[email protected]> Authored: Fri Sep 11 19:21:05 2015 -0700 Committer: Marvin Humphrey <[email protected]> Committed: Tue Sep 15 15:54:51 2015 -0700 ---------------------------------------------------------------------- go/build.go | 4 ++++ go/lucy/search.go | 14 ++++++++++++++ go/lucy/search_test.go | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy/blob/40a1eecb/go/build.go ---------------------------------------------------------------------- diff --git a/go/build.go b/go/build.go index 11615aa..15fbd21 100644 --- a/go/build.go +++ b/go/build.go @@ -202,6 +202,10 @@ func specClasses(parcel *cfc.Parcel) { sortSpecBinding.SetSuppressCtor(true) sortSpecBinding.SpecMethod("Get_Rules", "GetRules() []SortRule") sortSpecBinding.Register() + + sortCollBinding := cfc.NewGoClass(parcel, "Lucy::Search::Collector::SortCollector") + sortCollBinding.SpecMethod("Pop_Match_Docs", "PopMatchDocs() []MatchDoc") + sortCollBinding.Register() } func build() { http://git-wip-us.apache.org/repos/asf/lucy/blob/40a1eecb/go/lucy/search.go ---------------------------------------------------------------------- diff --git a/go/lucy/search.go b/go/lucy/search.go index 2723265..b47b340 100644 --- a/go/lucy/search.go +++ b/go/lucy/search.go @@ -18,6 +18,7 @@ package lucy /* #include "Lucy/Search/Collector.h" +#include "Lucy/Search/Collector/SortCollector.h" #include "Lucy/Search/Hits.h" #include "Lucy/Search/IndexSearcher.h" #include "Lucy/Search/Query.h" @@ -326,3 +327,16 @@ func newMockMatcher(docIDs []int32, scores []float32) MockMatcher { matcher := C.lucy_MockMatcher_new(docIDsCF, blob) return WRAPMockMatcher(unsafe.Pointer(matcher)) } + +func (sc *SortCollectorIMP) PopMatchDocs() []MatchDoc { + self := (*C.lucy_SortCollector)(clownfish.Unwrap(sc, "sc")) + matchDocsC := C.LUCY_SortColl_Pop_Match_Docs(self) + defer C.cfish_decref(unsafe.Pointer(matchDocsC)) + length := int(C.CFISH_Vec_Get_Size(matchDocsC)) + slice := make([]MatchDoc, length) + for i := 0; i < length; i++ { + elem := C.cfish_incref(unsafe.Pointer(C.CFISH_Vec_Fetch(matchDocsC, C.size_t(i)))) + slice[i] = WRAPMatchDoc(unsafe.Pointer(elem)) + } + return slice +} http://git-wip-us.apache.org/repos/asf/lucy/blob/40a1eecb/go/lucy/search_test.go ---------------------------------------------------------------------- diff --git a/go/lucy/search_test.go b/go/lucy/search_test.go index 6d0c42d..d084f53 100644 --- a/go/lucy/search_test.go +++ b/go/lucy/search_test.go @@ -529,3 +529,41 @@ func TestSpanBasics(t *testing.T) { t.Errorf("Set/Get weight: %f", got) } } + +func TestBitCollectorBasics(t *testing.T) { + index := createTestIndex("a", "b", "c", "a") + searcher, _ := OpenIndexSearcher(index) + bitVec := NewBitVector(5) + collector := NewBitCollector(bitVec) + searcher.Collect(NewTermQuery("content", "a"), collector) + expected := []bool{false, true, false, false, true, false, false, false} + if got := bitVec.ToArray(); !reflect.DeepEqual(got,expected) { + t.Errorf("Unexpected result set: %v", got) + } +} + +func TestOffsetCollectorBasics(t *testing.T) { + index := createTestIndex("a", "b", "c") + searcher, _ := OpenIndexSearcher(index) + bitVec := NewBitVector(64) + bitColl := NewBitCollector(bitVec) + offsetColl := NewOffsetCollector(bitColl, 40) + searcher.Collect(NewTermQuery("content", "b"), offsetColl) + if got := bitVec.NextHit(0); got != 42 { + t.Errorf("Unexpected docID: %d", got) + } +} + +func TestSortCollectorBasics(t *testing.T) { + index := createTestIndex("a", "b", "c", "a") + searcher, _ := OpenIndexSearcher(index) + collector := NewSortCollector(nil, nil, 1) + searcher.Collect(NewTermQuery("content", "a"), collector) + if totalHits := collector.GetTotalHits(); totalHits != 2 { + t.Errorf("Unexpected TotalHits: %d", totalHits) + } + matchDocs := collector.PopMatchDocs() + if docID := matchDocs[0].GetDocID(); docID != 1 { + t.Errorf("Weird MatchDoc: %d", docID) + } +}
