[Groonga-commit] groonga/grnxx at ba819a8 [master] Gnx: implement Column.GetValue() for Text vector.

Back to archive index

susumu.yata null+****@clear*****
Wed May 6 13:28:01 JST 2015


susumu.yata	2015-05-06 13:28:01 +0900 (Wed, 06 May 2015)

  New Revision: ba819a8662e267ba84eb294647029a27a0a28aab
  https://github.com/groonga/grnxx/commit/ba819a8662e267ba84eb294647029a27a0a28aab

  Message:
    Gnx: implement Column.GetValue() for Text vector.

  Modified files:
    go3/gnx/grn.go
    go3/gnx/grn_cgo.c
    go3/gnx/grn_cgo.h
    go3/gnx/grn_test.go

  Modified: go3/gnx/grn.go (+31 -2)
===================================================================
--- go3/gnx/grn.go    2015-05-01 15:46:06 +0900 (41a8983)
+++ go3/gnx/grn.go    2015-05-06 13:28:01 +0900 (1ee316a)
@@ -1101,6 +1101,36 @@ func (column *GrnColumn) getGeoPointVector(id Int) (interface{}, error) {
 	return value, nil
 }
 
+// getTextVector() gets a TextVector.
+func (column *GrnColumn) getTextVector(id Int) (interface{}, error) {
+	var grnVector C.grn_cgo_vector
+	if ok := C.grn_cgo_column_get_text_vector(column.table.db.ctx, column.obj,
+		C.grn_id(id), &grnVector); ok != C.GRN_TRUE {
+		return nil, fmt.Errorf("grn_cgo_column_get_text_vector() failed")
+	}
+	if grnVector.size == 0 {
+		return make([]Text, 0), nil
+	}
+	grnValues := make([]C.grn_cgo_text, int(grnVector.size))
+	grnVector.ptr = unsafe.Pointer(&grnValues[0])
+	if ok := C.grn_cgo_column_get_text_vector(column.table.db.ctx, column.obj,
+		C.grn_id(id), &grnVector); ok != C.GRN_TRUE {
+		return nil, fmt.Errorf("grn_cgo_column_get_text_vector() failed")
+	}
+	value := make([]Text, int(grnVector.size))
+	for i, grnValue := range grnValues {
+		if grnValue.size != 0 {
+			value[i] = make(Text, int(grnValue.size))
+			grnValues[i].ptr = (*C.char)(unsafe.Pointer(&value[i][0]))
+		}
+	}
+	if ok := C.grn_cgo_column_get_text_vector(column.table.db.ctx, column.obj,
+		C.grn_id(id), &grnVector); ok != C.GRN_TRUE {
+		return nil, fmt.Errorf("grn_cgo_column_get_text_vector() failed")
+	}
+	return value, nil
+}
+
 // GetValue() gets a value.
 // TODO: GetValue() should use allocated spaces for better performance.
 func (column *GrnColumn) GetValue(id Int) (interface{}, error) {
@@ -1128,8 +1158,7 @@ func (column *GrnColumn) GetValue(id Int) (interface{}, error) {
 		case GeoPointID:
 			return column.getGeoPointVector(id)
 		case TextID:
-//			return column.getTextVector(id)
-			return nil, fmt.Errorf("not supported yet")
+			return column.getTextVector(id)
 		}
 	}
 	return nil, fmt.Errorf("undefined value type: valueType = %d", column.valueType)

  Modified: go3/gnx/grn_cgo.c (+24 -0)
===================================================================
--- go3/gnx/grn_cgo.c    2015-05-01 15:46:06 +0900 (9fc2526)
+++ go3/gnx/grn_cgo.c    2015-05-06 13:28:01 +0900 (fe8bf64)
@@ -436,3 +436,27 @@ grn_bool grn_cgo_column_get_geo_point_vector(grn_ctx *ctx, grn_obj *column,
   GRN_OBJ_FIN(ctx, &value_obj);
   return GRN_TRUE;
 }
+
+grn_bool grn_cgo_column_get_text_vector(grn_ctx *ctx, grn_obj *column,
+                                        grn_id id, grn_cgo_vector *value) {
+  grn_obj value_obj;
+  GRN_TEXT_INIT(&value_obj, GRN_OBJ_VECTOR);
+  grn_obj_get_value(ctx, column, id, &value_obj);
+  size_t size = grn_vector_size(ctx, &value_obj);
+  if (size <= value->size) {
+    size_t i;
+    for (i = 0; i < size; i++) {
+      const char *text_ptr;
+      unsigned int text_size = grn_vector_get_element(ctx, &value_obj, i,
+                                                      &text_ptr, NULL, NULL);
+      grn_cgo_text *text = &((grn_cgo_text *)value->ptr)[i];
+      if (text_size <= text->size) {
+        memcpy(text->ptr, text_ptr, text_size);
+      }
+      text->size = text_size;
+    }
+  }
+  value->size = size;
+  GRN_OBJ_FIN(ctx, &value_obj);
+  return GRN_TRUE;
+}

  Modified: go3/gnx/grn_cgo.h (+2 -0)
===================================================================
--- go3/gnx/grn_cgo.h    2015-05-01 15:46:06 +0900 (7194c14)
+++ go3/gnx/grn_cgo.h    2015-05-06 13:28:01 +0900 (3b979fe)
@@ -122,5 +122,7 @@ grn_bool grn_cgo_column_get_float_vector(grn_ctx *ctx, grn_obj *column,
                                          grn_id id, grn_cgo_vector *value);
 grn_bool grn_cgo_column_get_geo_point_vector(grn_ctx *ctx, grn_obj *column,
                                              grn_id id, grn_cgo_vector *value);
+grn_bool grn_cgo_column_get_text_vector(grn_ctx *ctx, grn_obj *column,
+                                        grn_id id, grn_cgo_vector *value);
 
 #endif  // GRN_CGO_H

  Modified: go3/gnx/grn_test.go (+1 -1)
===================================================================
--- go3/gnx/grn_test.go    2015-05-01 15:46:06 +0900 (9cb7b9b)
+++ go3/gnx/grn_test.go    2015-05-06 13:28:01 +0900 (dded85e)
@@ -480,5 +480,5 @@ func TestGrnColumnGetValue(t *testing.T) {
 	testGrnColumnGetVectorValue(t, "Int")
 	testGrnColumnGetVectorValue(t, "Float")
 	testGrnColumnGetVectorValue(t, "GeoPoint")
-//	testGrnColumnGetVectorValue(t, "Text")
+	testGrnColumnGetVectorValue(t, "Text")
 }
-------------- next part --------------
HTML����������������������������...
다운로드 



More information about the Groonga-commit mailing list
Back to archive index