You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by ma...@apache.org on 2015/10/01 04:13:08 UTC
[7/9] lucy git commit: Add ReadDoc to Searcher Go bindings.
Add ReadDoc to Searcher Go bindings.
Support multiple document types when fetching document data via a
Searcher.
Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/853cf863
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/853cf863
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/853cf863
Branch: refs/heads/master
Commit: 853cf863a11be2d6543c90ad5830504081747c0f
Parents: 34ffe42
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Fri Sep 25 19:59:28 2015 -0700
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Mon Sep 28 12:54:39 2015 -0700
----------------------------------------------------------------------
go/build.go | 1 +
go/lucy/search.go | 20 ++++++++++++++++++++
go/lucy/search_test.go | 30 ++++++++++++++++++++++++++++++
3 files changed, 51 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy/blob/853cf863/go/build.go
----------------------------------------------------------------------
diff --git a/go/build.go b/go/build.go
index 15fbd21..e250aeb 100644
--- a/go/build.go
+++ b/go/build.go
@@ -152,6 +152,7 @@ func specClasses(parcel *cfc.Parcel) {
searcherBinding.SpecMethod("Hits",
"Hits(query interface{}, offset uint32, numWanted uint32, sortSpec SortSpec) (Hits, error)")
searcherBinding.SpecMethod("Close", "Close() error")
+ searcherBinding.SpecMethod("", "ReadDoc(int32, interface{}) error")
searcherBinding.Register()
hitsBinding := cfc.NewGoClass(parcel, "Lucy::Search::Hits")
http://git-wip-us.apache.org/repos/asf/lucy/blob/853cf863/go/lucy/search.go
----------------------------------------------------------------------
diff --git a/go/lucy/search.go b/go/lucy/search.go
index ed1b5e4..514c2eb 100644
--- a/go/lucy/search.go
+++ b/go/lucy/search.go
@@ -32,6 +32,7 @@ package lucy
#include "Lucy/Search/SortSpec.h"
#include "Lucy/Search/TopDocs.h"
#include "Lucy/Document/HitDoc.h"
+#include "Lucy/Index/IndexReader.h"
#include "LucyX/Search/MockMatcher.h"
#include "Clownfish/Blob.h"
#include "Clownfish/Hash.h"
@@ -76,6 +77,25 @@ func (obj *IndexSearcherIMP) Hits(query interface{}, offset uint32, numWanted ui
return doHits(obj, query, offset, numWanted, sortSpec)
}
+// Read data into the supplied doc.
+func (s *SearcherIMP) ReadDoc(docID int32, doc interface{}) error {
+ self := (*C.lucy_Searcher)(clownfish.Unwrap(s, "s"))
+ class := C.cfish_Obj_get_class((*C.cfish_Obj)(unsafe.Pointer(self)))
+ if class == C.LUCY_INDEXSEARCHER {
+ ixReader := C.LUCY_IxSearcher_Get_Reader((*C.lucy_IndexSearcher)(unsafe.Pointer(self)))
+ cfStr := (*C.cfish_String)(clownfish.GoToClownfish("Lucy::Index::DocReader", unsafe.Pointer(C.CFISH_STRING), false))
+ defer C.cfish_decref(unsafe.Pointer(cfStr))
+ docReader := C.LUCY_IxReader_Fetch(ixReader, cfStr)
+ if docReader == nil {
+ return clownfish.NewErr("No DocReader available")
+ }
+ docReaderGo := clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(docReader)))).(DocReader)
+ return fetchDocFromDocReader(docReaderGo, docID, doc)
+ } else {
+ return clownfish.NewErr("Support for ReadDoc not implemented")
+ }
+}
+
func doClose(obj Searcher) error {
self := ((*C.lucy_Searcher)(unsafe.Pointer(obj.TOPTR())))
return clownfish.TrapErr(func() {
http://git-wip-us.apache.org/repos/asf/lucy/blob/853cf863/go/lucy/search_test.go
----------------------------------------------------------------------
diff --git a/go/lucy/search_test.go b/go/lucy/search_test.go
index b281477..d0668ae 100644
--- a/go/lucy/search_test.go
+++ b/go/lucy/search_test.go
@@ -623,6 +623,36 @@ func TestIndexSearcherTopDocs(t *testing.T) {
}
}
+func TestIndexSearcherReadDoc(t *testing.T) {
+ index := createTestIndex("a", "b")
+ searcher, _ := OpenIndexSearcher(index)
+ docDoc := NewHitDoc(0, -1.0)
+ docStruct := &simpleTestDoc{}
+ docMap := make(map[string]interface{})
+ var err error
+ err = searcher.ReadDoc(2, docDoc)
+ if err != nil {
+ t.Errorf("ReadDoc failed with HitDoc: %v", err)
+ }
+ err = searcher.ReadDoc(2, docStruct)
+ if err != nil {
+ t.Errorf("ReadDoc failed with struct: %v", err)
+ }
+ err = searcher.ReadDoc(2, docMap)
+ if err != nil {
+ t.Errorf("ReadDoc failed with map: %v", err)
+ }
+ if docDoc.Extract("content").(string) != "b" {
+ t.Error("Next with Doc object yielded bad data")
+ }
+ if docStruct.Content != "b" {
+ t.Error("Next with struct yielded bad data")
+ }
+ if docMap["content"].(string) != "b" {
+ t.Error("Next with map yielded bad data")
+ }
+}
+
func TestMatchDocBasics(t *testing.T) {
matchDoc := NewMatchDoc(0, 1.0, nil)
matchDoc.SetDocID(42)