null+****@clear*****
null+****@clear*****
2011年 10月 19日 (水) 23:13:55 JST
Kouhei Sutou 2011-10-19 14:13:55 +0000 (Wed, 19 Oct 2011)
New Revision: 9df80ce876d391d4531786f862edd70ab9fea042
Log:
[geo] remove loop grn_geo_select_in_rectangle() implementation.
Modified files:
lib/geo.c
test/benchmark/bench-geo-select.c
Modified: lib/geo.c (+5 -93)
===================================================================
--- lib/geo.c 2011-10-19 14:07:57 +0000 (3545dd9)
+++ lib/geo.c 2011-10-19 14:13:55 +0000 (95eb2d1)
@@ -1119,74 +1119,6 @@ grn_geo_cursor_close(grn_ctx *ctx, grn_obj *geo_cursor)
return GRN_SUCCESS;
}
-static inline grn_rc
-grn_geo_select_in_rectangle_loop(grn_ctx *ctx, grn_obj *index,
- grn_obj *top_left_point,
- grn_obj *bottom_right_point,
- grn_obj *res, grn_operator op)
-{
- in_rectangle_data data;
-
- GRN_VOID_INIT(&(data.top_left_point_buffer));
- GRN_VOID_INIT(&(data.bottom_right_point_buffer));
- if (in_rectangle_data_prepare(ctx, index, top_left_point, bottom_right_point,
- "geo_in_rectangle()", &data)) {
- goto exit;
- }
-
- {
- grn_obj *pat;
- int diff_bit, mesh_point, start, end, distance;
- grn_geo_point *top_left, *bottom_right, *base;
- grn_geo_mesh_direction direction;
-
- pat = data.pat;
- start = data.start;
- end = data.end;
- distance = data.distance;
- direction = data.direction;
- top_left = data.top_left;
- bottom_right = data.bottom_right;
- base = &(data.base);
- diff_bit = data.diff_bit;
- for (mesh_point = start; mesh_point < end + distance; mesh_point += distance) {
- grn_table_cursor *tc;
- tc = grn_table_cursor_open(ctx, pat,
- base, diff_bit,
- NULL, 0,
- 0, -1,
- GRN_CURSOR_PREFIX|GRN_CURSOR_SIZE_BY_BIT);
-#ifdef GEO_DEBUG
- printf("mesh-point: %10d\n", mesh_point);
-#endif
- inspect_mesh(ctx, base, diff_bit, (mesh_point - start) / distance);
- if (tc) {
- grn_id tid;
- grn_geo_point point;
- while ((tid = grn_table_cursor_next(ctx, tc))) {
- grn_table_get_key(ctx, pat, tid, &point, sizeof(grn_geo_point));
- if (!grn_geo_in_rectangle_raw(ctx, &point, top_left, bottom_right)) {
- continue;
- }
- inspect_tid(ctx, tid, &point, 0);
- grn_ii_at(ctx, (grn_ii *)index, tid, (grn_hash *)res, op);
- }
- grn_table_cursor_close(ctx, tc);
- }
- if (direction == GRN_GEO_MESH_LATITUDE) {
- base->latitude += distance;
- } else {
- base->longitude += distance;
- }
- }
- }
-exit :
- grn_obj_unlink(ctx, &(data.top_left_point_buffer));
- grn_obj_unlink(ctx, &(data.bottom_right_point_buffer));
- grn_ii_resolve_sel_and(ctx, (grn_hash *)res, op);
- return ctx->rc;
-}
-
typedef struct {
grn_hash *res;
grn_operator op;
@@ -1201,11 +1133,11 @@ grn_geo_select_in_rectangle_callback(grn_ctx *ctx, grn_ii_posting *posting,
return GRN_TRUE;
}
-static inline grn_rc
-grn_geo_select_in_rectangle_cursor(grn_ctx *ctx, grn_obj *index,
- grn_obj *top_left_point,
- grn_obj *bottom_right_point,
- grn_obj *res, grn_operator op)
+grn_rc
+grn_geo_select_in_rectangle(grn_ctx *ctx, grn_obj *index,
+ grn_obj *top_left_point,
+ grn_obj *bottom_right_point,
+ grn_obj *res, grn_operator op)
{
grn_obj *cursor;
grn_posting *posting;
@@ -1227,26 +1159,6 @@ grn_geo_select_in_rectangle_cursor(grn_ctx *ctx, grn_obj *index,
return ctx->rc;
}
-grn_rc
-grn_geo_select_in_rectangle(grn_ctx *ctx, grn_obj *index,
- grn_obj *top_left_point, grn_obj *bottom_right_point,
- grn_obj *res, grn_operator op)
-{
- char *grn_geo_select_in_rectangle_env;
-
- grn_geo_select_in_rectangle_env = getenv("GRN_GEO_SELECT_IN_RECTANGLE");
- if (grn_geo_select_in_rectangle_env &&
- strcmp(grn_geo_select_in_rectangle_env, "cursor") == 0) {
- return grn_geo_select_in_rectangle_cursor(ctx, index,
- top_left_point, bottom_right_point,
- res, op);
- } else {
- return grn_geo_select_in_rectangle_loop(ctx, index,
- top_left_point, bottom_right_point,
- res, op);
- }
-}
-
static grn_rc
geo_point_get(grn_ctx *ctx, grn_obj *pat, int flags, grn_geo_point *geo_point)
{
Modified: test/benchmark/bench-geo-select.c (+14 -71)
===================================================================
--- test/benchmark/bench-geo-select.c 2011-10-19 14:07:57 +0000 (867306f)
+++ test/benchmark/bench-geo-select.c 2011-10-19 14:13:55 +0000 (537c772)
@@ -51,8 +51,6 @@ typedef struct _BenchmarkData
grn_obj top_left_point;
grn_obj bottom_right_point;
-
- const gchar *original_in_rectangle_implementation;
} BenchmarkData;
static void
@@ -73,9 +71,6 @@ bench_setup_common(gpointer user_data)
const gchar *tokyo_station = "35.68136,139.76609";
const gchar *ikebukuro_station = "35.72890,139.71036";
- data->original_in_rectangle_implementation =
- g_getenv("GRN_GEO_SELECT_IN_RECTANGLE");
-
data->result = grn_table_create(data->context, NULL, 0, NULL,
GRN_OBJ_TABLE_HASH_KEY | GRN_OBJ_WITH_SUBREC,
data->table, NULL);
@@ -87,18 +82,6 @@ bench_setup_common(gpointer user_data)
}
static void
-bench_setup_implementation_loop(gpointer user_data)
-{
- g_setenv("GRN_GEO_SELECT_IN_RECTANGLE", "loop", TRUE);
-}
-
-static void
-bench_setup_implementation_cursor(gpointer user_data)
-{
- g_setenv("GRN_GEO_SELECT_IN_RECTANGLE", "cursor", TRUE);
-}
-
-static void
bench_setup_query_partial(gpointer user_data)
{
BenchmarkData *data = user_data;
@@ -125,34 +108,16 @@ bench_setup_query_all(gpointer user_data)
}
static void
-bench_setup_in_rectangle_loop_partial(gpointer user_data)
-{
- bench_setup_common(user_data);
- bench_setup_implementation_loop(user_data);
- bench_setup_query_partial(user_data);
-}
-
-static void
-bench_setup_in_rectangle_cursor_partial(gpointer user_data)
+bench_setup_in_rectangle_partial(gpointer user_data)
{
bench_setup_common(user_data);
- bench_setup_implementation_cursor(user_data);
bench_setup_query_partial(user_data);
}
static void
-bench_setup_in_rectangle_loop_all(gpointer user_data)
-{
- bench_setup_common(user_data);
- bench_setup_implementation_loop(user_data);
- bench_setup_query_all(user_data);
-}
-
-static void
-bench_setup_in_rectangle_cursor_all(gpointer user_data)
+bench_setup_in_rectangle_all(gpointer user_data)
{
bench_setup_common(user_data);
- bench_setup_implementation_cursor(user_data);
bench_setup_query_all(user_data);
}
@@ -179,15 +144,6 @@ bench_teardown(gpointer user_data)
}
grn_obj_unlink(data->context, data->result);
-
- if (data->original_in_rectangle_implementation) {
- g_setenv("GRN_GEO_SELECT_IN_RECTANGLE",
- data->original_in_rectangle_implementation,
- TRUE);
- } else {
- g_unsetenv("GRN_GEO_SELECT_IN_RECTANGLE");
- }
- data->original_in_rectangle_implementation = NULL;
}
static gchar *
@@ -256,31 +212,18 @@ main(int argc, gchar **argv)
reporter = bench_reporter_new();
-#define REGISTER(label, type, implementation, area) \
- bench_reporter_register( \
- reporter, \
- label, \
- n, \
- bench_setup_ ## type ## _ ## implementation ## _ ## area, \
- bench_geo_select_ ## type, \
- bench_teardown, \
- &data)
- REGISTER("1st: select_in_rectangle (loop) (partial)",
- in_rectangle, loop, partial);
- REGISTER("1st: select_in_rectangle (cursor) (partial)",
- in_rectangle, cursor, partial);
- REGISTER("2nd: select_in_rectangle (loop) (partial)",
- in_rectangle, loop, partial);
- REGISTER("2nd: select_in_rectangle (cursor) (partial)",
- in_rectangle, cursor, partial);
- REGISTER("1st: select_in_rectangle (loop) (all)",
- in_rectangle, loop, all);
- REGISTER("1st: select_in_rectangle (cursor) (all)",
- in_rectangle, cursor, all);
- REGISTER("2nd: select_in_rectangle (loop) (all)",
- in_rectangle, loop, all);
- REGISTER("2nd: select_in_rectangle (cursor) (all)",
- in_rectangle, cursor, all);
+#define REGISTER(label, type, area) \
+ bench_reporter_register(reporter, \
+ label, \
+ n, \
+ bench_setup_ ## type ## _ ## area, \
+ bench_geo_select_ ## type, \
+ bench_teardown, \
+ &data)
+ REGISTER("1st: select_in_rectangle (partial)", in_rectangle, partial);
+ REGISTER("2nd: select_in_rectangle (partial)", in_rectangle, partial);
+ REGISTER("1st: select_in_rectangle (all)", in_rectangle, all);
+ REGISTER("2nd: select_in_rectangle (all)", in_rectangle, all);
#undef REGISTER
bench_reporter_run(reporter);