susumu.yata
null+****@clear*****
Fri May 1 12:39:17 JST 2015
susumu.yata 2015-05-01 12:39:17 +0900 (Fri, 01 May 2015) New Revision: 66ef8df6016f951d27a1854148328a99528ab4b0 https://github.com/groonga/grnxx/commit/66ef8df6016f951d27a1854148328a99528ab4b0 Message: Gnx: implement Column.GetValue() for vector types of Bool, Int, and Float. 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 (+87 -3) =================================================================== --- go3/gnx/grn.go 2015-05-01 11:28:14 +0900 (2c85255) +++ go3/gnx/grn.go 2015-05-01 12:39:17 +0900 (0869f1d) @@ -1019,6 +1019,88 @@ func (column *GrnColumn) getText(id Int) (interface{}, error) { return value, nil } +// getBoolVector() gets a BoolVector. +func (column *GrnColumn) getBoolVector(id Int) (interface{}, error) { + var grnVector C.grn_cgo_vector + if ok := C.grn_cgo_column_get_bool_vector(column.table.db.ctx, column.obj, + C.grn_id(id), &grnVector); ok != C.GRN_TRUE { + return nil, fmt.Errorf("grn_cgo_column_get_bool_vector() failed") + } + if grnVector.size == 0 { + return make([]Bool, 0), nil + } + grnValue := make([]C.grn_bool, int(grnVector.size)) + grnVector.ptr = unsafe.Pointer(&grnValue[0]) + if ok := C.grn_cgo_column_get_bool_vector(column.table.db.ctx, column.obj, + C.grn_id(id), &grnVector); ok != C.GRN_TRUE { + return nil, fmt.Errorf("grn_cgo_column_get_bool_vector() failed") + } + value := make([]Bool, int(grnVector.size)) + for i, v := range grnValue { + if v == C.GRN_TRUE { + value[i] = True + } + } + return value, nil +} + +// getIntVector() gets a IntVector. +func (column *GrnColumn) getIntVector(id Int) (interface{}, error) { + var grnValue C.grn_cgo_vector + if ok := C.grn_cgo_column_get_int_vector(column.table.db.ctx, column.obj, + C.grn_id(id), &grnValue); ok != C.GRN_TRUE { + return nil, fmt.Errorf("grn_cgo_column_get_int_vector() failed") + } + if grnValue.size == 0 { + return make([]Int, 0), nil + } + value := make([]Int, int(grnValue.size)) + grnValue.ptr = unsafe.Pointer(&value[0]) + if ok := C.grn_cgo_column_get_int_vector(column.table.db.ctx, column.obj, + C.grn_id(id), &grnValue); ok != C.GRN_TRUE { + return nil, fmt.Errorf("grn_cgo_column_get_int_vector() failed") + } + return value, nil +} + +// getFloatVector() gets a FloatVector. +func (column *GrnColumn) getFloatVector(id Int) (interface{}, error) { + var grnValue C.grn_cgo_vector + if ok := C.grn_cgo_column_get_float_vector(column.table.db.ctx, column.obj, + C.grn_id(id), &grnValue); ok != C.GRN_TRUE { + return nil, fmt.Errorf("grn_cgo_column_get_float_vector() failed") + } + if grnValue.size == 0 { + return make([]Float, 0), nil + } + value := make([]Float, int(grnValue.size)) + grnValue.ptr = unsafe.Pointer(&value[0]) + if ok := C.grn_cgo_column_get_float_vector(column.table.db.ctx, column.obj, + C.grn_id(id), &grnValue); ok != C.GRN_TRUE { + return nil, fmt.Errorf("grn_cgo_column_get_float_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. func (column *GrnColumn) GetValue(id Int) (interface{}, error) { @@ -1038,14 +1120,16 @@ func (column *GrnColumn) GetValue(id Int) (interface{}, error) { } else { switch column.valueType { case BoolID: - return nil, fmt.Errorf("not supported yet") + return column.getBoolVector(id) case IntID: - return nil, fmt.Errorf("not supported yet") + return column.getIntVector(id) case FloatID: - return nil, fmt.Errorf("not supported yet") + return column.getFloatVector(id) case GeoPointID: +// return column.getGeoPointVector(id) return nil, fmt.Errorf("not supported yet") case TextID: +// return column.getTextVector(id) return nil, fmt.Errorf("not supported yet") } } Modified: go3/gnx/grn_cgo.c (+68 -0) =================================================================== --- go3/gnx/grn_cgo.c 2015-05-01 11:28:14 +0900 (ffd26c2) +++ go3/gnx/grn_cgo.c 2015-05-01 12:39:17 +0900 (39a9bc9) @@ -376,3 +376,71 @@ grn_bool grn_cgo_column_get_text(grn_ctx *ctx, grn_obj *column, GRN_OBJ_FIN(ctx, &value_obj); return GRN_TRUE; } + +grn_bool grn_cgo_column_get_bool_vector(grn_ctx *ctx, grn_obj *column, + grn_id id, grn_cgo_vector *value) { + grn_obj value_obj; + GRN_BOOL_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++) { + ((grn_bool *)value->ptr)[i] = GRN_BOOL_VALUE_AT(&value_obj, i); + } + } + value->size = size; + GRN_OBJ_FIN(ctx, &value_obj); + return GRN_TRUE; +} + +grn_bool grn_cgo_column_get_int_vector(grn_ctx *ctx, grn_obj *column, + grn_id id, grn_cgo_vector *value) { + grn_obj value_obj; + GRN_INT64_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++) { + ((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_float_vector(grn_ctx *ctx, grn_obj *column, + grn_id id, grn_cgo_vector *value) { + grn_obj value_obj; + GRN_FLOAT_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++) { + ((double *)value->ptr)[i] = GRN_FLOAT_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 = grn_vector_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;*/ +/*}*/ Modified: go3/gnx/grn_cgo.h (+8 -0) =================================================================== --- go3/gnx/grn_cgo.h 2015-05-01 11:28:14 +0900 (5ac72f5) +++ go3/gnx/grn_cgo.h 2015-05-01 12:39:17 +0900 (2a1b3ce) @@ -114,5 +114,13 @@ grn_bool grn_cgo_column_get_geo_point(grn_ctx *ctx, grn_obj *column, grn_id id, grn_geo_point *value); grn_bool grn_cgo_column_get_text(grn_ctx *ctx, grn_obj *column, grn_id id, grn_cgo_text *value); +grn_bool grn_cgo_column_get_bool_vector(grn_ctx *ctx, grn_obj *column, + grn_id id, grn_cgo_vector *value); +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); #endif // GRN_CGO_H Modified: go3/gnx/grn_test.go (+29 -3) =================================================================== --- go3/gnx/grn_test.go 2015-05-01 11:28:14 +0900 (360ecd7) +++ go3/gnx/grn_test.go 2015-05-01 12:39:17 +0900 (951769d) @@ -443,6 +443,32 @@ func testGrnColumnGetScalarValue(t *testing.T, valueType string) { } } +func testGrnColumnGetVectorValue(t *testing.T, valueType string) { + options := NewColumnOptions() + options.ColumnType = VectorColumn + dirPath, _, db, table, column := createTempGrnColumn(t, "Table", nil, "Value", valueType, options) + defer removeTempGrnDB(t, dirPath, db) + + for i := 0; i < 100; i++ { + _, id, err := table.InsertRow(nil) + if err != nil { + t.Fatalf("GrnTable.InsertRow() failed: %v", err) + } + value := generateRandomVectorValue(valueType) + if err := column.SetValue(id, value); err != nil { + t.Fatalf("GrnColumn.SetValue() failed: %v", err) + } + if storedValue, err := column.GetValue(id); err != nil { + t.Fatalf("GrnColumn.GetValue() failed: %v", err) + } else if !reflect.DeepEqual(value, storedValue) { + t.Fatalf("GrnColumn.GetValue() failed: value = %v, storedValue = %v", value, storedValue) + } + } + + bytes, _ := db.Query("select Table --limit 3") + t.Logf("valueType = <%s>, result = %s", valueType, string(bytes)) +} + func TestGrnColumnGetValue(t *testing.T) { testGrnColumnGetScalarValue(t, "Bool") testGrnColumnGetScalarValue(t, "Int") @@ -450,9 +476,9 @@ func TestGrnColumnGetValue(t *testing.T) { testGrnColumnGetScalarValue(t, "GeoPoint") testGrnColumnGetScalarValue(t, "Text") -// testGrnColumnGetVectorValue(t, "Bool") -// testGrnColumnGetVectorValue(t, "Int") -// testGrnColumnGetVectorValue(t, "Float") + testGrnColumnGetVectorValue(t, "Bool") + testGrnColumnGetVectorValue(t, "Int") + testGrnColumnGetVectorValue(t, "Float") // testGrnColumnGetVectorValue(t, "GeoPoint") // testGrnColumnGetVectorValue(t, "Text") } -------------- next part -------------- HTML����������������������������...Download