[Groonga-commit] groonga/grnxx at 66ef8df [master] Gnx: implement Column.GetValue() for vector types of Bool, Int, and Float.

Back to archive index

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 



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