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/05/07 00:10:56 UTC

[1/2] lucy git commit: Adapt for v4 of Go proof-of-concept bindings.

Repository: lucy
Updated Branches:
  refs/heads/master d460538f2 -> 45c870ba2


Adapt for v4 of Go proof-of-concept bindings.

See CLOWNFISH-28-Go-POC-v4.

*   Make structs public: `FooIMP` instead of `implFoo`.
*   Embed parent structs.
*   Make `ref` a `uintptr` instead of a pointer to a C type.
*   Add the INITOBJ method to ObjIMP.
*   Eliminate all downstream finalizers and TOPTR() implementations.


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

Branch: refs/heads/master
Commit: 9330b149f936c9431e1c8f4055b4b6366a552d91
Parents: be1b383
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Fri May 1 19:16:04 2015 -0700
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Fri May 1 19:16:40 2015 -0700

----------------------------------------------------------------------
 go/lucy/analysis.go | 22 +++++------------
 go/lucy/index.go    | 48 +++++++++++++-----------------------
 go/lucy/plan.go     | 45 ++++++++++------------------------
 go/lucy/search.go   | 64 ++++++++++++++++++++----------------------------
 4 files changed, 62 insertions(+), 117 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/9330b149/go/lucy/analysis.go
----------------------------------------------------------------------
diff --git a/go/lucy/analysis.go b/go/lucy/analysis.go
index 1da55d6..6fbd522 100644
--- a/go/lucy/analysis.go
+++ b/go/lucy/analysis.go
@@ -21,7 +21,6 @@ package lucy
 #include "Lucy/Analysis/EasyAnalyzer.h"
 */
 import "C"
-import "runtime"
 import "unsafe"
 
 import "git-wip-us.apache.org/repos/asf/lucy-clownfish.git/runtime/go/clownfish"
@@ -30,16 +29,16 @@ type Analyzer interface {
 	clownfish.Obj
 }
 
-type implAnalyzer struct {
-	ref *C.lucy_Analyzer
+type AnalyzerIMP struct {
+	clownfish.ObjIMP
 }
 
 type EasyAnalyzer interface {
 	Analyzer
 }
 
-type implEasyAnalyzer struct {
-	ref *C.lucy_EasyAnalyzer
+type EasyAnalyzerIMP struct {
+	AnalyzerIMP
 }
 
 func NewEasyAnalyzer(language string) EasyAnalyzer {
@@ -49,16 +48,7 @@ func NewEasyAnalyzer(language string) EasyAnalyzer {
 }
 
 func WRAPEasyAnalyzer(ptr unsafe.Pointer) EasyAnalyzer {
-	obj := &implEasyAnalyzer{(*C.lucy_EasyAnalyzer)(ptr)}
-	runtime.SetFinalizer(obj, (*implEasyAnalyzer).finalize)
+	obj := &EasyAnalyzerIMP{}
+	obj.INITOBJ(ptr);
 	return obj
 }
-
-func (obj *implEasyAnalyzer) finalize() {
-	C.cfish_dec_refcount(unsafe.Pointer(obj.ref))
-	obj.ref = nil
-}
-
-func (obj *implEasyAnalyzer) TOPTR() uintptr {
-	return uintptr(unsafe.Pointer(obj.ref))
-}

http://git-wip-us.apache.org/repos/asf/lucy/blob/9330b149/go/lucy/index.go
----------------------------------------------------------------------
diff --git a/go/lucy/index.go b/go/lucy/index.go
index 3a14281..9ccce23 100644
--- a/go/lucy/index.go
+++ b/go/lucy/index.go
@@ -29,7 +29,6 @@ package lucy
 import "C"
 import "fmt"
 import "reflect"
-import "runtime"
 import "strings"
 import "unsafe"
 import "git-wip-us.apache.org/repos/asf/lucy-clownfish.git/runtime/go/clownfish"
@@ -41,8 +40,8 @@ type Indexer interface {
 	Commit() error
 }
 
-type implIndexer struct {
-	ref        *C.lucy_Indexer
+type IndexerIMP struct {
+	clownfish.ObjIMP
 	fieldNames map[string]clownfish.String
 }
 
@@ -50,8 +49,8 @@ type IndexManager interface {
 	clownfish.Obj
 }
 
-type implIndexManager struct {
-	ref *C.lucy_IndexManager
+type IndexManagerIMP struct {
+	clownfish.ObjIMP
 }
 
 type OpenIndexerArgs struct {
@@ -94,26 +93,19 @@ func OpenIndexer(args *OpenIndexerArgs) (obj Indexer, err error) {
 }
 
 func WRAPIndexer(ptr unsafe.Pointer) Indexer {
-	obj := &implIndexer{(*C.lucy_Indexer)(ptr), nil}
-	runtime.SetFinalizer(obj, (*implIndexer).finalize)
+	obj := &IndexerIMP{}
+	obj.INITOBJ(ptr);
 	return obj
 }
 
-func (obj *implIndexer) finalize() {
-	obj.Close()
-}
-
-func (obj *implIndexer) Close() error {
+func (obj *IndexerIMP) Close() error {
 	// TODO: implement Close in core Lucy rather than bindings.
-	if obj.ref != nil {
-		C.cfish_dec_refcount(unsafe.Pointer(obj.ref))
-		obj.ref = nil
-	}
 	return nil // TODO catch errors
 }
 
-func (obj *implIndexer) AddDoc(doc interface{}) error {
-	stockDoc := C.LUCY_Indexer_Get_Stock_Doc(obj.ref)
+func (obj *IndexerIMP) AddDoc(doc interface{}) error {
+	self := ((*C.lucy_Indexer)(unsafe.Pointer(obj.TOPTR())))
+	stockDoc := C.LUCY_Indexer_Get_Stock_Doc(self)
 	docFields := (*C.cfish_Hash)(C.LUCY_Doc_Get_Fields(stockDoc))
 	C.CFISH_Hash_Clear(docFields)
 
@@ -148,19 +140,20 @@ func (obj *implIndexer) AddDoc(doc interface{}) error {
 	// client to supply `boost`.
 	boost := 1.0
 	err := clownfish.TrapErr(func() {
-		C.LUCY_Indexer_Add_Doc(obj.ref, stockDoc, C.float(boost))
+		C.LUCY_Indexer_Add_Doc(self, stockDoc, C.float(boost))
 	})
 
 	return err
 }
 
-func (obj *implIndexer) findFieldC(name string) *C.cfish_String {
+func (obj *IndexerIMP) findFieldC(name string) *C.cfish_String {
+	self := ((*C.lucy_Indexer)(unsafe.Pointer(obj.TOPTR())))
 	if obj.fieldNames == nil {
 		obj.fieldNames = make(map[string]clownfish.String)
 	}
 	f, ok := obj.fieldNames[name]
 	if !ok {
-		schema := C.LUCY_Indexer_Get_Schema(obj.ref)
+		schema := C.LUCY_Indexer_Get_Schema(self)
 		fieldList := C.LUCY_Schema_All_Fields(schema)
 		defer C.cfish_dec_refcount(unsafe.Pointer(fieldList))
 		for i := 0; i < int(C.CFISH_Vec_Get_Size(fieldList)); i++ {
@@ -176,16 +169,9 @@ func (obj *implIndexer) findFieldC(name string) *C.cfish_String {
 	return (*C.cfish_String)(unsafe.Pointer(f.TOPTR()))
 }
 
-func (obj *implIndexer) Commit() error {
+func (obj *IndexerIMP) Commit() error {
+	self := ((*C.lucy_Indexer)(unsafe.Pointer(obj.TOPTR())))
 	return clownfish.TrapErr(func() {
-		C.LUCY_Indexer_Commit(obj.ref)
+		C.LUCY_Indexer_Commit(self)
 	})
 }
-
-func (obj *implIndexer) TOPTR() uintptr {
-	return uintptr(unsafe.Pointer(obj.ref))
-}
-
-func (obj *implIndexManager) TOPTR() uintptr {
-	return uintptr(unsafe.Pointer(obj.ref))
-}

http://git-wip-us.apache.org/repos/asf/lucy/blob/9330b149/go/lucy/plan.go
----------------------------------------------------------------------
diff --git a/go/lucy/plan.go b/go/lucy/plan.go
index a2f4146..aa644b1 100644
--- a/go/lucy/plan.go
+++ b/go/lucy/plan.go
@@ -21,7 +21,6 @@ package lucy
 #include "Lucy/Plan/FullTextType.h"
 */
 import "C"
-import "runtime"
 import "unsafe"
 
 import "git-wip-us.apache.org/repos/asf/lucy-clownfish.git/runtime/go/clownfish"
@@ -31,24 +30,24 @@ type Schema interface {
 	SpecField(field string, fieldType FieldType)
 }
 
-type implSchema struct {
-	ref *C.lucy_Schema
+type SchemaIMP struct {
+	clownfish.ObjIMP
 }
 
 type FieldType interface {
 	clownfish.Obj
 }
 
-type implFieldType struct {
-	ref *C.lucy_FieldType
+type FieldTypeIMP struct {
+	clownfish.ObjIMP
 }
 
 type FullTextType interface {
 	FieldType
 }
 
-type implFullTextType struct {
-	ref *C.lucy_FullTextType
+type FullTextTypeIMP struct {
+	FieldTypeIMP
 }
 
 func NewSchema() Schema {
@@ -57,27 +56,19 @@ func NewSchema() Schema {
 }
 
 func WRAPSchema(ptr unsafe.Pointer) Schema {
-	obj := &implSchema{(*C.lucy_Schema)(ptr)}
-	runtime.SetFinalizer(obj, (*implSchema).finalize)
+	obj := &SchemaIMP{}
+	obj.INITOBJ(ptr);
 	return obj
 }
 
-func (obj *implSchema) finalize() {
-	C.cfish_dec_refcount(unsafe.Pointer(obj.ref))
-	obj.ref = nil
-}
-
-func (obj *implSchema) SpecField(field string, fieldType FieldType) {
+func (obj *SchemaIMP) SpecField(field string, fieldType FieldType) {
+	self := ((*C.lucy_Schema)(unsafe.Pointer(obj.TOPTR())))
 	fieldCF := clownfish.NewString(field)
-	C.LUCY_Schema_Spec_Field(obj.ref,
+	C.LUCY_Schema_Spec_Field(self,
 		(*C.cfish_String)(unsafe.Pointer(fieldCF.TOPTR())),
 		(*C.lucy_FieldType)(unsafe.Pointer(fieldType.TOPTR())))
 }
 
-func (obj *implSchema) TOPTR() uintptr {
-	return uintptr(unsafe.Pointer(obj.ref))
-}
-
 func NewFullTextType(analyzer Analyzer) FullTextType {
 	cfObj := C.lucy_FullTextType_new(
 		(*C.lucy_Analyzer)(unsafe.Pointer(analyzer.TOPTR())))
@@ -85,17 +76,7 @@ func NewFullTextType(analyzer Analyzer) FullTextType {
 }
 
 func WRAPFullTextType(ptr unsafe.Pointer) FullTextType {
-	obj := &implFullTextType{(*C.lucy_FullTextType)(ptr)}
-	runtime.SetFinalizer(obj, (*implFullTextType).finalize)
+	obj := &FullTextTypeIMP{}
+	obj.INITOBJ(ptr);
 	return obj
 }
-
-func (obj *implFullTextType) finalize() {
-	C.cfish_dec_refcount(unsafe.Pointer(obj.ref))
-	obj.ref = nil
-}
-
-func (obj *implFullTextType) TOPTR() uintptr {
-	return uintptr(unsafe.Pointer(obj.ref))
-}
-

http://git-wip-us.apache.org/repos/asf/lucy/blob/9330b149/go/lucy/search.go
----------------------------------------------------------------------
diff --git a/go/lucy/search.go b/go/lucy/search.go
index cc80272..fc2a841 100644
--- a/go/lucy/search.go
+++ b/go/lucy/search.go
@@ -29,7 +29,6 @@ package lucy
 import "C"
 import "fmt"
 import "reflect"
-import "runtime"
 import "strings"
 import "unsafe"
 
@@ -39,8 +38,8 @@ type Query interface {
 	clownfish.Obj
 }
 
-type implQuery struct {
-	ref *C.lucy_Query
+type QueryIMP struct {
+	clownfish.ObjIMP
 }
 
 type Searcher interface {
@@ -49,14 +48,18 @@ type Searcher interface {
 	Close() error
 }
 
+type SearcherIMP struct {
+	clownfish.ObjIMP
+}
+
 type Hits interface {
 	clownfish.Obj
 	Next(hit interface{}) bool
 	Error() error
 }
 
-type implHits struct {
-	ref *C.lucy_Hits
+type HitsIMP struct {
+	clownfish.ObjIMP
 	err error
 }
 
@@ -64,16 +67,16 @@ type SortSpec interface {
 	clownfish.Obj
 }
 
-type implSortSpec struct {
-	ref *C.lucy_SortSpec
+type SortSpecIMP struct {
+	clownfish.ObjIMP
 }
 
 type IndexSearcher interface {
 	Searcher
 }
 
-type implIndexSearcher struct {
-	ref *C.lucy_IndexSearcher
+type IndexSearcherIMP struct {
+	SearcherIMP
 }
 
 func OpenIndexSearcher(index interface{}) (obj IndexSearcher, err error) {
@@ -93,28 +96,21 @@ func OpenIndexSearcher(index interface{}) (obj IndexSearcher, err error) {
 }
 
 func WRAPIndexSearcher(ptr unsafe.Pointer) IndexSearcher {
-	obj := &implIndexSearcher{(*C.lucy_IndexSearcher)(ptr)}
-	runtime.SetFinalizer(obj, (*implIndexSearcher).finalize)
+	obj := &IndexSearcherIMP{}
+	obj.INITOBJ(ptr);
 	return obj
 }
 
-func (obj *implIndexSearcher) finalize() {
-	C.cfish_dec_refcount(unsafe.Pointer(obj.ref))
-	obj.ref = nil
-}
-
-func (obj *implIndexSearcher) Close() error {
+func (obj *IndexSearcherIMP) Close() error {
+	self := ((*C.lucy_IndexSearcher)(unsafe.Pointer(obj.TOPTR())))
 	return clownfish.TrapErr(func() {
-		C.LUCY_IxSearcher_Close(obj.ref)
+		C.LUCY_IxSearcher_Close(self)
 	})
 }
 
-func (obj *implIndexSearcher) TOPTR() uintptr {
-	return uintptr(unsafe.Pointer(obj.ref))
-}
-
-func (obj *implIndexSearcher) Hits(query interface{}, offset uint32, numWanted uint32,
+func (obj *IndexSearcherIMP) Hits(query interface{}, offset uint32, numWanted uint32,
 	sortSpec SortSpec) (hits Hits, err error) {
+	self := ((*C.lucy_IndexSearcher)(unsafe.Pointer(obj.TOPTR())))
 	var sortSpecC *C.lucy_SortSpec
 	if sortSpec != nil {
 		sortSpecC = (*C.lucy_SortSpec)(unsafe.Pointer(sortSpec.TOPTR()))
@@ -123,7 +119,7 @@ func (obj *implIndexSearcher) Hits(query interface{}, offset uint32, numWanted u
 	case string:
 		queryStringC := clownfish.NewString(query.(string))
 		err = clownfish.TrapErr(func() {
-			hitsC := C.LUCY_IxSearcher_Hits(obj.ref,
+			hitsC := C.LUCY_IxSearcher_Hits(self,
 				(*C.cfish_Obj)(unsafe.Pointer(queryStringC.TOPTR())),
 				C.uint32_t(offset), C.uint32_t(numWanted), sortSpecC)
 			hits = WRAPHits(unsafe.Pointer(hitsC))
@@ -135,16 +131,13 @@ func (obj *implIndexSearcher) Hits(query interface{}, offset uint32, numWanted u
 }
 
 func WRAPHits(ptr unsafe.Pointer) Hits {
-	obj := &implHits{(*C.lucy_Hits)(ptr), nil}
-	runtime.SetFinalizer(obj, (*implHits).finalize)
+	obj := &HitsIMP{}
+	obj.INITOBJ(ptr);
 	return obj
 }
 
-func (obj *implHits) TOPTR() uintptr {
-	return uintptr(unsafe.Pointer(obj.ref))
-}
-
-func (obj *implHits) Next(hit interface{}) bool {
+func (obj *HitsIMP) Next(hit interface{}) bool {
+	self := ((*C.lucy_Hits)(unsafe.Pointer(obj.TOPTR())))
 	// TODO: accept a HitDoc object and populate score.
 
 	// Get reflection value and type for the supplied struct.
@@ -166,7 +159,7 @@ func (obj *implHits) Next(hit interface{}) bool {
 
 	var docC *C.lucy_HitDoc
 	errCallingNext := clownfish.TrapErr(func() {
-		docC = C.LUCY_Hits_Next(obj.ref)
+		docC = C.LUCY_Hits_Next(self)
 	})
 	if errCallingNext != nil {
 		obj.err = errCallingNext
@@ -196,11 +189,6 @@ func (obj *implHits) Next(hit interface{}) bool {
 	return true
 }
 
-func (obj *implHits) finalize() {
-	C.cfish_dec_refcount(unsafe.Pointer(obj.ref))
-	obj.ref = nil
-}
-
-func (obj *implHits) Error() error {
+func (obj *HitsIMP) Error() error {
 	return obj.err
 }


[2/2] lucy git commit: Merge branch 'LUCY-275-Go-POC-v4'

Posted by ma...@apache.org.
Merge branch 'LUCY-275-Go-POC-v4'

Adapt Lucy for v4 of Go proof-of-concept bindings.

This closes #12.


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

Branch: refs/heads/master
Commit: 45c870ba22a301f08d8ec98f3e2f5100ed16a59d
Parents: d460538 9330b14
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Wed May 6 15:07:57 2015 -0700
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Wed May 6 15:10:14 2015 -0700

----------------------------------------------------------------------
 go/lucy/analysis.go | 22 +++++------------
 go/lucy/index.go    | 48 +++++++++++++-----------------------
 go/lucy/plan.go     | 45 ++++++++++------------------------
 go/lucy/search.go   | 64 ++++++++++++++++++++----------------------------
 4 files changed, 62 insertions(+), 117 deletions(-)
----------------------------------------------------------------------