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

Back to archive index

susumu.yata null+****@clear*****
Fri May 1 15:41:30 JST 2015


susumu.yata	2015-05-01 15:41:30 +0900 (Fri, 01 May 2015)

  New Revision: 611ac22426b72362e8b43ca5cf6a74af99260fcf
  https://github.com/groonga/grnxx/commit/611ac22426b72362e8b43ca5cf6a74af99260fcf

  Message:
    Gnx: implement Column.GetValue() for GeoPoint 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 (+19 -20)
===================================================================
--- go3/gnx/grn.go    2015-05-01 12:42:33 +0900 (0869f1d)
+++ go3/gnx/grn.go    2015-05-01 15:41:30 +0900 (41a8983)
@@ -1082,24 +1082,24 @@ func (column *GrnColumn) getFloatVector(id Int) (interface{}, error) {
 	return value, nil
 }
 
-//// getGeoPointVector() gets a GeoPointVector.
-//func (column *GrnColumn) getGeoPointVector(id Int) (interface{}, error) {
-//	var grnValue C.grn_cgo_vector
-//	if ok := C.grn_cgo_column_get_geo_point_vector(column.table.db.ctx, column.obj,
-//		C.grn_id(id), &grnValue); ok != C.GRN_TRUE {
-//		return nil, fmt.Errorf("grn_cgo_column_get_geo_point_vector() failed")
-//	}
-//	if grnValue.size == 0 {
-//		return make([]GeoPoint, 0), nil
-//	}
-//	value := make([]GeoPoint, int(grnValue.size))
-//	grnValue.ptr = unsafe.Pointer(&value[0])
-//	if ok := C.grn_cgo_column_get_geo_point_vector(column.table.db.ctx, column.obj,
-//		C.grn_id(id), &grnValue); ok != C.GRN_TRUE {
-//		return nil, fmt.Errorf("grn_cgo_column_get_geo_point_vector() failed")
-//	}
-//	return value, nil
-//}
+// getGeoPointVector() gets a GeoPointVector.
+func (column *GrnColumn) getGeoPointVector(id Int) (interface{}, error) {
+	var grnValue C.grn_cgo_vector
+	if ok := C.grn_cgo_column_get_geo_point_vector(column.table.db.ctx, column.obj,
+		C.grn_id(id), &grnValue); ok != C.GRN_TRUE {
+		return nil, fmt.Errorf("grn_cgo_column_get_geo_point_vector() failed")
+	}
+	if grnValue.size == 0 {
+		return make([]GeoPoint, 0), nil
+	}
+	value := make([]GeoPoint, int(grnValue.size))
+	grnValue.ptr = unsafe.Pointer(&value[0])
+	if ok := C.grn_cgo_column_get_geo_point_vector(column.table.db.ctx, column.obj,
+		C.grn_id(id), &grnValue); ok != C.GRN_TRUE {
+		return nil, fmt.Errorf("grn_cgo_column_get_geo_point_vector() failed")
+	}
+	return value, nil
+}
 
 // GetValue() gets a value.
 // TODO: GetValue() should use allocated spaces for better performance.
@@ -1126,8 +1126,7 @@ func (column *GrnColumn) GetValue(id Int) (interface{}, error) {
 		case FloatID:
 			return column.getFloatVector(id)
 		case GeoPointID:
-//			return column.getGeoPointVector(id)
-			return nil, fmt.Errorf("not supported yet")
+			return column.getGeoPointVector(id)
 		case TextID:
 //			return column.getTextVector(id)
 			return nil, fmt.Errorf("not supported yet")

  Modified: go3/gnx/grn_cgo.c (+14 -16)
===================================================================
--- go3/gnx/grn_cgo.c    2015-05-01 12:42:33 +0900 (343a413)
+++ go3/gnx/grn_cgo.c    2015-05-01 15:41:30 +0900 (8878586)
@@ -428,19 +428,17 @@ grn_bool grn_cgo_column_get_float_vector(grn_ctx *ctx, grn_obj *column,
   return GRN_TRUE;
 }
 
-/*grn_bool grn_cgo_column_get_geo_point_vector(grn_ctx *ctx, grn_obj *column,*/
-/*                                             grn_id id, grn_cgo_vector *value) {*/
-/*  grn_obj value_obj;*/
-/*  GRN_WGS84_GEO_POINT_INIT(&value_obj, GRN_OBJ_VECTOR);*/
-/*  grn_obj_get_value(ctx, column, id, &value_obj);*/
-/*  size_t size = grn_uvector_size(ctx, &value_obj);*/
-/*  if (size <= value->size) {*/
-/*    size_t i;*/
-/*    for (i = 0; i < size; i++) {*/
-/*      ((int64_t *)value->ptr)[i] = GRN_INT64_VALUE_AT(&value_obj, i);*/
-/*    }*/
-/*  }*/
-/*  value->size = size;*/
-/*  GRN_OBJ_FIN(ctx, &value_obj);*/
-/*  return GRN_TRUE;*/
-/*}*/
+grn_bool grn_cgo_column_get_geo_point_vector(grn_ctx *ctx, grn_obj *column,
+                                             grn_id id, grn_cgo_vector *value) {
+  grn_obj value_obj;
+  GRN_WGS84_GEO_POINT_INIT(&value_obj, GRN_OBJ_VECTOR);
+  grn_obj_get_value(ctx, column, id, &value_obj);
+  size_t size_in_bytes = GRN_BULK_VSIZE(&value_obj);
+  size_t size = size_in_bytes / sizeof(grn_geo_point);
+  if (size <= value->size) {
+    memcpy(value->ptr, GRN_BULK_HEAD(&value_obj), size_in_bytes);
+  }
+  value->size = size;
+  GRN_OBJ_FIN(ctx, &value_obj);
+  return GRN_TRUE;
+}

  Modified: go3/gnx/grn_cgo.h (+2 -2)
===================================================================
--- go3/gnx/grn_cgo.h    2015-05-01 12:42:33 +0900 (2a1b3ce)
+++ go3/gnx/grn_cgo.h    2015-05-01 15:41:30 +0900 (7194c14)
@@ -120,7 +120,7 @@ grn_bool grn_cgo_column_get_int_vector(grn_ctx *ctx, grn_obj *column,
                                         grn_id id, grn_cgo_vector *value);
 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_geo_point_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 12:42:33 +0900 (951769d)
+++ go3/gnx/grn_test.go    2015-05-01 15:41:30 +0900 (9cb7b9b)
@@ -479,6 +479,6 @@ func TestGrnColumnGetValue(t *testing.T) {
 	testGrnColumnGetVectorValue(t, "Bool")
 	testGrnColumnGetVectorValue(t, "Int")
 	testGrnColumnGetVectorValue(t, "Float")
-//	testGrnColumnGetVectorValue(t, "GeoPoint")
+	testGrnColumnGetVectorValue(t, "GeoPoint")
 //	testGrnColumnGetVectorValue(t, "Text")
 }
-------------- next part --------------
HTML����������������������������...
下载 



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