Navigation Menu

Skip to content

Commit

Permalink
Gnx: support GeoPoint.
Browse files Browse the repository at this point in the history
  • Loading branch information
s-yata committed Apr 9, 2015
1 parent ca16fca commit 57faf5c
Show file tree
Hide file tree
Showing 3 changed files with 125 additions and 44 deletions.
59 changes: 45 additions & 14 deletions go2/gnx/gnx.cpp
Expand Up @@ -35,10 +35,10 @@ gnx_bool gnx_insert_row2(grn_ctx *ctx, grn_obj *table,
key_size = sizeof(gnx_float);
break;
}
// case GNX_GEO_POINT: {
// key_size = sizeof(gnx_geo_point);
// break;
// }
case GNX_GEO_POINT: {
key_size = sizeof(gnx_geo_point);
break;
}
case GNX_TEXT: {
gnx_text text = *static_cast<const gnx_text *>(key);
key = text.data;
Expand Down Expand Up @@ -98,9 +98,12 @@ gnx_bool gnx_set_value2(grn_ctx *ctx, grn_obj *column, gnx_int row_id,
GRN_FLOAT_SET(ctx, &obj, *static_cast<const gnx_float *>(value));
break;
}
// case GNX_GEO_POINT: {
// break;
// }
case GNX_GEO_POINT: {
gnx_geo_point geo_point = *static_cast<const gnx_geo_point *>(value);
GRN_WGS84_GEO_POINT_INIT(&obj, 0);
GRN_GEO_POINT_SET(ctx, &obj, geo_point.latitude, geo_point.longitude);
break;
}
case GNX_TEXT: {
gnx_text text = *static_cast<const gnx_text *>(value);
GRN_TEXT_INIT(&obj, 0);
Expand Down Expand Up @@ -185,10 +188,23 @@ gnx_int gnx_insert_rows2(grn_ctx *ctx, grn_obj *table,
}
break;
}
// case GNX_GEO_POINT: {
// key_size = sizeof(gnx_geo_point);
// break;
// }
case GNX_GEO_POINT: {
const gnx_geo_point *geo_point_keys =
static_cast<const gnx_geo_point *>(keys);
for (gnx_int i = 0; i < num_keys; ++i) {
int added;
grn_id id = grn_table_add(ctx, table, &geo_point_keys[i],
sizeof(gnx_geo_point), &added);
if (id == GRN_ID_NIL) {
row_ids[i] = GNX_NA_INT;
} else {
row_ids[i] = id;
++count;
}
inserted[i] = added ? GNX_TRUE : GNX_FALSE;
}
break;
}
case GNX_TEXT: {
const gnx_text *text_keys = static_cast<const gnx_text *>(keys);
for (gnx_int i = 0; i < num_keys; ++i) {
Expand Down Expand Up @@ -291,9 +307,24 @@ gnx_int gnx_set_values2(grn_ctx *ctx, grn_obj *table, grn_obj *column,
GRN_OBJ_FIN(ctx, &obj);
break;
}
// case GNX_GEO_POINT: {
// break;
// }
case GNX_GEO_POINT: {
grn_obj obj;
GRN_WGS84_GEO_POINT_INIT(&obj, 0);
for (gnx_int i = 0; i < num_values; ++i) {
gnx_geo_point value = static_cast<const gnx_geo_point *>(values)[i];
GRN_GEO_POINT_SET(ctx, &obj, value.latitude, value.longitude);
grn_rc rc = grn_obj_set_value(ctx, column, row_ids[i], &obj,
GRN_OBJ_SET);
if (rc == GRN_SUCCESS) {
updated[i] = GNX_TRUE;
++count;
} else {
updated[i] = GNX_FALSE;
}
}
GRN_OBJ_FIN(ctx, &obj);
break;
}
case GNX_TEXT: {
grn_obj obj;
GRN_TEXT_INIT(&obj, 0);
Expand Down
104 changes: 75 additions & 29 deletions go2/gnx/gnx.go
Expand Up @@ -29,15 +29,15 @@ import (
type Bool uint8
type Int int64
type Float float64
//type GeoPoint struct {
// Latitude int32
// Longitude int32
//}
type GeoPoint struct {
Latitude int32
Longitude int32
}
type Text []byte
type BoolVector []Bool
type IntVector []Int
type FloatVector []Float
//type GeoPointVector []GeoPoint
type GeoPointVector []GeoPoint
type TextVector []Text

const (
Expand All @@ -58,9 +58,9 @@ func NAInt() Int {
func NAFloat() Float {
return Float(math.NaN())
}
//func NAGeoPoint() GeoPoint {
// return GeoPoint{math.MinInt32, math.MinInt32}
//}
func NAGeoPoint() GeoPoint {
return GeoPoint{math.MinInt32, math.MinInt32}
}
func NAText() Text {
return nil
}
Expand All @@ -73,9 +73,9 @@ func NAIntVector() IntVector {
func NAFloatVector() FloatVector {
return nil
}
//func NAGeoPointVector() GeoPointVector {
// return nil
//}
func NAGeoPointVector() GeoPointVector {
return nil
}
func NATextVector() TextVector {
return nil
}
Expand All @@ -89,9 +89,9 @@ func (this Int) IsNA() bool {
func (this Float) IsNA() bool {
return math.IsNaN(float64(this))
}
//func (this GeoPoint) IsNA() bool {
// return this.Latitude == math.MinInt32
//}
func (this GeoPoint) IsNA() bool {
return this.Latitude == math.MinInt32
}
func (this Text) IsNA() bool {
return this == nil
}
Expand All @@ -104,13 +104,16 @@ func (this IntVector) IsNA() bool {
func (this FloatVector) IsNA() bool {
return this == nil
}
//func (this GeoPointVector) IsNA() bool {
// return this == nil
//}
func (this GeoPointVector) IsNA() bool {
return this == nil
}
func (this TextVector) IsNA() bool {
return this == nil
}

func (this GeoPoint) MarshalJSON() ([]byte, error) {
return []byte(fmt.Sprintf("%dx%d", this.Latitude, this.Longitude)), nil
}
func (this Text) MarshalJSON() ([]byte, error) {
return json.Marshal(string(this))
}
Expand All @@ -128,6 +131,8 @@ func countColumnarRecords(columnarRecords []interface{}) (int, error) {
thisLen = len(values)
case []Float:
thisLen = len(values)
case []GeoPoint:
thisLen = len(values)
case []Text:
thisLen = len(values)
case []BoolVector:
Expand All @@ -136,6 +141,8 @@ func countColumnarRecords(columnarRecords []interface{}) (int, error) {
thisLen = len(values)
case []FloatVector:
thisLen = len(values)
case []GeoPointVector:
thisLen = len(values)
case []TextVector:
thisLen = len(values)
default:
Expand Down Expand Up @@ -621,6 +628,12 @@ func (db *DB) hashFloat(value Float) int {
return int(hasher.Sum32())
}

func (db *DB) hashGeoPoint(value GeoPoint) int {
hasher := fnv.New32a()
binary.Write(hasher, binary.LittleEndian, value)
return int(hasher.Sum32())
}

func (db *DB) hashText(value Text) int {
hasher := fnv.New32a()
hasher.Write([]byte(value))
Expand All @@ -635,6 +648,8 @@ func (db *DB) selectGroongaDB(key Valuer) (int, error) {
return db.hashInt(value) % len(db.groongaDBs), nil
case Float:
return db.hashFloat(value) % len(db.groongaDBs), nil
case GeoPoint:
return db.hashGeoPoint(value) % len(db.groongaDBs), nil
case Text:
return db.hashText(value) % len(db.groongaDBs), nil
}
Expand Down Expand Up @@ -806,6 +821,11 @@ func (db *DB) loadC(
dbIDs[i] = db.hashFloat(keys[i]) % len(db.groongaDBs)
numRecordsPerDBs[dbIDs[i]]++
}
case []GeoPoint:
for i := 0; i < numRecords; i++ {
dbIDs[i] = db.hashGeoPoint(keys[i]) % len(db.groongaDBs)
numRecordsPerDBs[dbIDs[i]]++
}
case []Text:
for i := 0; i < numRecords; i++ {
dbIDs[i] = db.hashText(keys[i]) % len(db.groongaDBs)
Expand Down Expand Up @@ -854,6 +874,15 @@ func (db *DB) loadC(
for j := 0; j < len(db.groongaDBs); j++ {
columnarRecordsPerDBs[j][i] = valuesPerDBs[j]
}
case []GeoPoint:
valuesPerDBs := make([][]GeoPoint, len(db.groongaDBs))
for j, value := range values {
dbID := dbIDs[j]
valuesPerDBs[dbID] = append(valuesPerDBs[dbID], value)
}
for j := 0; j < len(db.groongaDBs); j++ {
columnarRecordsPerDBs[j][i] = valuesPerDBs[j]
}
case []Text:
valuesPerDBs := make([][]Text, len(db.groongaDBs))
for j, value := range values {
Expand Down Expand Up @@ -890,6 +919,15 @@ func (db *DB) loadC(
for j := 0; j < len(db.groongaDBs); j++ {
columnarRecordsPerDBs[j][i] = valuesPerDBs[j]
}
case []GeoPointVector:
valuesPerDBs := make([][]GeoPointVector, len(db.groongaDBs))
for j, value := range values {
dbID := dbIDs[j]
valuesPerDBs[dbID] = append(valuesPerDBs[dbID], value)
}
for j := 0; j < len(db.groongaDBs); j++ {
columnarRecordsPerDBs[j][i] = valuesPerDBs[j]
}
case []TextVector:
valuesPerDBs := make([][]TextVector, len(db.groongaDBs))
for j, value := range values {
Expand Down Expand Up @@ -1048,21 +1086,23 @@ func (db *DB) InsertRow(tableName string, key Valuer) (bool, Int, error) {
defer C.free(unsafe.Pointer(cTableName))
switch value := key.(type) {
case nil:
inserted = C.gnx_insert_row(
groongaDB.ctx, cTableName, C.GNX_NA, nil, &rowID)
inserted = C.gnx_insert_row(groongaDB.ctx, cTableName,
C.GNX_NA, nil, &rowID)
case Int:
inserted = C.gnx_insert_row(
groongaDB.ctx, cTableName, C.GNX_INT, unsafe.Pointer(&value), &rowID)
inserted = C.gnx_insert_row(groongaDB.ctx, cTableName,
C.GNX_INT, unsafe.Pointer(&value), &rowID)
case Float:
inserted = C.gnx_insert_row(
groongaDB.ctx, cTableName, C.GNX_FLOAT, unsafe.Pointer(&value), &rowID)
// case GeoPoint:
inserted = C.gnx_insert_row(groongaDB.ctx, cTableName,
C.GNX_FLOAT, unsafe.Pointer(&value), &rowID)
case GeoPoint:
inserted = C.gnx_insert_row(groongaDB.ctx, cTableName,
C.GNX_GEO_POINT, unsafe.Pointer(&value), &rowID)
case Text:
cValue := C.CString(string(value))
defer C.free(unsafe.Pointer(cValue))
text := C.gnx_text{cValue, C.gnx_int(len(value))}
inserted = C.gnx_insert_row(
groongaDB.ctx, cTableName, C.GNX_TEXT, unsafe.Pointer(&text), &rowID)
inserted = C.gnx_insert_row(groongaDB.ctx, cTableName,
C.GNX_TEXT, unsafe.Pointer(&text), &rowID)
default:
return false, NAInt(), fmt.Errorf("unsupported key type")
}
Expand Down Expand Up @@ -1097,7 +1137,9 @@ func (db *DB) SetValue(tableName string, columnName string, rowID Int,
case Float:
ok = C.gnx_set_value(groongaDB.ctx, cTableName, cColumnName,
C.gnx_int(rowID), C.GNX_FLOAT, unsafe.Pointer(&v))
// case GeoPoint:
case GeoPoint:
ok = C.gnx_set_value(groongaDB.ctx, cTableName, cColumnName,
C.gnx_int(rowID), C.GNX_GEO_POINT, unsafe.Pointer(&v))
case Text:
cValue := C.CString(string(v))
defer C.free(unsafe.Pointer(cValue))
Expand Down Expand Up @@ -1158,7 +1200,9 @@ func (db *DB) InsertRow2(table *Table, key Valuer) (bool, Int, error) {
case Float:
inserted = C.gnx_insert_row2(groongaDB.ctx, groongaTable.obj,
C.GNX_FLOAT, unsafe.Pointer(&value), &rowID)
// case GeoPoint:
case GeoPoint:
inserted = C.gnx_insert_row2(groongaDB.ctx, groongaTable.obj,
C.GNX_GEO_POINT, unsafe.Pointer(&value), &rowID)
case Text:
cValue := C.CString(string(value))
defer C.free(unsafe.Pointer(cValue))
Expand Down Expand Up @@ -1195,7 +1239,9 @@ func (db *DB) SetValue2(column *Column, rowID Int, value Valuer) error {
case Float:
ok = C.gnx_set_value2(groongaDB.ctx, groongaColumn.obj,
C.gnx_int(rowID), C.GNX_FLOAT, unsafe.Pointer(&v))
// case GeoPoint:
case GeoPoint:
ok = C.gnx_set_value2(groongaDB.ctx, groongaColumn.obj,
C.gnx_int(rowID), C.GNX_GEO_POINT, unsafe.Pointer(&v))
case Text:
cValue := C.CString(string(v))
defer C.free(unsafe.Pointer(cValue))
Expand Down
6 changes: 5 additions & 1 deletion go2/gnx/gnx.h
Expand Up @@ -20,7 +20,11 @@ typedef enum gnx_data_type {
typedef uint8_t gnx_bool;
typedef int64_t gnx_int;
typedef double gnx_float;
//typedef gnx_geo_point struct { int32_t latitude; int32_t longitude; };
//typedef grn_geo_point gnx_geo_point;
typedef struct {
int32_t latitude;
int32_t longitude;
} gnx_geo_point;
typedef struct {
const char *data;
gnx_int size;
Expand Down

0 comments on commit 57faf5c

Please sign in to comment.