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:05 UTC

[4/9] lucy git commit: Change Doc to use registry internally.

Change Doc to use registry internally.

Instead of storing a pointer to a raw Clownfish Hash in a doc object,
wrap the Hash in a Go struct, store it in the registry and store the
ID returned by the registry in the Doc.

This commit is a transition from using a Clownfish Hash as Doc's fields
to using a Go `map[string]interface{}`.


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

Branch: refs/heads/master
Commit: a41f86cbcc63b711c8087a4861e70ec803a69ebf
Parents: 900fc89
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Tue Sep 15 18:54:11 2015 -0700
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Mon Sep 28 12:54:38 2015 -0700

----------------------------------------------------------------------
 go/lucy/document.go | 16 ++++++++++++++++
 go/lucy/index.go    |  2 +-
 go/lucy/lucy.go     | 45 ++++++++++++++++++++-------------------------
 go/lucy/search.go   |  2 +-
 4 files changed, 38 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/a41f86cb/go/lucy/document.go
----------------------------------------------------------------------
diff --git a/go/lucy/document.go b/go/lucy/document.go
index 02a8f82..3196986 100644
--- a/go/lucy/document.go
+++ b/go/lucy/document.go
@@ -17,11 +17,17 @@
 package lucy
 
 /*
+#define C_LUCY_DOC
+
 #include "Lucy/Document/Doc.h"
 #include "Lucy/Document/HitDoc.h"
 */
 import "C"
 import "unsafe"
+import "fmt"
+
+import "git-wip-us.apache.org/repos/asf/lucy-clownfish.git/runtime/go/clownfish"
+
 
 func NewDoc(docID int32) Doc {
 	retvalCF := C.lucy_Doc_new(nil, C.int32_t(docID))
@@ -32,3 +38,13 @@ func NewHitDoc(docID int32, score float32) HitDoc {
 	retvalCF := C.lucy_HitDoc_new(nil, C.int32_t(docID), C.float(score))
 	return WRAPHitDoc(unsafe.Pointer(retvalCF))
 }
+
+func fetchDocFields(d *C.lucy_Doc) *C.cfish_Hash {
+	ivars := C.lucy_Doc_IVARS(d)
+	fieldsID := uintptr(ivars.fields)
+	fieldsGo, ok := registry.fetch(fieldsID).(clownfish.Hash)
+	if !ok {
+		panic(clownfish.NewErr(fmt.Sprintf("Failed to fetch doc %d from registry ", fieldsID)))
+	}
+	return (*C.cfish_Hash)(clownfish.Unwrap(fieldsGo, "fieldsGo"))
+}

http://git-wip-us.apache.org/repos/asf/lucy/blob/a41f86cb/go/lucy/index.go
----------------------------------------------------------------------
diff --git a/go/lucy/index.go b/go/lucy/index.go
index 4aab0a2..6543c99 100644
--- a/go/lucy/index.go
+++ b/go/lucy/index.go
@@ -73,7 +73,7 @@ func (obj *IndexerIMP) Close() error {
 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))
+	docFields := fetchDocFields(stockDoc)
 	C.CFISH_Hash_Clear(docFields)
 
 	// TODO: Support map as doc in addition to struct as doc.

http://git-wip-us.apache.org/repos/asf/lucy/blob/a41f86cb/go/lucy/lucy.go
----------------------------------------------------------------------
diff --git a/go/lucy/lucy.go b/go/lucy/lucy.go
index e67ead2..50ac2c9 100644
--- a/go/lucy/lucy.go
+++ b/go/lucy/lucy.go
@@ -252,10 +252,11 @@ func GOLUCY_RegexTokenizer_Tokenize_Utf8(rt *C.lucy_RegexTokenizer, str *C.char,
 //export GOLUCY_Doc_init
 func GOLUCY_Doc_init(d *C.lucy_Doc, fields unsafe.Pointer, docID C.int32_t) *C.lucy_Doc {
 	ivars := C.lucy_Doc_IVARS(d)
-	if fields != nil {
-		ivars.fields = unsafe.Pointer(C.cfish_inc_refcount(fields))
+	if fields == nil {
+		fieldsID := registry.store(clownfish.NewHash(0))
+		ivars.fields = unsafe.Pointer(fieldsID)
 	} else {
-		ivars.fields = unsafe.Pointer(C.cfish_Hash_new(0))
+		ivars.fields = fields
 	}
 	ivars.doc_id = docID
 	return d
@@ -263,30 +264,25 @@ func GOLUCY_Doc_init(d *C.lucy_Doc, fields unsafe.Pointer, docID C.int32_t) *C.l
 
 //export GOLUCY_Doc_Set_Fields
 func GOLUCY_Doc_Set_Fields(d *C.lucy_Doc, fields unsafe.Pointer) {
-	ivars := C.lucy_Doc_IVARS(d)
-	temp := ivars.fields
-	ivars.fields = unsafe.Pointer(C.cfish_inc_refcount(fields))
-	C.cfish_decref(temp)
+	panic(clownfish.NewErr("Set_Fields unsupported in Go bindings"))
 }
 
 //export GOLUCY_Doc_Get_Size
 func GOLUCY_Doc_Get_Size(d *C.lucy_Doc) C.uint32_t {
-	ivars := C.lucy_Doc_IVARS(d)
-	hash := ((*C.cfish_Hash)(ivars.fields))
+	hash := fetchDocFields(d)
 	return C.uint32_t(C.CFISH_Hash_Get_Size(hash))
 }
 
 //export GOLUCY_Doc_Store
 func GOLUCY_Doc_Store(d *C.lucy_Doc, field *C.cfish_String, value *C.cfish_Obj) {
-	ivars := C.lucy_Doc_IVARS(d)
-	hash := (*C.cfish_Hash)(ivars.fields)
+	hash := fetchDocFields(d)
 	C.CFISH_Hash_Store(hash, field, C.cfish_inc_refcount(unsafe.Pointer(value)))
 }
 
 //export GOLUCY_Doc_Serialize
 func GOLUCY_Doc_Serialize(d *C.lucy_Doc, outstream *C.lucy_OutStream) {
 	ivars := C.lucy_Doc_IVARS(d)
-	hash := (*C.cfish_Hash)(ivars.fields)
+	hash := fetchDocFields(d)
 	C.lucy_Freezer_serialize_hash(hash, outstream)
 	C.LUCY_OutStream_Write_C32(outstream, C.uint32_t(ivars.doc_id))
 }
@@ -294,23 +290,23 @@ func GOLUCY_Doc_Serialize(d *C.lucy_Doc, outstream *C.lucy_OutStream) {
 //export GOLUCY_Doc_Deserialize
 func GOLUCY_Doc_Deserialize(d *C.lucy_Doc, instream *C.lucy_InStream) *C.lucy_Doc {
 	ivars := C.lucy_Doc_IVARS(d)
-	ivars.fields = unsafe.Pointer(C.lucy_Freezer_read_hash(instream))
+	hash := unsafe.Pointer(C.lucy_Freezer_read_hash(instream))
+	fieldsID := registry.store(clownfish.WRAPAny(hash))
+	ivars.fields = unsafe.Pointer(fieldsID)
 	ivars.doc_id = C.int32_t(C.LUCY_InStream_Read_C32(instream))
 	return d
 }
 
 //export GOLUCY_Doc_Extract
 func GOLUCY_Doc_Extract(d *C.lucy_Doc, field *C.cfish_String) *C.cfish_Obj {
-	ivars := C.lucy_Doc_IVARS(d)
-	hash := (*C.cfish_Hash)(ivars.fields)
+	hash := fetchDocFields(d)
 	val := C.CFISH_Hash_Fetch(hash, field)
 	return C.cfish_inc_refcount(unsafe.Pointer(val))
 }
 
 //export GOLUCY_Doc_Field_Names
 func GOLUCY_Doc_Field_Names(d *C.lucy_Doc) *C.cfish_Vector {
-	ivars := C.lucy_Doc_IVARS(d)
-	hash := (*C.cfish_Hash)(ivars.fields)
+	hash := fetchDocFields(d)
 	return C.CFISH_Hash_Keys(hash)
 }
 
@@ -323,17 +319,16 @@ func GOLUCY_Doc_Equals(d *C.lucy_Doc, other *C.cfish_Obj) C.bool {
 	if !C.cfish_Obj_is_a(other, C.LUCY_DOC) {
 		return false
 	}
-	ivars := C.lucy_Doc_IVARS(d)
-	ovars := C.lucy_Doc_IVARS(twin)
-	hash := (*C.cfish_Hash)(ivars.fields)
-	otherHash := (*C.cfish_Obj)(ovars.fields)
+	hash := fetchDocFields(d)
+	otherHash := (*C.cfish_Obj)(unsafe.Pointer(fetchDocFields(twin)))
 	return C.CFISH_Hash_Equals(hash, otherHash)
 }
 
 //export GOLUCY_Doc_Destroy
 func GOLUCY_Doc_Destroy(d *C.lucy_Doc) {
 	ivars := C.lucy_Doc_IVARS(d)
-	C.cfish_decref(unsafe.Pointer(ivars.fields))
+	fieldsID := uintptr(ivars.fields)
+	registry.delete(fieldsID)
 	C.cfish_super_destroy(unsafe.Pointer(d), C.LUCY_DOC)
 }
 
@@ -432,15 +427,15 @@ func GOLUCY_DefDocReader_Fetch_Doc(ddr *C.lucy_DefaultDocReader,
 	}
 	C.free(unsafe.Pointer(fieldName))
 
-	retval := C.lucy_HitDoc_new(unsafe.Pointer(fields), docID, 0.0)
-	C.cfish_dec_refcount(unsafe.Pointer(fields))
+	fieldsID := registry.store(clownfish.WRAPAny(unsafe.Pointer(fields)))
+	retval := C.lucy_HitDoc_new(unsafe.Pointer(fieldsID), docID, 0.0)
 	return retval
 }
 
 //export GOLUCY_Inverter_Invert_Doc
 func GOLUCY_Inverter_Invert_Doc(inverter *C.lucy_Inverter, doc *C.lucy_Doc) {
 	ivars := C.lucy_Inverter_IVARS(inverter)
-	fields := (*C.cfish_Hash)(C.LUCY_Doc_Get_Fields(doc))
+	fields := fetchDocFields(doc)
 
 	// Prepare for the new doc.
 	C.LUCY_Inverter_Set_Doc(inverter, doc)

http://git-wip-us.apache.org/repos/asf/lucy/blob/a41f86cb/go/lucy/search.go
----------------------------------------------------------------------
diff --git a/go/lucy/search.go b/go/lucy/search.go
index e18eee7..7f6ce76 100644
--- a/go/lucy/search.go
+++ b/go/lucy/search.go
@@ -149,7 +149,7 @@ func (obj *HitsIMP) Next(hit interface{}) bool {
 	}
 	defer C.cfish_dec_refcount(unsafe.Pointer(docC))
 
-	fields := (*C.cfish_Hash)(unsafe.Pointer(C.LUCY_HitDoc_Get_Fields(docC)))
+	fields := fetchDocFields((*C.lucy_Doc)(unsafe.Pointer(docC)))
 	iterator := C.cfish_HashIter_new(fields)
 	defer C.cfish_dec_refcount(unsafe.Pointer(iterator))
 	for C.CFISH_HashIter_Next(iterator) {