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����������������������������...下载