[Groonga-commit] groonga/groonga [master] [geo] remove loop grn_geo_select_in_rectangle() implementation.

Back to archive index

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);




Groonga-commit メーリングリストの案内
Back to archive index