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/08/03 23:59:18 UTC

[5/9] lucy git commit: Port Doc code to CGO.

Port Doc code to CGO.


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

Branch: refs/heads/master
Commit: 8f634425b5390423d7c4013b28710e4ddc92bf0b
Parents: 44fc440
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Sun Jul 19 12:57:13 2015 -0700
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Fri Jul 31 17:59:15 2015 -0700

----------------------------------------------------------------------
 go/cfext/lucy.c |  67 ++++++++++--------------
 go/lucy/lucy.go | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 169 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/8f634425/go/cfext/lucy.c
----------------------------------------------------------------------
diff --git a/go/cfext/lucy.c b/go/cfext/lucy.c
index 5773f16..e2719bc 100644
--- a/go/cfext/lucy.c
+++ b/go/cfext/lucy.c
@@ -86,61 +86,53 @@ RegexTokenizer_Tokenize_Utf8_IMP(RegexTokenizer *self, const char *string,
 /********************************** Doc ********************************/
 
 Doc*
-Doc_init(Doc *self, void *fields, int32_t doc_id) {
-    DocIVARS *const ivars = Doc_IVARS(self);
-    Hash *hash;
-
-    if (fields) {
-        hash = (Hash *)INCREF(CERTIFY(fields, HASH));
-    }
-    else {
-        hash = Hash_new(0);
-    }
-    ivars->fields = hash;
-    ivars->doc_id = doc_id;
+(*GOLUCY_Doc_init_BRIDGE)(Doc *self, void *fields, int32_t doc_id);
 
-    return self;
+Doc*
+Doc_init(Doc *self, void *fields, int32_t doc_id) {
+    return GOLUCY_Doc_init_BRIDGE(self, fields, doc_id);
 }
 
+Doc_Set_Fields_t GOLUCY_Doc_Set_Fields_BRIDGE;
+
 void
 Doc_Set_Fields_IMP(Doc *self, void *fields) {
-    DocIVARS *const ivars = Doc_IVARS(self);
-    DECREF(ivars->fields);
-    ivars->fields = CERTIFY(fields, HASH);
+    GOLUCY_Doc_Set_Fields_BRIDGE(self, fields);
 }
 
+Doc_Get_Size_t GOLUCY_Doc_Get_Size_BRIDGE;
+
 uint32_t
 Doc_Get_Size_IMP(Doc *self) {
-    Hash *hash = (Hash*)Doc_IVARS(self)->fields;
-    return Hash_Get_Size(hash);
+    return GOLUCY_Doc_Get_Size_BRIDGE(self);
 }
 
+Doc_Store_t GOLUCY_Doc_Store_BRIDGE;
+
 void
 Doc_Store_IMP(Doc *self, String *field, Obj *value) {
-    Hash *hash = (Hash*)Doc_IVARS(self)->fields;
-    Hash_Store(hash, field, INCREF(value));
+    GOLUCY_Doc_Store_BRIDGE(self, field, value);
 }
 
+Doc_Serialize_t GOLUCY_Doc_Serialize_BRIDGE;
+
 void
 Doc_Serialize_IMP(Doc *self, OutStream *outstream) {
-    DocIVARS *const ivars = Doc_IVARS(self);
-    Hash *hash = (Hash*)ivars->fields;
-    Freezer_serialize_hash(hash, outstream);
-    OutStream_Write_C32(outstream, ivars->doc_id);
+    GOLUCY_Doc_Serialize_BRIDGE(self, outstream);
 }
 
+Doc_Deserialize_t GOLUCY_Doc_Deserialize_BRIDGE;
+
 Doc*
 Doc_Deserialize_IMP(Doc *self, InStream *instream) {
-    DocIVARS *const ivars = Doc_IVARS(self);
-    ivars->fields = Freezer_read_hash(instream);
-    ivars->doc_id = InStream_Read_C32(instream);
-    return self;
+    return GOLUCY_Doc_Deserialize_BRIDGE(self, instream);
 }
 
+Doc_Extract_t GOLUCY_Doc_Extract_BRIDGE;
+
 Obj*
 Doc_Extract_IMP(Doc *self, String *field) {
-    Hash *hash = (Hash*)Doc_IVARS(self)->fields;
-    return INCREF(Hash_Fetch(hash, field));
+    return GOLUCY_Doc_Extract_BRIDGE(self, field);
 }
 
 Hash*
@@ -158,23 +150,20 @@ Doc_Load_IMP(Doc *self, Obj *dump) {
     UNREACHABLE_RETURN(Doc*);
 }
 
+Doc_Equals_t GOLUCY_Doc_Equals_BRIDGE;
+
 bool
 Doc_Equals_IMP(Doc *self, Obj *other) {
-    if ((Doc*)other == self)   { return true;  }
-    if (!Obj_is_a(other, DOC)) { return false; }
-    DocIVARS *const ivars = Doc_IVARS(self);
-    DocIVARS *const ovars = Doc_IVARS((Doc*)other);
-    return Hash_Equals((Hash*)ivars->fields, (Obj*)ovars->fields);
+    return GOLUCY_Doc_Equals_BRIDGE(self, other);
 }
 
+Doc_Destroy_t GOLUCY_Doc_Destroy_BRIDGE;
+
 void
 Doc_Destroy_IMP(Doc *self) {
-    DocIVARS *const ivars = Doc_IVARS(self);
-    DECREF(ivars->fields);
-    SUPER_DESTROY(self, DOC);
+    GOLUCY_Doc_Destroy_BRIDGE(self);
 }
 
-
 /**************************** DocReader *****************************/
 
 HitDoc*

http://git-wip-us.apache.org/repos/asf/lucy/blob/8f634425/go/lucy/lucy.go
----------------------------------------------------------------------
diff --git a/go/lucy/lucy.go b/go/lucy/lucy.go
index 13bdafa..7d55798 100644
--- a/go/lucy/lucy.go
+++ b/go/lucy/lucy.go
@@ -17,10 +17,17 @@
 package lucy
 
 /*
+#define C_LUCY_DOC
 #define C_LUCY_REGEXTOKENIZER
 
 #include "lucy_parcel.h"
 #include "Lucy/Analysis/RegexTokenizer.h"
+#include "Lucy/Document/Doc.h"
+
+#include "Clownfish/Hash.h"
+#include "Lucy/Store/InStream.h"
+#include "Lucy/Store/OutStream.h"
+#include "Lucy/Util/Freezer.h"
 
 extern lucy_RegexTokenizer*
 GOLUCY_RegexTokenizer_init(lucy_RegexTokenizer *self, cfish_String *pattern);
@@ -38,6 +45,44 @@ extern void
 (*GOLUCY_RegexTokenizer_Tokenize_Utf8_BRIDGE)(lucy_RegexTokenizer *self, const char *str,
 											  size_t string_len, lucy_Inversion *inversion);
 
+extern lucy_Doc*
+GOLUCY_Doc_init(lucy_Doc *doc, void *fields, int32_t doc_id);
+extern lucy_Doc*
+(*GOLUCY_Doc_init_BRIDGE)(lucy_Doc *doc, void *fields, int32_t doc_id);
+extern void
+GOLUCY_Doc_Set_Fields(lucy_Doc *self, void *fields);
+extern void
+(*GOLUCY_Doc_Set_Fields_BRIDGE)(lucy_Doc *self, void *fields);
+extern uint32_t
+GOLUCY_Doc_Get_Size(lucy_Doc *self);
+extern uint32_t
+(*GOLUCY_Doc_Get_Size_BRIDGE)(lucy_Doc *self);
+extern void
+GOLUCY_Doc_Store(lucy_Doc *self, cfish_String *field, cfish_Obj *value);
+extern void
+(*GOLUCY_Doc_Store_BRIDGE)(lucy_Doc *self, cfish_String *field, cfish_Obj *value);
+extern void
+GOLUCY_Doc_Serialize(lucy_Doc *self, lucy_OutStream *outstream);
+extern void
+(*GOLUCY_Doc_Serialize_BRIDGE)(lucy_Doc *self, lucy_OutStream *outstream);
+extern lucy_Doc*
+GOLUCY_Doc_Deserialize(lucy_Doc *self, lucy_InStream *instream);
+extern lucy_Doc*
+(*GOLUCY_Doc_Deserialize_BRIDGE)(lucy_Doc *self, lucy_InStream *instream);
+extern cfish_Obj*
+GOLUCY_Doc_Extract(lucy_Doc *self, cfish_String *field);
+extern cfish_Obj*
+(*GOLUCY_Doc_Extract_BRIDGE)(lucy_Doc *self, cfish_String *field);
+extern bool
+GOLUCY_Doc_Equals(lucy_Doc *self, cfish_Obj *other);
+extern bool
+(*GOLUCY_Doc_Equals_BRIDGE)(lucy_Doc *self, cfish_Obj *other);
+extern void
+GOLUCY_Doc_Destroy(lucy_Doc *self);
+extern void
+(*GOLUCY_Doc_Destroy_BRIDGE)(lucy_Doc *self);
+
+
 
 // C symbols linked into a Go-built package archive are not visible to
 // external C code -- but internal code *can* see symbols from outside.
@@ -49,10 +94,20 @@ GOLUCY_glue_exported_symbols() {
 	GOLUCY_RegexTokenizer_Destroy_BRIDGE = GOLUCY_RegexTokenizer_Destroy;
 	GOLUCY_RegexTokenizer_Tokenize_Utf8_BRIDGE
 		= (LUCY_RegexTokenizer_Tokenize_Utf8_t)GOLUCY_RegexTokenizer_Tokenize_Utf8;
+	GOLUCY_Doc_init_BRIDGE = GOLUCY_Doc_init;
+	GOLUCY_Doc_Set_Fields_BRIDGE = GOLUCY_Doc_Set_Fields;
+	GOLUCY_Doc_Get_Size_BRIDGE = GOLUCY_Doc_Get_Size;
+	GOLUCY_Doc_Store_BRIDGE = GOLUCY_Doc_Store;
+	GOLUCY_Doc_Serialize_BRIDGE = GOLUCY_Doc_Serialize;
+	GOLUCY_Doc_Deserialize_BRIDGE = GOLUCY_Doc_Deserialize;
+	GOLUCY_Doc_Extract_BRIDGE = GOLUCY_Doc_Extract;
+	GOLUCY_Doc_Equals_BRIDGE = GOLUCY_Doc_Equals;
+	GOLUCY_Doc_Destroy_BRIDGE = GOLUCY_Doc_Destroy;
 }
 
 */
 import "C"
+import "unsafe"
 import _ "git-wip-us.apache.org/repos/asf/lucy-clownfish.git/runtime/go/clownfish"
 
 func init() {
@@ -73,3 +128,89 @@ func GOLUCY_RegexTokenizer_Destroy(rt *C.lucy_RegexTokenizer) {
 func GOLUCY_RegexTokenizer_Tokenize_Utf8(rt *C.lucy_RegexTokenizer, str *C.char,
 	stringLen C.size_t, inversion *C.lucy_Inversion) {
 }
+
+func NewDoc(docID int32) Doc {
+	retvalCF := C.lucy_Doc_new(nil, C.int32_t(docID))
+	return WRAPDoc(unsafe.Pointer(retvalCF))
+}
+
+//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))
+	} else {
+		ivars.fields = unsafe.Pointer(C.cfish_Hash_new(0))
+	}
+	ivars.doc_id = docID
+	return d
+}
+
+//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)
+}
+
+//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))
+	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)
+	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)
+	C.lucy_Freezer_serialize_hash(hash, outstream)
+	C.LUCY_OutStream_Write_C32(outstream, C.uint32_t(ivars.doc_id))
+}
+
+//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))
+	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)
+	val := C.CFISH_Hash_Fetch(hash, field)
+	return C.cfish_inc_refcount(unsafe.Pointer(val))
+}
+
+//export GOLUCY_Doc_Equals
+func GOLUCY_Doc_Equals(d *C.lucy_Doc, other *C.cfish_Obj) C.bool {
+	twin := (*C.lucy_Doc)(unsafe.Pointer(other))
+	if twin == d {
+		return true
+	}
+	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)
+	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))
+	C.cfish_super_destroy(unsafe.Pointer(d), C.LUCY_DOC)
+}