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/12/28 21:10:48 UTC

[01/16] lucy git commit: Test Go bindings for Lexicon.

Repository: lucy
Updated Branches:
  refs/heads/master f5916a4e0 -> 6cc97ecec


Test Go bindings for Lexicon.

Use SegLexicon to test out Lexicon.


Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/932c2114
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/932c2114
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/932c2114

Branch: refs/heads/master
Commit: 932c211412d89078a5ebc2400fd36540f534f0ba
Parents: f5916a4
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Thu Dec 3 16:06:44 2015 -0800
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Thu Dec 10 16:01:48 2015 -0800

----------------------------------------------------------------------
 go/lucy/index_test.go | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/932c2114/go/lucy/index_test.go
----------------------------------------------------------------------
diff --git a/go/lucy/index_test.go b/go/lucy/index_test.go
index e7c93a9..2df680f 100644
--- a/go/lucy/index_test.go
+++ b/go/lucy/index_test.go
@@ -642,3 +642,36 @@ func TestInverterMisc(t *testing.T) {
 		t.Errorf("GetInversion after iterator exhausted: %v", got)
 	}
 }
+
+// Use SegLexicon to air out the Lexicon interface.
+func TestLexiconBasics(t *testing.T) {
+	folder := createTestIndex("a", "b", "c")
+	searcher, _ := OpenIndexSearcher(folder)
+	segReaders := searcher.GetReader().SegReaders()
+	lexReader := segReaders[0].(SegReader).Obtain("Lucy::Index::LexiconReader").(LexiconReader)
+	segLex := lexReader.Lexicon("content", nil).(Lexicon)
+	if field := segLex.getField(); field != "content" {
+		t.Errorf("getField: %s", field)
+	}
+	segLex.Next()
+	if got := segLex.GetTerm(); got != "a" {
+		t.Errorf("GetTerm: %v", got)
+	}
+	if docFreq := segLex.docFreq(); docFreq != 1 {
+		t.Errorf("docFreq: %d", docFreq)
+	}
+	if !segLex.Next() || !segLex.Next() {
+		t.Errorf("Iterate")
+	}
+	if segLex.Next() {
+		t.Errorf("Iteration should be finished")
+	}
+	segLex.Seek("b")
+	if got := segLex.GetTerm(); got != "b" {
+		t.Errorf("Seek: %v", got)
+	}
+	segLex.Reset()
+	if !segLex.Next() {
+		t.Errorf("Next after Reset")
+	}
+}


[13/16] lucy git commit: Tune and test Go bindings for DataWriter.

Posted by ma...@apache.org.
Tune and test Go bindings for DataWriter.


Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/362aeddc
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/362aeddc
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/362aeddc

Branch: refs/heads/master
Commit: 362aeddca1599907090188035e77aeeba7b57c8b
Parents: e5e4232
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Mon Dec 14 20:28:27 2015 -0800
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Fri Dec 18 12:04:01 2015 -0800

----------------------------------------------------------------------
 go/build.go           |  8 +++++++
 go/lucy/index.go      | 44 +++++++++++++++++++++++++++++++++++
 go/lucy/index_test.go | 57 ++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 109 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/362aeddc/go/build.go
----------------------------------------------------------------------
diff --git a/go/build.go b/go/build.go
index 604a9a9..f78aa5f 100644
--- a/go/build.go
+++ b/go/build.go
@@ -228,6 +228,14 @@ func specClasses(parcel *cfc.Parcel) {
 	pListReaderBinding.SpecMethod("Posting_List", "PostingList(string, interface{}) (PostingList, error)")
 	pListReaderBinding.Register()
 
+	dwBinding := cfc.NewGoClass(parcel, "Lucy::Index::DataWriter")
+	dwBinding.SpecMethod("Add_Inverted_Doc", "addInvertedDoc(Inverter, int32) error")
+	dwBinding.SpecMethod("Add_Segment", "AddSegment(SegReader, []int32) error")
+	dwBinding.SpecMethod("Delete_Segment", "DeleteSegment(SegReader) error")
+	dwBinding.SpecMethod("Merge_Segment", "MergeSegment(SegReader, []int32) error")
+	dwBinding.SpecMethod("Finish", "Finish() error")
+	dwBinding.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/362aeddc/go/lucy/index.go
----------------------------------------------------------------------
diff --git a/go/lucy/index.go b/go/lucy/index.go
index 1f5a752..0444a30 100644
--- a/go/lucy/index.go
+++ b/go/lucy/index.go
@@ -20,6 +20,7 @@ package lucy
 #include "Lucy/Index/Indexer.h"
 #include "Lucy/Index/IndexReader.h"
 #include "Lucy/Index/DataReader.h"
+#include "Lucy/Index/DataWriter.h"
 #include "Lucy/Index/DocReader.h"
 #include "Lucy/Index/LexiconReader.h"
 #include "Lucy/Index/PostingListReader.h"
@@ -235,6 +236,49 @@ func (obj *IndexerIMP) Commit() error {
 	})
 }
 
+func (d *DataWriterIMP) addInvertedDoc(inverter Inverter, docId int32) error {
+	return clownfish.TrapErr(func() {
+		self := (*C.lucy_DataWriter)(clownfish.Unwrap(d, "d"))
+		inverterCF := (*C.lucy_Inverter)(clownfish.Unwrap(inverter, "inverter"))
+		C.LUCY_DataWriter_Add_Inverted_Doc(self, inverterCF, C.int32_t(docId))
+	})
+}
+
+func (d *DataWriterIMP) AddSegment(reader SegReader, docMap []int32) error {
+	return clownfish.TrapErr(func() {
+		self := (*C.lucy_DataWriter)(clownfish.Unwrap(d, "d"))
+		readerCF := (*C.lucy_SegReader)(clownfish.Unwrap(reader, "reader"))
+		docMapConv := NewI32Array(docMap)
+		docMapCF := (*C.lucy_I32Array)(clownfish.UnwrapNullable(docMapConv))
+		C.LUCY_DataWriter_Add_Segment(self, readerCF, docMapCF)
+	})
+}
+
+func (d *DataWriterIMP) DeleteSegment(reader SegReader) error {
+	return clownfish.TrapErr(func() {
+		self := (*C.lucy_DataWriter)(clownfish.Unwrap(d, "d"))
+		readerCF := (*C.lucy_SegReader)(clownfish.Unwrap(reader, "reader"))
+		C.LUCY_DataWriter_Delete_Segment(self, readerCF)
+	})
+}
+
+func (d *DataWriterIMP) MergeSegment(reader SegReader, docMap []int32) error {
+	return clownfish.TrapErr(func() {
+		self := (*C.lucy_DataWriter)(clownfish.Unwrap(d, "d"))
+		readerCF := (*C.lucy_SegReader)(clownfish.Unwrap(reader, "reader"))
+		docMapConv := NewI32Array(docMap)
+		docMapCF := (*C.lucy_I32Array)(clownfish.UnwrapNullable(docMapConv))
+		C.LUCY_DataWriter_Merge_Segment(self, readerCF, docMapCF)
+	})
+}
+
+func (d *DataWriterIMP) Finish() error {
+	return clownfish.TrapErr(func() {
+		self := (*C.lucy_DataWriter)(clownfish.Unwrap(d, "d"))
+		C.LUCY_DataWriter_Finish(self)
+	})
+}
+
 func OpenBackgroundMerger(index interface{}, manager IndexManager) (bgm BackgroundMerger, err error) {
 	err = clownfish.TrapErr(func() {
 		indexC := (*C.cfish_Obj)(clownfish.GoToClownfish(index, unsafe.Pointer(C.CFISH_OBJ), false))

http://git-wip-us.apache.org/repos/asf/lucy/blob/362aeddc/go/lucy/index_test.go
----------------------------------------------------------------------
diff --git a/go/lucy/index_test.go b/go/lucy/index_test.go
index 0143fcf..f71cb2f 100644
--- a/go/lucy/index_test.go
+++ b/go/lucy/index_test.go
@@ -907,3 +907,60 @@ func TestSortReaderMisc(t *testing.T) {
 	}
 	runDataReaderCommon(t, sortReader, false)
 }
+
+func runDataWriterCommon(t *testing.T, api string) {
+	abcIndex := createTestIndex("a", "b", "c")
+	indexer, _ := OpenIndexer(&OpenIndexerArgs{Index: abcIndex})
+	dataWriter := indexer.getSegWriter().Fetch(api).(DataWriter)
+
+	if got := dataWriter.GetSnapshot(); false {
+		t.Errorf("GetSnapshot: %v", got)
+	}
+	if got := dataWriter.GetSegment(); false {
+		t.Errorf("GetSegment: %#v", got)
+	}
+	if got := dataWriter.GetPolyReader(); false {
+		t.Errorf("GetPolyReader: %#v", got)
+	}
+	if got := dataWriter.GetSchema(); false {
+		t.Errorf("GetSchema: %v", got)
+	}
+	if got := dataWriter.GetFolder(); false {
+		t.Errorf("GetFolder: %v", got)
+	}
+
+	doc := NewDoc(1)
+	doc.Store("content", "three blind mice")
+	inverter := NewInverter(dataWriter.GetSchema(), dataWriter.GetSegment())
+	inverter.SetDoc(doc)
+	inverter.InvertDoc(doc)
+	if err := dataWriter.addInvertedDoc(inverter, 1); err != nil {
+		t.Errorf("addInvertedDoc: %v", err)
+	}
+
+	segReaders := indexer.getSegWriter().GetPolyReader().SegReaders()
+	abcSegReader := segReaders[0]
+	if err := dataWriter.MergeSegment(abcSegReader, []int32{0, 2, 0, 3}); err != nil {
+		t.Errorf("MergeSegment: %v", err)
+	}
+
+	// TODO
+	//if err := dataWriter.DeleteSegment(fooSegReader); err != nil {
+	//	t.Errorf("DeleteSegment: %v", err)
+	//}
+
+	xyzIndex := createTestIndex("x", "y", "z")
+	xyzReader, _ := OpenIndexReader(xyzIndex, nil, nil)
+	xyzSegReaders := xyzReader.SegReaders()
+	if err := dataWriter.AddSegment(xyzSegReaders[0], []int32{0, 4, 5, 6}); err != nil {
+		t.Errorf("AddSegment: %v", err)
+	}
+
+	if err := dataWriter.Finish(); err != nil {
+		t.Errorf("Finish: %v", err)
+	}
+}
+
+func TestSortWriterMisc(t *testing.T) {
+	runDataWriterCommon(t, "Lucy::Index::SortWriter")
+}


[09/16] lucy git commit: Tune and test HighlightReader Go bindings.

Posted by ma...@apache.org.
Tune and test HighlightReader Go bindings.


Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/a405c397
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/a405c397
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/a405c397

Branch: refs/heads/master
Commit: a405c39703da14ede15b1b20a54bf63165b32df5
Parents: 6deeba8
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Thu Dec 10 17:05:05 2015 -0800
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Thu Dec 10 18:22:54 2015 -0800

----------------------------------------------------------------------
 go/build.go           |  4 ++++
 go/lucy/index.go      | 10 ++++++++++
 go/lucy/index_test.go | 14 ++++++++++++++
 3 files changed, 28 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/a405c397/go/build.go
----------------------------------------------------------------------
diff --git a/go/build.go b/go/build.go
index 30a4703..a730160 100644
--- a/go/build.go
+++ b/go/build.go
@@ -210,6 +210,10 @@ func specClasses(parcel *cfc.Parcel) {
 	docReaderBinding.SpecMethod("Fetch_Doc", "FetchDoc(int32) (HitDoc, error)")
 	docReaderBinding.Register()
 
+	hlReaderBinding := cfc.NewGoClass(parcel, "Lucy::Index::HighlightReader")
+	hlReaderBinding.SpecMethod("Fetch_Doc_Vec", "FetchDocVec(int32) (DocVector, error)")
+	hlReaderBinding.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/a405c397/go/lucy/index.go
----------------------------------------------------------------------
diff --git a/go/lucy/index.go b/go/lucy/index.go
index 67d4b47..09ad6ec 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/HighlightReader.h"
 #include "Lucy/Index/IndexManager.h"
 #include "Lucy/Index/BackgroundMerger.h"
 #include "Lucy/Index/TermVector.h"
@@ -484,6 +485,15 @@ func (d *DocReaderIMP) FetchDoc(docID int32) (doc HitDoc, err error) {
 	return doc, err
 }
 
+func (h *HighlightReaderIMP) FetchDocVec(docID int32) (retval DocVector, err error) {
+	err = clownfish.TrapErr(func() {
+		self := (*C.lucy_HighlightReader)(clownfish.Unwrap(h, "h"))
+		retvalCF := C.LUCY_HLReader_Fetch_Doc_Vec(self, C.int32_t(docID))
+		retval = WRAPDocVector(unsafe.Pointer(retvalCF))
+	})
+	return retval, err
+}
+
 func OpenIndexReader(index interface{}, snapshot Snapshot, manager IndexManager) (retval IndexReader, err error) {
 	err = clownfish.TrapErr(func() {
 		indexC := (*C.cfish_Obj)(clownfish.GoToClownfish(index, unsafe.Pointer(C.CFISH_OBJ), false))

http://git-wip-us.apache.org/repos/asf/lucy/blob/a405c397/go/lucy/index_test.go
----------------------------------------------------------------------
diff --git a/go/lucy/index_test.go b/go/lucy/index_test.go
index e44bb09..e75ede4 100644
--- a/go/lucy/index_test.go
+++ b/go/lucy/index_test.go
@@ -819,3 +819,17 @@ func TestPolyDocReaderMisc(t *testing.T) {
 	}
 	runDataReaderCommon(t, reader, true)
 }
+
+func TestHighlightReaderMisc(t *testing.T) {
+	folder := createTestIndex("a", "b", "c")
+	ixReader, _ := OpenIndexReader(folder, nil, nil)
+	segReaders := ixReader.SegReaders()
+	reader := segReaders[0].Fetch("Lucy::Index::HighlightReader").(HighlightReader)
+	if got, err := reader.FetchDocVec(2); got == nil || err != nil {
+		t.Errorf("FetchDocVec: %v", err)
+	}
+	if got, err := reader.FetchDocVec(4); got != nil || err == nil {
+		t.Errorf("FetchDocVec catch error: %#v", got)
+	}
+	runDataReaderCommon(t, reader, true)
+}


[05/16] lucy git commit: Tune and test Go bindings for DataReader.

Posted by ma...@apache.org.
Tune and test Go bindings for DataReader.


Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/38bea5a6
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/38bea5a6
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/38bea5a6

Branch: refs/heads/master
Commit: 38bea5a604fd4d190bb49719f50d05e1a1c58de5
Parents: d262be9
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Tue Dec 8 18:32:52 2015 -0800
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Thu Dec 10 18:22:53 2015 -0800

----------------------------------------------------------------------
 go/build.go           |  6 ++++++
 go/lucy/index.go      | 44 ++++++++++++++++++++++++++++++++++++++++++++
 go/lucy/index_test.go | 38 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 88 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/38bea5a6/go/build.go
----------------------------------------------------------------------
diff --git a/go/build.go b/go/build.go
index 692702d..2bdab37 100644
--- a/go/build.go
+++ b/go/build.go
@@ -185,6 +185,12 @@ func specClasses(parcel *cfc.Parcel) {
 	indexerBinding.SetSuppressStruct(true)
 	indexerBinding.Register()
 
+	dataReaderBinding := cfc.NewGoClass(parcel, "Lucy::Index::DataReader")
+	dataReaderBinding.SpecMethod("Aggregator", "Aggregator([]DataReader, []int32) (DataReader, error)")
+	dataReaderBinding.SpecMethod("Get_Segments", "GetSegments() []Segment")
+	dataReaderBinding.SpecMethod("Close", "Close() error")
+	dataReaderBinding.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/38bea5a6/go/lucy/index.go
----------------------------------------------------------------------
diff --git a/go/lucy/index.go b/go/lucy/index.go
index 230e050..defa9f2 100644
--- a/go/lucy/index.go
+++ b/go/lucy/index.go
@@ -18,6 +18,7 @@ package lucy
 
 /*
 #include "Lucy/Index/Indexer.h"
+#include "Lucy/Index/DataReader.h"
 #include "Lucy/Index/IndexManager.h"
 #include "Lucy/Index/BackgroundMerger.h"
 #include "Lucy/Index/TermVector.h"
@@ -415,3 +416,46 @@ func (s *SortCacheIMP) Find(term interface{}) (retval int32, err error) {
 	})
 	return retval, err
 }
+
+func (d *DataReaderIMP) Aggregator(readers []DataReader, offsets []int32) (retval DataReader, err error) {
+	err = clownfish.TrapErr(func() {
+		self := (*C.lucy_DataReader)(clownfish.Unwrap(d, "d"))
+		size := len(readers)
+		readersC := C.cfish_Vec_new(C.size_t(size))
+		defer C.cfish_decref(unsafe.Pointer(readersC))
+		for i := 0; i < size; i++ {
+			elemC := clownfish.Unwrap(readers[i], "readers[i]")
+			C.CFISH_Vec_Push(readersC, C.cfish_incref(elemC))
+		}
+		offs := NewI32Array(offsets)
+		offsetsC := (*C.lucy_I32Array)(clownfish.Unwrap(offs, "offs"))
+		retvalCF := C.LUCY_DataReader_Aggregator(self, readersC, offsetsC)
+		defer C.cfish_decref(unsafe.Pointer(retvalCF))
+		if retvalCF != nil {
+			retval = clownfish.ToGo(unsafe.Pointer(retvalCF)).(DataReader)
+		}
+	})
+	return retval, err
+}
+
+func (d *DataReaderIMP) GetSegments() []Segment {
+	self := (*C.lucy_DataReader)(clownfish.Unwrap(d, "d"))
+	retvalCF := C.LUCY_DataReader_Get_Segments(self);
+	if retvalCF == nil {
+		return nil
+	}
+	size := C.CFISH_Vec_Get_Size(retvalCF)
+	retval := make([]Segment, int(size))
+	for i := 0; i < int(size); i++ {
+		elem := unsafe.Pointer(C.CFISH_Vec_Fetch(retvalCF, C.size_t(i)))
+		retval[i] = clownfish.ToGo(unsafe.Pointer(C.cfish_incref(elem))).(Segment)
+	}
+	return retval
+}
+
+func (d *DataReaderIMP) Close() error {
+	return clownfish.TrapErr(func() {
+		self := (*C.lucy_DataReader)(clownfish.Unwrap(d, "d"))
+		C.LUCY_DataReader_Close(self)
+	})
+}

http://git-wip-us.apache.org/repos/asf/lucy/blob/38bea5a6/go/lucy/index_test.go
----------------------------------------------------------------------
diff --git a/go/lucy/index_test.go b/go/lucy/index_test.go
index 88e8924..40609e6 100644
--- a/go/lucy/index_test.go
+++ b/go/lucy/index_test.go
@@ -712,3 +712,41 @@ func TestPostingBasics(t *testing.T) {
 		t.Errorf("getFreq: %d", got)
 	}
 }
+
+// This function runs Close(), so the reader becomes unusable afterwards.
+func runDataReaderCommon(t *testing.T, reader DataReader, runAggregator bool) {
+	if runAggregator {
+		got, err := reader.Aggregator([]DataReader{}, []int32{})
+		if got == nil || err != nil {
+			t.Errorf("Aggregator: %#v, %v", got, err)
+		}
+	}
+	if got := reader.GetSchema(); false {
+		t.Errorf("GetSchema: %v", got)
+	}
+	if got := reader.GetFolder(); false {
+		t.Errorf("GetFolder: %v", got)
+	}
+	if got := reader.GetSnapshot(); false {
+		t.Errorf("GetSnapshot: %v", got)
+	}
+	if got := reader.GetSegments(); false {
+		t.Errorf("GetSegments: %#v", got)
+	}
+	if got := reader.GetSegment(); false {
+		t.Errorf("GetSegment: %#v", got)
+	}
+	if got := reader.GetSegTick(); false {
+		t.Errorf("GetSegTick: %d", got)
+	}
+	if err := reader.Close(); err != nil {
+		t.Errorf("Close: %v", err)
+	}
+}
+
+func TestIndexReaderMisc(t *testing.T) {
+	folder := createTestIndex("a", "b", "c")
+	searcher, _ := OpenIndexSearcher(folder)
+	reader := searcher.GetReader()
+	runDataReaderCommon(t, reader, false)
+}


[15/16] lucy git commit: Tune and test Go bindings for SegWriter.

Posted by ma...@apache.org.
Tune and test Go bindings for SegWriter.


Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/126c6ba8
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/126c6ba8
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/126c6ba8

Branch: refs/heads/master
Commit: 126c6ba8907c2f134c9921cafe8d7dc74f1fbc5d
Parents: 2932054
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Mon Dec 21 12:38:25 2015 -0800
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Mon Dec 21 12:38:25 2015 -0800

----------------------------------------------------------------------
 go/build.go           |  5 +++++
 go/lucy/index.go      | 16 ++++++++++++++++
 go/lucy/index_test.go | 17 +++++++++++++++++
 3 files changed, 38 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/126c6ba8/go/build.go
----------------------------------------------------------------------
diff --git a/go/build.go b/go/build.go
index 82bcd9c..e3fc79d 100644
--- a/go/build.go
+++ b/go/build.go
@@ -236,6 +236,11 @@ func specClasses(parcel *cfc.Parcel) {
 	dwBinding.SpecMethod("Finish", "Finish() error")
 	dwBinding.Register()
 
+	segWriterBinding := cfc.NewGoClass(parcel, "Lucy::Index::SegWriter")
+	segWriterBinding.SpecMethod("Prep_Seg_Dir", "PrepSegDir() error")
+	segWriterBinding.SpecMethod("Add_Doc", "AddDoc(Doc, float32) error")
+	segWriterBinding.Register()
+
 	delWriterBinding := cfc.NewGoClass(parcel, "Lucy::Index::DeletionsWriter")
 	delWriterBinding.SpecMethod("Delete_By_Term", "DeleteByTerm(string, interface{}) error")
 	delWriterBinding.SpecMethod("Delete_By_Query", "DeleteByQuery(Query) error")

http://git-wip-us.apache.org/repos/asf/lucy/blob/126c6ba8/go/lucy/index.go
----------------------------------------------------------------------
diff --git a/go/lucy/index.go b/go/lucy/index.go
index 67ec832..6f627f0 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/DataWriter.h"
+#include "Lucy/Index/SegWriter.h"
 #include "Lucy/Index/DeletionsWriter.h"
 #include "Lucy/Index/DocReader.h"
 #include "Lucy/Index/LexiconReader.h"
@@ -280,6 +281,21 @@ func (d *DataWriterIMP) Finish() error {
 	})
 }
 
+func (s *SegWriterIMP) PrepSegDir() error {
+	return clownfish.TrapErr(func() {
+		self := (*C.lucy_SegWriter)(clownfish.Unwrap(s, "s"))
+		C.LUCY_SegWriter_Prep_Seg_Dir(self)
+	})
+}
+
+func (s *SegWriterIMP) AddDoc(doc Doc, boost float32) error {
+	return clownfish.TrapErr(func() {
+		self := (*C.lucy_SegWriter)(clownfish.Unwrap(s, "s"))
+		docCF := (*C.lucy_Doc)(clownfish.Unwrap(doc, "doc"))
+		C.LUCY_SegWriter_Add_Doc(self, docCF, C.float(boost))
+	})
+}
+
 func (d *DeletionsWriterIMP) DeleteByTerm(field string, term interface{}) error {
 	return clownfish.TrapErr(func() {
 		self := (*C.lucy_DeletionsWriter)(clownfish.Unwrap(d, "d"))

http://git-wip-us.apache.org/repos/asf/lucy/blob/126c6ba8/go/lucy/index_test.go
----------------------------------------------------------------------
diff --git a/go/lucy/index_test.go b/go/lucy/index_test.go
index 9f2aca9..bc6bac4 100644
--- a/go/lucy/index_test.go
+++ b/go/lucy/index_test.go
@@ -994,3 +994,20 @@ func TestDeletionsWriterMisc(t *testing.T) {
 		t.Errorf("segDeletions: %v", err)
 	}
 }
+
+func TestSegWriterMisc(t *testing.T) {
+	index := createTestIndex("a", "b", "c")
+	ixReader, _ := OpenIndexReader(index, nil, nil)
+	polyReader := ixReader.(PolyReader)
+	schema := polyReader.GetSchema()
+	segment := NewSegment(2)
+	snapshot := polyReader.GetSnapshot()
+	segWriter := NewSegWriter(schema, snapshot, segment, polyReader)
+	if err := segWriter.PrepSegDir(); err != nil {
+		t.Errorf("PrepSegDir: %v", err)
+	}
+	doc := NewDoc(1)
+	if err := segWriter.AddDoc(doc, 1.0); err != nil {
+		t.Errorf("AddDoc: %v", err)
+	}
+}


[10/16] lucy git commit: Tune and test Go bindings for SortReader.

Posted by ma...@apache.org.
Tune and test Go bindings for SortReader.


Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/db08b691
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/db08b691
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/db08b691

Branch: refs/heads/master
Commit: db08b691bf6a8b5ce450f296f496c76604eef3e6
Parents: bfe8a34
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Thu Dec 10 18:22:14 2015 -0800
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Thu Dec 10 18:53:38 2015 -0800

----------------------------------------------------------------------
 go/build.go            |  4 ++++
 go/lucy/index.go       | 14 ++++++++++++++
 go/lucy/index_test.go  | 16 +++++++++++++++-
 go/lucy/search_test.go |  2 +-
 4 files changed, 34 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/db08b691/go/build.go
----------------------------------------------------------------------
diff --git a/go/build.go b/go/build.go
index a730160..09a31e5 100644
--- a/go/build.go
+++ b/go/build.go
@@ -214,6 +214,10 @@ func specClasses(parcel *cfc.Parcel) {
 	hlReaderBinding.SpecMethod("Fetch_Doc_Vec", "FetchDocVec(int32) (DocVector, error)")
 	hlReaderBinding.Register()
 
+	sortReaderBinding := cfc.NewGoClass(parcel, "Lucy::Index::SortReader")
+	sortReaderBinding.SpecMethod("Fetch_Sort_Cache", "fetchSortCache(string) (SortCache, error)")
+	sortReaderBinding.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/db08b691/go/lucy/index.go
----------------------------------------------------------------------
diff --git a/go/lucy/index.go b/go/lucy/index.go
index 09ad6ec..397e860 100644
--- a/go/lucy/index.go
+++ b/go/lucy/index.go
@@ -22,6 +22,7 @@ package lucy
 #include "Lucy/Index/DataReader.h"
 #include "Lucy/Index/DocReader.h"
 #include "Lucy/Index/HighlightReader.h"
+#include "Lucy/Index/SortReader.h"
 #include "Lucy/Index/IndexManager.h"
 #include "Lucy/Index/BackgroundMerger.h"
 #include "Lucy/Index/TermVector.h"
@@ -494,6 +495,19 @@ func (h *HighlightReaderIMP) FetchDocVec(docID int32) (retval DocVector, err err
 	return retval, err
 }
 
+func (s *SortReaderIMP) fetchSortCache(field string) (retval SortCache, err error) {
+	err = clownfish.TrapErr(func() {
+		self := (*C.lucy_SortReader)(clownfish.Unwrap(s, "s"))
+		fieldC := (*C.cfish_String)(clownfish.GoToClownfish(field, unsafe.Pointer(C.CFISH_STRING), false))
+		defer C.cfish_decref(unsafe.Pointer(fieldC))
+		retvalCF := C.LUCY_SortReader_Fetch_Sort_Cache(self, fieldC)
+		if retvalCF != nil {
+			retval = clownfish.ToGo(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(retvalCF)))).(SortCache)
+		}
+	})
+	return retval, err
+}
+
 func OpenIndexReader(index interface{}, snapshot Snapshot, manager IndexManager) (retval IndexReader, err error) {
 	err = clownfish.TrapErr(func() {
 		indexC := (*C.cfish_Obj)(clownfish.GoToClownfish(index, unsafe.Pointer(C.CFISH_OBJ), false))

http://git-wip-us.apache.org/repos/asf/lucy/blob/db08b691/go/lucy/index_test.go
----------------------------------------------------------------------
diff --git a/go/lucy/index_test.go b/go/lucy/index_test.go
index ebf5d25..efbe0f0 100644
--- a/go/lucy/index_test.go
+++ b/go/lucy/index_test.go
@@ -403,7 +403,7 @@ func TestSortCacheMisc(t *testing.T) {
 	ixReader, _ := OpenIndexReader(folder, nil, nil)
 	segReaders := ixReader.SegReaders()
 	sortReader := segReaders[0].Fetch("Lucy::Index::SortReader").(SortReader)
-	sortCache := sortReader.fetchSortCache("content")
+	sortCache, _ := sortReader.fetchSortCache("content")
 
 	if card := sortCache.GetCardinality(); card != 4 {
 		t.Errorf("GetCardinality: %d", card)
@@ -847,3 +847,17 @@ func TestDeletionsReaderMisc(t *testing.T) {
 	}
 	runDataReaderCommon(t, delReader, true)
 }
+
+func TestSortReaderMisc(t *testing.T) {
+	folder := createTestIndex("a", "b", "c")
+	ixReader, _ := OpenIndexReader(folder, nil, nil)
+	segReaders := ixReader.SegReaders()
+	sortReader := segReaders[0].Fetch("Lucy::Index::SortReader").(SortReader)
+	if got, err := sortReader.fetchSortCache("content"); got == nil || err != nil {
+		t.Errorf("fetchSortCache should succeed: %v", err)
+	}
+	if got, err := sortReader.fetchSortCache("nope"); got != nil || err != nil {
+		t.Errorf("fetchSortCache for non-field should return nil: %v", err)
+	}
+	runDataReaderCommon(t, sortReader, false)
+}

http://git-wip-us.apache.org/repos/asf/lucy/blob/db08b691/go/lucy/search_test.go
----------------------------------------------------------------------
diff --git a/go/lucy/search_test.go b/go/lucy/search_test.go
index 5061a24..47b809b 100644
--- a/go/lucy/search_test.go
+++ b/go/lucy/search_test.go
@@ -372,7 +372,7 @@ func TestRangeMatcherBasics(t *testing.T) {
 	ixReader, _ := OpenIndexReader(index, nil, nil)
 	segReaders := ixReader.SegReaders()
 	sortReader := segReaders[0].Fetch("Lucy::Index::SortReader").(SortReader)
-	sortCache := sortReader.fetchSortCache("content")
+	sortCache, _ := sortReader.fetchSortCache("content")
 	matcher := NewRangeMatcher(0, 0, sortCache, segReaders[0].DocMax())
 	if docID := matcher.Next(); docID != 4 {
 		t.Errorf("Next: %d", docID)


[16/16] lucy git commit: Merge branch 'LUCY-282-Go-index-pt2'

Posted by ma...@apache.org.
Merge branch 'LUCY-282-Go-index-pt2'

Continue with tuning and testing the Go bindings for Lucy's indexing
components.

* IndexReader
* Lexicon
* PostingList, Posting
* Various DataReaders and DataWriters

This closes #31.


Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/6cc97ece
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/6cc97ece
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/6cc97ece

Branch: refs/heads/master
Commit: 6cc97ececdd033388728dc3503901aa65d12009c
Parents: f5916a4 126c6ba
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Mon Dec 28 12:09:01 2015 -0800
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Mon Dec 28 12:09:01 2015 -0800

----------------------------------------------------------------------
 go/build.go            |  64 ++++++++
 go/lucy/index.go       | 307 ++++++++++++++++++++++++++++++++++++
 go/lucy/index_test.go  | 377 +++++++++++++++++++++++++++++++++++++++++++-
 go/lucy/lucy.go        |  21 +--
 go/lucy/search.go      |   2 +-
 go/lucy/search_test.go |  11 +-
 6 files changed, 752 insertions(+), 30 deletions(-)
----------------------------------------------------------------------



[03/16] lucy git commit: Test Go bindings for Posting.

Posted by ma...@apache.org.
Test Go bindings for Posting.


Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/d262be92
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/d262be92
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/d262be92

Branch: refs/heads/master
Commit: d262be92763c9d145fd7fdcd3cef07cc8ec18a13
Parents: a693aa1
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Thu Dec 3 19:13:19 2015 -0800
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Thu Dec 10 16:01:49 2015 -0800

----------------------------------------------------------------------
 go/lucy/index_test.go | 13 +++++++++++++
 1 file changed, 13 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/d262be92/go/lucy/index_test.go
----------------------------------------------------------------------
diff --git a/go/lucy/index_test.go b/go/lucy/index_test.go
index 5affb0d..88e8924 100644
--- a/go/lucy/index_test.go
+++ b/go/lucy/index_test.go
@@ -699,3 +699,16 @@ func TestPostingListBasics(t *testing.T) {
 		t.Error("Next (done): %d", got)
 	}
 }
+
+func TestPostingBasics(t *testing.T) {
+	sim := NewSimilarity()
+	posting := NewMatchPosting(sim)
+	posting.SetDocID(42)
+	if got := posting.GetDocID(); got != 42 {
+		t.Errorf("Set/GetDocID: %d", got)
+	}
+	posting.Reset()
+	if got := posting.getFreq(); got != 0 {
+		t.Errorf("getFreq: %d", got)
+	}
+}


[11/16] lucy git commit: Tune and test Go bindings for LexiconReader.

Posted by ma...@apache.org.
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 <ma...@rectangular.com>
Authored: Thu Dec 10 18:53:08 2015 -0800
Committer: Marvin Humphrey <ma...@rectangular.com>
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)


[06/16] lucy git commit: Test Go bindings for DeletionsReader.

Posted by ma...@apache.org.
Test Go bindings for DeletionsReader.


Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/bfe8a347
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/bfe8a347
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/bfe8a347

Branch: refs/heads/master
Commit: bfe8a34733ff43ecf34dc2e7523684381dbec5a9
Parents: a405c39
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Thu Dec 10 17:10:50 2015 -0800
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Thu Dec 10 18:22:54 2015 -0800

----------------------------------------------------------------------
 go/lucy/index_test.go | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/bfe8a347/go/lucy/index_test.go
----------------------------------------------------------------------
diff --git a/go/lucy/index_test.go b/go/lucy/index_test.go
index e75ede4..ebf5d25 100644
--- a/go/lucy/index_test.go
+++ b/go/lucy/index_test.go
@@ -833,3 +833,17 @@ func TestHighlightReaderMisc(t *testing.T) {
 	}
 	runDataReaderCommon(t, reader, true)
 }
+
+func TestDeletionsReaderMisc(t *testing.T) {
+	folder := createTestIndex("a", "b", "c")
+	ixReader, _ := OpenIndexReader(folder, nil, nil)
+	segReaders := ixReader.SegReaders()
+	delReader := segReaders[0].Fetch("Lucy::Index::DeletionsReader").(DeletionsReader)
+	if count := delReader.delCount(); count != 0 {
+		t.Errorf("delCount: %d", count);
+	}
+	if matcher := delReader.iterator(); matcher == nil {
+		t.Errorf("iterator: %#v", matcher)
+	}
+	runDataReaderCommon(t, delReader, true)
+}


[12/16] lucy git commit: Tune and test Go bindings for PostingListReader.

Posted by ma...@apache.org.
Tune and test Go bindings for PostingListReader.


Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/e5e4232b
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/e5e4232b
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/e5e4232b

Branch: refs/heads/master
Commit: e5e4232b6c0c8d22f46c6db5430fb92ee949c855
Parents: 3358bc2
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Thu Dec 10 19:03:15 2015 -0800
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Thu Dec 10 19:04:59 2015 -0800

----------------------------------------------------------------------
 go/build.go           |  4 ++++
 go/lucy/index.go      | 16 ++++++++++++++++
 go/lucy/index_test.go | 19 ++++++++++++++++++-
 3 files changed, 38 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/e5e4232b/go/build.go
----------------------------------------------------------------------
diff --git a/go/build.go b/go/build.go
index 36b487d..604a9a9 100644
--- a/go/build.go
+++ b/go/build.go
@@ -224,6 +224,10 @@ func specClasses(parcel *cfc.Parcel) {
 	lexReaderBinding.SpecMethod("Fetch_Term_Info", "fetchTermInfo(string, interface{}) (TermInfo, error)")
 	lexReaderBinding.Register()
 
+	pListReaderBinding := cfc.NewGoClass(parcel, "Lucy::Index::PostingListReader")
+	pListReaderBinding.SpecMethod("Posting_List", "PostingList(string, interface{}) (PostingList, error)")
+	pListReaderBinding.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/e5e4232b/go/lucy/index.go
----------------------------------------------------------------------
diff --git a/go/lucy/index.go b/go/lucy/index.go
index a0e3396..1f5a752 100644
--- a/go/lucy/index.go
+++ b/go/lucy/index.go
@@ -22,6 +22,7 @@ package lucy
 #include "Lucy/Index/DataReader.h"
 #include "Lucy/Index/DocReader.h"
 #include "Lucy/Index/LexiconReader.h"
+#include "Lucy/Index/PostingListReader.h"
 #include "Lucy/Index/HighlightReader.h"
 #include "Lucy/Index/SortReader.h"
 #include "Lucy/Index/IndexManager.h"
@@ -529,6 +530,21 @@ func (lr *LexiconReaderIMP) fetchTermInfo(field string, term interface{}) (retva
 	return retval, err
 }
 
+func (p *PostingListReaderIMP) PostingList(field string, term interface{}) (retval PostingList, err error) {
+	err = clownfish.TrapErr(func() {
+		self := (*C.lucy_PostingListReader)(clownfish.Unwrap(p, "p"))
+		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_PListReader_Posting_List(self, fieldC, termC)
+		if retvalCF != nil {
+			retval = clownfish.ToGo(unsafe.Pointer(retvalCF)).(PostingList)
+		}
+	})
+	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/e5e4232b/go/lucy/index_test.go
----------------------------------------------------------------------
diff --git a/go/lucy/index_test.go b/go/lucy/index_test.go
index 18d1e22..0143fcf 100644
--- a/go/lucy/index_test.go
+++ b/go/lucy/index_test.go
@@ -681,7 +681,7 @@ func TestPostingListBasics(t *testing.T) {
 	ixReader, _ := OpenIndexReader(folder, nil, nil)
 	segReaders := ixReader.SegReaders()
 	pListReader := segReaders[0].Fetch("Lucy::Index::PostingListReader").(PostingListReader)
-	pList := pListReader.PostingList("content", nil)
+	pList, _ := pListReader.PostingList("content", nil)
 	pList.Seek("b")
 	if docFreq := pList.GetDocFreq(); docFreq != 2 {
 		t.Errorf("GetDocFreq: %d", docFreq)
@@ -849,6 +849,23 @@ func TestLexReaderMisc(t *testing.T) {
 	runDataReaderCommon(t, lexReader, false)
 }
 
+func TestPostingListReaderMisc(t *testing.T) {
+	folder := createTestIndex("a", "b", "c")
+	ixReader, _ := OpenIndexReader(folder, nil, nil)
+	segReaders := ixReader.SegReaders()
+	pListReader := segReaders[0].Fetch("Lucy::Index::PostingListReader").(PostingListReader)
+	if got, err := pListReader.PostingList("content", nil); got == nil || err != nil {
+		t.Errorf("PostingList should succeed: %v", err)
+	}
+	if got, err := pListReader.PostingList("content", "foo"); got == nil || err != nil {
+		t.Errorf("PostingList with term should succeed: %v", err)
+	}
+	if got, err := pListReader.PostingList("nope", nil); got != nil || err != nil {
+		t.Errorf("PostingList for non-field should return nil: %v", err)
+	}
+	runDataReaderCommon(t, pListReader, false)
+}
+
 func TestHighlightReaderMisc(t *testing.T) {
 	folder := createTestIndex("a", "b", "c")
 	ixReader, _ := OpenIndexReader(folder, nil, nil)


[07/16] lucy git commit: Suppress SegReader and PolyReader Go ctors.

Posted by ma...@apache.org.
Suppress SegReader and PolyReader Go ctors.

For now, providing lucy.OpenIndexReader is enough.


Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/6deeba86
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/6deeba86
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/6deeba86

Branch: refs/heads/master
Commit: 6deeba866eab0ffa1a6ad875a2d8912f16c9ae8b
Parents: fe25122
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Thu Dec 10 16:08:33 2015 -0800
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Thu Dec 10 18:22:54 2015 -0800

----------------------------------------------------------------------
 go/build.go | 8 ++++++++
 1 file changed, 8 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/6deeba86/go/build.go
----------------------------------------------------------------------
diff --git a/go/build.go b/go/build.go
index fc104dc..30a4703 100644
--- a/go/build.go
+++ b/go/build.go
@@ -197,6 +197,14 @@ func specClasses(parcel *cfc.Parcel) {
 	ixReaderBinding.SpecMethod("Obtain", "Obtain(string) (DataReader, error)")
 	ixReaderBinding.Register()
 
+	polyReaderBinding := cfc.NewGoClass(parcel, "Lucy::Index::PolyReader")
+	polyReaderBinding.SetSuppressCtor(true)
+	polyReaderBinding.Register()
+
+	segReaderBinding := cfc.NewGoClass(parcel, "Lucy::Index::SegReader")
+	segReaderBinding.SetSuppressCtor(true)
+	segReaderBinding.Register()
+
 	docReaderBinding := cfc.NewGoClass(parcel, "Lucy::Index::DocReader")
 	docReaderBinding.SpecMethod("", "ReadDoc(int32, interface{}) error")
 	docReaderBinding.SpecMethod("Fetch_Doc", "FetchDoc(int32) (HitDoc, error)")


[04/16] lucy git commit: Tune and test Go bindings for DocReader.

Posted by ma...@apache.org.
Tune and test Go bindings for DocReader.


Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/c1cdb4d7
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/c1cdb4d7
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/c1cdb4d7

Branch: refs/heads/master
Commit: c1cdb4d7912d0105ad5e00491769111eb8991d0b
Parents: 38bea5a
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Tue Dec 8 19:17:24 2015 -0800
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Thu Dec 10 18:22:53 2015 -0800

----------------------------------------------------------------------
 go/build.go           |  6 ++++++
 go/lucy/index.go      | 23 +++++++++++++++++++++++
 go/lucy/index_test.go | 23 +++++++++++++++++++++++
 go/lucy/lucy.go       | 21 ++-------------------
 go/lucy/search.go     |  2 +-
 5 files changed, 55 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/c1cdb4d7/go/build.go
----------------------------------------------------------------------
diff --git a/go/build.go b/go/build.go
index 2bdab37..801654a 100644
--- a/go/build.go
+++ b/go/build.go
@@ -191,6 +191,12 @@ func specClasses(parcel *cfc.Parcel) {
 	dataReaderBinding.SpecMethod("Close", "Close() error")
 	dataReaderBinding.Register()
 
+
+	docReaderBinding := cfc.NewGoClass(parcel, "Lucy::Index::DocReader")
+	docReaderBinding.SpecMethod("", "ReadDoc(int32, interface{}) error")
+	docReaderBinding.SpecMethod("Fetch_Doc", "FetchDoc(int32) (HitDoc, error)")
+	docReaderBinding.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/c1cdb4d7/go/lucy/index.go
----------------------------------------------------------------------
diff --git a/go/lucy/index.go b/go/lucy/index.go
index defa9f2..18d5ba1 100644
--- a/go/lucy/index.go
+++ b/go/lucy/index.go
@@ -19,6 +19,7 @@ package lucy
 /*
 #include "Lucy/Index/Indexer.h"
 #include "Lucy/Index/DataReader.h"
+#include "Lucy/Index/DocReader.h"
 #include "Lucy/Index/IndexManager.h"
 #include "Lucy/Index/BackgroundMerger.h"
 #include "Lucy/Index/TermVector.h"
@@ -459,3 +460,25 @@ func (d *DataReaderIMP) Close() error {
 		C.LUCY_DataReader_Close(self)
 	})
 }
+
+func (d *DocReaderIMP) ReadDoc(docID int32, doc interface{}) error {
+	self := (*C.lucy_DocReader)(clownfish.Unwrap(d, "d"))
+	class := clownfish.GetClass(d)
+	classC := ((*C.cfish_Class)(clownfish.Unwrap(class, "class")))
+	if classC == C.LUCY_DEFAULTDOCREADER {
+		return doReadDocData((*C.lucy_DefaultDocReader)(self), docID, doc)
+	} else if classC == C.LUCY_POLYDOCREADER {
+		return readDocPolyDR((*C.lucy_PolyDocReader)(self), docID, doc)
+	} else {
+		panic(clownfish.NewErr(fmt.Sprintf("Unexpected type: %s", class.GetName)))
+	}
+}
+
+func (d *DocReaderIMP) FetchDoc(docID int32) (doc HitDoc, err error) {
+	err = clownfish.TrapErr(func() {
+		self := (*C.lucy_DocReader)(clownfish.Unwrap(d, "d"))
+		docC := C.LUCY_DocReader_Fetch_Doc(self, C.int32_t(docID))
+		doc = WRAPHitDoc(unsafe.Pointer(docC))
+	})
+	return doc, err
+}

http://git-wip-us.apache.org/repos/asf/lucy/blob/c1cdb4d7/go/lucy/index_test.go
----------------------------------------------------------------------
diff --git a/go/lucy/index_test.go b/go/lucy/index_test.go
index 40609e6..8934167 100644
--- a/go/lucy/index_test.go
+++ b/go/lucy/index_test.go
@@ -750,3 +750,26 @@ func TestIndexReaderMisc(t *testing.T) {
 	reader := searcher.GetReader()
 	runDataReaderCommon(t, reader, false)
 }
+
+func TestDefaultDocReaderMisc(t *testing.T) {
+	folder := createTestIndex("a", "b", "c")
+	searcher, _ := OpenIndexSearcher(folder)
+	segReaders := searcher.GetReader().SegReaders()
+	reader := segReaders[0].(SegReader).Obtain("Lucy::Index::DocReader").(DefaultDocReader)
+	doc := make(map[string]interface{})
+	if err := reader.ReadDoc(2, doc); err != nil {
+		t.Errorf("ReadDoc: %v", err)
+	}
+	runDataReaderCommon(t, reader, true)
+}
+
+func TestPolyDocReaderMisc(t *testing.T) {
+	folder := createTestIndex("a", "b", "c")
+	searcher, _ := OpenIndexSearcher(folder)
+	reader := searcher.GetReader().Obtain("Lucy::Index::DocReader").(PolyDocReader)
+	doc := make(map[string]interface{})
+	if err := reader.ReadDoc(2, doc); err != nil {
+		t.Errorf("ReadDoc: %v", err)
+	}
+	runDataReaderCommon(t, reader, true)
+}

http://git-wip-us.apache.org/repos/asf/lucy/blob/c1cdb4d7/go/lucy/lucy.go
----------------------------------------------------------------------
diff --git a/go/lucy/lucy.go b/go/lucy/lucy.go
index 03307bb..175ceee 100644
--- a/go/lucy/lucy.go
+++ b/go/lucy/lucy.go
@@ -383,20 +383,8 @@ func fetchEntry(ivars *C.lucy_InverterIVARS, fieldGo string) *C.lucy_InverterEnt
 	return (*C.lucy_InverterEntry)(unsafe.Pointer(entry))
 }
 
-func fetchDocFromDocReader(dr DocReader, docID int32, doc interface{}) error {
-	switch v := dr.(type) {
-	case *DefaultDocReaderIMP:
-		return v.readDoc(docID, doc)
-	case *PolyDocReaderIMP:
-		return v.readDoc(docID, doc)
-	default:
-		panic(clownfish.NewErr(fmt.Sprintf("Unexpected type: %T", v)))
-	}
-}
-
-func (pdr *PolyDocReaderIMP) readDoc(docID int32, doc interface{}) error {
-	self := (*C.lucy_PolyDocReader)(clownfish.Unwrap(pdr, "pdr"))
-	ivars := C.lucy_PolyDocReader_IVARS(self)
+func readDocPolyDR(pdr *C.lucy_PolyDocReader, docID int32, doc interface{}) error {
+	ivars := C.lucy_PolyDocReader_IVARS(pdr)
 	segTick := C.lucy_PolyReader_sub_tick(ivars.offsets, C.int32_t(docID))
 	offset := C.LUCY_I32Arr_Get(ivars.offsets, segTick)
 	defDocReader := (*C.lucy_DefaultDocReader)(C.CFISH_Vec_Fetch(ivars.readers, C.size_t(segTick)))
@@ -414,11 +402,6 @@ func (pdr *PolyDocReaderIMP) readDoc(docID int32, doc interface{}) error {
 	return err
 }
 
-func (ddr *DefaultDocReaderIMP) readDoc(docID int32, doc interface{}) error {
-	self := (*C.lucy_DefaultDocReader)(clownfish.Unwrap(ddr, "ddr"))
-	return doReadDocData(self, docID, doc)
-}
-
 func setMapField(store interface{}, field string, val interface{}) error {
 	m := store.(map[string]interface{})
 	m[field] = val

http://git-wip-us.apache.org/repos/asf/lucy/blob/c1cdb4d7/go/lucy/search.go
----------------------------------------------------------------------
diff --git a/go/lucy/search.go b/go/lucy/search.go
index e202b9d..3f7845c 100644
--- a/go/lucy/search.go
+++ b/go/lucy/search.go
@@ -88,7 +88,7 @@ func (s *SearcherIMP) ReadDoc(docID int32, doc interface{}) error {
 			return clownfish.NewErr("No DocReader available")
 		}
 		docReaderGo := clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(docReader)))).(DocReader)
-		return fetchDocFromDocReader(docReaderGo, docID, doc)
+		return docReaderGo.ReadDoc(docID, doc)
 	} else {
 		return clownfish.NewErr("Support for ReadDoc not implemented")
 	}


[02/16] lucy git commit: Test Go bindings for PostingList.

Posted by ma...@apache.org.
Test Go bindings for PostingList.


Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/a693aa1d
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/a693aa1d
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/a693aa1d

Branch: refs/heads/master
Commit: a693aa1decaff2b4e33eaacc180cf95b680d8317
Parents: 932c211
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Thu Dec 3 17:37:07 2015 -0800
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Thu Dec 10 16:01:49 2015 -0800

----------------------------------------------------------------------
 go/lucy/index_test.go | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/a693aa1d/go/lucy/index_test.go
----------------------------------------------------------------------
diff --git a/go/lucy/index_test.go b/go/lucy/index_test.go
index 2df680f..5affb0d 100644
--- a/go/lucy/index_test.go
+++ b/go/lucy/index_test.go
@@ -675,3 +675,27 @@ func TestLexiconBasics(t *testing.T) {
 		t.Errorf("Next after Reset")
 	}
 }
+
+func TestPostingListBasics(t *testing.T) {
+	folder := createTestIndex("c", "b b b", "a", "b",)
+	searcher, _ := OpenIndexSearcher(folder)
+	segReaders := searcher.GetReader().SegReaders()
+	pListReader := segReaders[0].(SegReader).Obtain("Lucy::Index::PostingListReader").(PostingListReader)
+	pList := pListReader.PostingList("content", nil)
+	pList.Seek("b")
+	if docFreq := pList.GetDocFreq(); docFreq != 2 {
+		t.Errorf("GetDocFreq: %d", docFreq)
+	}
+	if got := pList.Next(); got != 2 {
+		t.Errorf("Next: %d", got)
+	}
+	if docID := pList.GetDocID(); docID != 2 {
+		t.Errorf("GetDocID: %d", docID)
+	}
+	if got := pList.Next(); got != 4 {
+		t.Errorf("Next (second iter): %d", got)
+	}
+	if got := pList.Next(); got != 0 {
+		t.Error("Next (done): %d", got)
+	}
+}


[08/16] lucy git commit: Tune and test Go bindings for IndexReader.

Posted by ma...@apache.org.
Tune and test Go bindings for IndexReader.


Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/fe25122f
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/fe25122f
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/fe25122f

Branch: refs/heads/master
Commit: fe25122fadcb9115ddd0810e9986898048e5303e
Parents: c1cdb4d
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Tue Dec 8 20:33:58 2015 -0800
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Thu Dec 10 18:22:54 2015 -0800

----------------------------------------------------------------------
 go/build.go            |  5 +++
 go/lucy/index.go       | 47 +++++++++++++++++++++++++++
 go/lucy/index_test.go  | 78 +++++++++++++++++++++++++++++++++++----------
 go/lucy/search_test.go |  9 +++---
 4 files changed, 118 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/fe25122f/go/build.go
----------------------------------------------------------------------
diff --git a/go/build.go b/go/build.go
index 801654a..fc104dc 100644
--- a/go/build.go
+++ b/go/build.go
@@ -191,6 +191,11 @@ func specClasses(parcel *cfc.Parcel) {
 	dataReaderBinding.SpecMethod("Close", "Close() error")
 	dataReaderBinding.Register()
 
+	ixReaderBinding := cfc.NewGoClass(parcel, "Lucy::Index::IndexReader")
+	ixReaderBinding.SpecMethod("Seg_Readers", "SegReaders() []SegReader")
+	ixReaderBinding.SpecMethod("Offsets", "Offsets() []int32")
+	ixReaderBinding.SpecMethod("Obtain", "Obtain(string) (DataReader, error)")
+	ixReaderBinding.Register()
 
 	docReaderBinding := cfc.NewGoClass(parcel, "Lucy::Index::DocReader")
 	docReaderBinding.SpecMethod("", "ReadDoc(int32, interface{}) error")

http://git-wip-us.apache.org/repos/asf/lucy/blob/fe25122f/go/lucy/index.go
----------------------------------------------------------------------
diff --git a/go/lucy/index.go b/go/lucy/index.go
index 18d5ba1..67d4b47 100644
--- a/go/lucy/index.go
+++ b/go/lucy/index.go
@@ -18,6 +18,7 @@ package lucy
 
 /*
 #include "Lucy/Index/Indexer.h"
+#include "Lucy/Index/IndexReader.h"
 #include "Lucy/Index/DataReader.h"
 #include "Lucy/Index/DocReader.h"
 #include "Lucy/Index/IndexManager.h"
@@ -482,3 +483,49 @@ func (d *DocReaderIMP) FetchDoc(docID int32) (doc HitDoc, err error) {
 	})
 	return doc, err
 }
+
+func OpenIndexReader(index interface{}, snapshot Snapshot, manager IndexManager) (retval IndexReader, err error) {
+	err = clownfish.TrapErr(func() {
+		indexC := (*C.cfish_Obj)(clownfish.GoToClownfish(index, unsafe.Pointer(C.CFISH_OBJ), false))
+		defer C.cfish_decref(unsafe.Pointer(indexC))
+		snapshotC := (*C.lucy_Snapshot)(clownfish.UnwrapNullable(snapshot))
+		managerC := (*C.lucy_IndexManager)(clownfish.UnwrapNullable(manager))
+		cfObj := C.lucy_IxReader_open(indexC, snapshotC, managerC)
+		retval = clownfish.WRAPAny(unsafe.Pointer(cfObj)).(IndexReader)
+	})
+	return retval, err
+}
+
+func (r *IndexReaderIMP) SegReaders() []SegReader {
+	self := (*C.lucy_IndexReader)(clownfish.Unwrap(r, "r"))
+	retvalCF := C.LUCY_IxReader_Seg_Readers(self);
+	defer C.cfish_decref(unsafe.Pointer(retvalCF))
+	if retvalCF == nil {
+		return nil
+	}
+	size := C.CFISH_Vec_Get_Size(retvalCF)
+	retval := make([]SegReader, int(size))
+	for i := 0; i < int(size); i++ {
+		elem := unsafe.Pointer(C.CFISH_Vec_Fetch(retvalCF, C.size_t(i)))
+		retval[i] = clownfish.ToGo(unsafe.Pointer(C.cfish_incref(elem))).(SegReader)
+	}
+	return retval
+}
+
+func (r *IndexReaderIMP) Offsets() []int32 {
+	self := (*C.lucy_IndexReader)(clownfish.Unwrap(r, "r"))
+	retvalCF := C.LUCY_IxReader_Offsets(self)
+	defer C.cfish_decref(unsafe.Pointer(retvalCF))
+	return i32ArrayToSlice(retvalCF)
+}
+
+func (r *IndexReaderIMP) Obtain(api string) (retval DataReader, err error) {
+	err = clownfish.TrapErr(func() {
+		self := (*C.lucy_IndexReader)(clownfish.Unwrap(r, "r"))
+		apiC := (*C.cfish_String)(clownfish.GoToClownfish(api, unsafe.Pointer(C.CFISH_STRING), false))
+		defer C.cfish_decref(unsafe.Pointer(apiC))
+		retvalCF := C.LUCY_IxReader_Obtain(self, apiC)
+		retval = clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(retvalCF)))).(DataReader)
+	})
+	return retval, err
+}

http://git-wip-us.apache.org/repos/asf/lucy/blob/fe25122f/go/lucy/index_test.go
----------------------------------------------------------------------
diff --git a/go/lucy/index_test.go b/go/lucy/index_test.go
index 8934167..e44bb09 100644
--- a/go/lucy/index_test.go
+++ b/go/lucy/index_test.go
@@ -400,9 +400,9 @@ func TestSortCacheMisc(t *testing.T) {
 	indexer.AddDoc(make(map[string]interface{}))
 	indexer.Commit()
 
-	searcher, _ := OpenIndexSearcher(folder)
-	segReaders := searcher.GetReader().SegReaders()
-	sortReader := segReaders[0].(SegReader).Obtain("Lucy::Index::SortReader").(SortReader)
+	ixReader, _ := OpenIndexReader(folder, nil, nil)
+	segReaders := ixReader.SegReaders()
+	sortReader := segReaders[0].Fetch("Lucy::Index::SortReader").(SortReader)
 	sortCache := sortReader.fetchSortCache("content")
 
 	if card := sortCache.GetCardinality(); card != 4 {
@@ -646,9 +646,9 @@ func TestInverterMisc(t *testing.T) {
 // Use SegLexicon to air out the Lexicon interface.
 func TestLexiconBasics(t *testing.T) {
 	folder := createTestIndex("a", "b", "c")
-	searcher, _ := OpenIndexSearcher(folder)
-	segReaders := searcher.GetReader().SegReaders()
-	lexReader := segReaders[0].(SegReader).Obtain("Lucy::Index::LexiconReader").(LexiconReader)
+	ixReader, _ := OpenIndexReader(folder, nil, nil)
+	segReaders := ixReader.SegReaders()
+	lexReader := segReaders[0].Fetch("Lucy::Index::LexiconReader").(LexiconReader)
 	segLex := lexReader.Lexicon("content", nil).(Lexicon)
 	if field := segLex.getField(); field != "content" {
 		t.Errorf("getField: %s", field)
@@ -678,9 +678,9 @@ func TestLexiconBasics(t *testing.T) {
 
 func TestPostingListBasics(t *testing.T) {
 	folder := createTestIndex("c", "b b b", "a", "b",)
-	searcher, _ := OpenIndexSearcher(folder)
-	segReaders := searcher.GetReader().SegReaders()
-	pListReader := segReaders[0].(SegReader).Obtain("Lucy::Index::PostingListReader").(PostingListReader)
+	ixReader, _ := OpenIndexReader(folder, nil, nil)
+	segReaders := ixReader.SegReaders()
+	pListReader := segReaders[0].Fetch("Lucy::Index::PostingListReader").(PostingListReader)
 	pList := pListReader.PostingList("content", nil)
 	pList.Seek("b")
 	if docFreq := pList.GetDocFreq(); docFreq != 2 {
@@ -746,16 +746,62 @@ func runDataReaderCommon(t *testing.T, reader DataReader, runAggregator bool) {
 
 func TestIndexReaderMisc(t *testing.T) {
 	folder := createTestIndex("a", "b", "c")
-	searcher, _ := OpenIndexSearcher(folder)
-	reader := searcher.GetReader()
+	reader, _ := OpenIndexReader(folder, nil, nil)
+	if segReaders := reader.SegReaders(); len(segReaders) != 1 {
+		t.Errorf("SegReaders: %#v", segReaders)
+	}
+	if offsets := reader.Offsets(); offsets[0] != 0 {
+		t.Errorf("Offsets: %#v", offsets)
+	}
+	if got, err := reader.Obtain("Lucy::Index::DocReader"); got == nil || err != nil {
+		t.Errorf("Obtain should succeed for DocReader: %#v, %v", got, err)
+	}
+	if got, err := reader.Obtain("Nope"); got != nil || err == nil {
+		t.Errorf("Obtain should fail for non-existent API name: %v", err)
+	}
+	if got := reader.Fetch("Lucy::Index::DocReader"); got == nil  {
+		t.Errorf("Fetch should succeed for DocReader")
+	}
+	if got := reader.Fetch("Nope"); got != nil {
+		t.Errorf("Fetch should return nil for non-existent API name: %v", got)
+	}
+	if got := reader.DocMax(); got != 3 {
+		t.Errorf("DocMax: %d", got);
+	}
+	if got := reader.DocCount(); got != 3 {
+		t.Errorf("DocCount: %d", got);
+	}
+	if got := reader.DelCount(); got != 0 {
+		t.Errorf("DelCount: %d", got);
+	}
 	runDataReaderCommon(t, reader, false)
 }
 
+func TestIndexReaderOpen(t *testing.T) {
+	folder := createTestIndex("a", "b", "c")
+	if got, err := OpenIndexReader(folder, nil, nil); got == nil || err != nil {
+		t.Errorf("nil Snapshot and IndexManager: %v", err)
+	}
+	snapshot := NewSnapshot()
+	snapshot.ReadFile(folder, "")
+	if got, err := OpenIndexReader(folder, snapshot, nil); got == nil || err != nil {
+		t.Errorf("With Snapshot: %v", err)
+	}
+	manager := NewIndexManager("", nil)
+	manager.SetFolder(folder)
+	if got, err := OpenIndexReader(folder, nil, manager); got == nil || err != nil {
+		t.Errorf("With IndexManager: %v", err)
+	}
+	if got, err := OpenIndexReader("no-index-here", nil, nil); got != nil || err == nil {
+		t.Errorf("Non-existent index path")
+	}
+}
+
 func TestDefaultDocReaderMisc(t *testing.T) {
 	folder := createTestIndex("a", "b", "c")
-	searcher, _ := OpenIndexSearcher(folder)
-	segReaders := searcher.GetReader().SegReaders()
-	reader := segReaders[0].(SegReader).Obtain("Lucy::Index::DocReader").(DefaultDocReader)
+	ixReader, _ := OpenIndexReader(folder, nil, nil)
+	segReaders := ixReader.SegReaders()
+	reader := segReaders[0].Fetch("Lucy::Index::DocReader").(DefaultDocReader)
 	doc := make(map[string]interface{})
 	if err := reader.ReadDoc(2, doc); err != nil {
 		t.Errorf("ReadDoc: %v", err)
@@ -765,8 +811,8 @@ func TestDefaultDocReaderMisc(t *testing.T) {
 
 func TestPolyDocReaderMisc(t *testing.T) {
 	folder := createTestIndex("a", "b", "c")
-	searcher, _ := OpenIndexSearcher(folder)
-	reader := searcher.GetReader().Obtain("Lucy::Index::DocReader").(PolyDocReader)
+	ixReader, _ := OpenIndexReader(folder, nil, nil)
+	reader := ixReader.Fetch("Lucy::Index::DocReader").(PolyDocReader)
 	doc := make(map[string]interface{})
 	if err := reader.ReadDoc(2, doc); err != nil {
 		t.Errorf("ReadDoc: %v", err)

http://git-wip-us.apache.org/repos/asf/lucy/blob/fe25122f/go/lucy/search_test.go
----------------------------------------------------------------------
diff --git a/go/lucy/search_test.go b/go/lucy/search_test.go
index 3d4fc50..5061a24 100644
--- a/go/lucy/search_test.go
+++ b/go/lucy/search_test.go
@@ -369,12 +369,11 @@ func TestNoMatchMatcherBasics(t *testing.T) {
 
 func TestRangeMatcherBasics(t *testing.T) {
 	index := createTestIndex("d", "c", "b", "a", "a", "a", "a")
-	searcher, _ := OpenIndexSearcher(index)
-	segReaders := searcher.GetReader().SegReaders()
-	segReader := segReaders[0].(SegReader)
-	sortReader := segReader.Obtain("Lucy::Index::SortReader").(SortReader)
+	ixReader, _ := OpenIndexReader(index, nil, nil)
+	segReaders := ixReader.SegReaders()
+	sortReader := segReaders[0].Fetch("Lucy::Index::SortReader").(SortReader)
 	sortCache := sortReader.fetchSortCache("content")
-	matcher := NewRangeMatcher(0, 0, sortCache, segReader.DocMax())
+	matcher := NewRangeMatcher(0, 0, sortCache, segReaders[0].DocMax())
 	if docID := matcher.Next(); docID != 4 {
 		t.Errorf("Next: %d", docID)
 	}


[14/16] lucy git commit: Tune and test Go bindings for DeletionsWriter.

Posted by ma...@apache.org.
Tune and test Go bindings for DeletionsWriter.


Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/29320549
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/29320549
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/29320549

Branch: refs/heads/master
Commit: 2932054958f0fc785d13d1bbfe59dee9ce42ef00
Parents: 362aedd
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Mon Dec 21 09:04:49 2015 -0800
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Mon Dec 21 09:04:49 2015 -0800

----------------------------------------------------------------------
 go/build.go           |  8 ++++++++
 go/lucy/index.go      | 50 ++++++++++++++++++++++++++++++++++++++++++++++
 go/lucy/index_test.go | 30 ++++++++++++++++++++++++++++
 3 files changed, 88 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/29320549/go/build.go
----------------------------------------------------------------------
diff --git a/go/build.go b/go/build.go
index f78aa5f..82bcd9c 100644
--- a/go/build.go
+++ b/go/build.go
@@ -236,6 +236,14 @@ func specClasses(parcel *cfc.Parcel) {
 	dwBinding.SpecMethod("Finish", "Finish() error")
 	dwBinding.Register()
 
+	delWriterBinding := cfc.NewGoClass(parcel, "Lucy::Index::DeletionsWriter")
+	delWriterBinding.SpecMethod("Delete_By_Term", "DeleteByTerm(string, interface{}) error")
+	delWriterBinding.SpecMethod("Delete_By_Query", "DeleteByQuery(Query) error")
+	delWriterBinding.SpecMethod("Delete_By_Doc_ID", "deleteByDocID(int32) error")
+	delWriterBinding.SpecMethod("Generate_Doc_Map", "generateDocMap(Matcher, int32, int32) ([]int32, error)")
+	delWriterBinding.SpecMethod("Seg_Deletions", "segDeletions(SegReader) (Matcher, error)")
+	delWriterBinding.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/29320549/go/lucy/index.go
----------------------------------------------------------------------
diff --git a/go/lucy/index.go b/go/lucy/index.go
index 0444a30..67ec832 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/DataWriter.h"
+#include "Lucy/Index/DeletionsWriter.h"
 #include "Lucy/Index/DocReader.h"
 #include "Lucy/Index/LexiconReader.h"
 #include "Lucy/Index/PostingListReader.h"
@@ -279,6 +280,55 @@ func (d *DataWriterIMP) Finish() error {
 	})
 }
 
+func (d *DeletionsWriterIMP) DeleteByTerm(field string, term interface{}) error {
+	return clownfish.TrapErr(func() {
+		self := (*C.lucy_DeletionsWriter)(clownfish.Unwrap(d, "d"))
+		fieldCF := (*C.cfish_String)(clownfish.GoToClownfish(field, unsafe.Pointer(C.CFISH_STRING), false))
+		defer C.cfish_decref(unsafe.Pointer(fieldCF))
+		termCF := (*C.cfish_Obj)(clownfish.GoToClownfish(term, unsafe.Pointer(C.CFISH_OBJ), false))
+		defer C.cfish_decref(unsafe.Pointer(termCF))
+		C.LUCY_DelWriter_Delete_By_Term(self, fieldCF, termCF)
+	})
+}
+
+func (d *DeletionsWriterIMP) DeleteByQuery(query Query) error {
+	return clownfish.TrapErr(func() {
+		self := (*C.lucy_DeletionsWriter)(clownfish.Unwrap(d, "d"))
+		queryCF := (*C.lucy_Query)(clownfish.Unwrap(query, "query"))
+		C.LUCY_DelWriter_Delete_By_Query(self, queryCF)
+	})
+}
+
+func (d *DeletionsWriterIMP) deleteByDocID(docId int32) error {
+	return clownfish.TrapErr(func() {
+		self := (*C.lucy_DeletionsWriter)(clownfish.Unwrap(d, "d"))
+		C.LUCY_DelWriter_Delete_By_Doc_ID(self, C.int32_t(docId))
+	})
+}
+
+func (d *DeletionsWriterIMP) generateDocMap(deletions Matcher, docMax int32, offset int32) (retval []int32, err error) {
+	err = clownfish.TrapErr(func() {
+		self := (*C.lucy_DeletionsWriter)(clownfish.Unwrap(d, "d"))
+		deletionsCF := (*C.lucy_Matcher)(clownfish.Unwrap(deletions, "deletions"))
+		retvalCF := C.LUCY_DelWriter_Generate_Doc_Map(self, deletionsCF, C.int32_t(docMax), C.int32_t(offset))
+		defer C.cfish_decref(unsafe.Pointer(retvalCF))
+		retval = i32ArrayToSlice(retvalCF)
+	})
+	return retval, err
+}
+
+func (d *DeletionsWriterIMP) segDeletions(segReader SegReader) (retval Matcher, err error) {
+	err = clownfish.TrapErr(func() {
+		self := (*C.lucy_DeletionsWriter)(clownfish.Unwrap(d, "d"))
+		segReaderCF := (*C.lucy_SegReader)(clownfish.Unwrap(segReader, "segReader"))
+		retvalCF := C.LUCY_DelWriter_Seg_Deletions(self, segReaderCF)
+		if retvalCF != nil {
+			retval = clownfish.WRAPAny(unsafe.Pointer(retvalCF)).(Matcher)
+		}
+	})
+	return retval, err
+}
+
 func OpenBackgroundMerger(index interface{}, manager IndexManager) (bgm BackgroundMerger, err error) {
 	err = clownfish.TrapErr(func() {
 		indexC := (*C.cfish_Obj)(clownfish.GoToClownfish(index, unsafe.Pointer(C.CFISH_OBJ), false))

http://git-wip-us.apache.org/repos/asf/lucy/blob/29320549/go/lucy/index_test.go
----------------------------------------------------------------------
diff --git a/go/lucy/index_test.go b/go/lucy/index_test.go
index f71cb2f..9f2aca9 100644
--- a/go/lucy/index_test.go
+++ b/go/lucy/index_test.go
@@ -964,3 +964,33 @@ func runDataWriterCommon(t *testing.T, api string) {
 func TestSortWriterMisc(t *testing.T) {
 	runDataWriterCommon(t, "Lucy::Index::SortWriter")
 }
+
+func TestDeletionsWriterMisc(t *testing.T) {
+	index := createTestIndex("a", "b", "c")
+	indexer, _ := OpenIndexer(&OpenIndexerArgs{Index: index})
+	delWriter := indexer.getSegWriter().Fetch("Lucy::Index::DeletionsWriter").(DeletionsWriter)
+	if delWriter.Updated() {
+		t.Errorf("Not yet updated")
+	}
+
+	if err := delWriter.DeleteByTerm("content", "a"); err != nil {
+		t.Errorf("DeleteByTerm: %v", err)
+	}
+	if err := delWriter.DeleteByQuery(NewTermQuery("content", "b")); err != nil {
+		t.Errorf("DeleteByQuery: %v", err)
+	}
+	if err := delWriter.deleteByDocID(3); err != nil {
+		t.Errorf("deleteByDocID: %v", err)
+	}
+	if !delWriter.Updated() {
+		t.Errorf("Now we're updated")
+	}
+
+	if got := delWriter.SegDelCount("seg_1"); got != 3 {
+		t.Errorf("SegDelCount: %d", got)
+	}
+	segReaders := delWriter.GetPolyReader().SegReaders()
+	if dels, err := delWriter.segDeletions(segReaders[0]); dels == nil || err != nil {
+		t.Errorf("segDeletions: %v", err)
+	}
+}