[Groonga-commit] groonga/groonga at a0031bb [master] geo_in_rectangle: extract computing code for in_rectangle_data

Back to archive index

Kouhei Sutou null+****@clear*****
Sat Dec 7 20:40:15 JST 2013


Kouhei Sutou	2013-12-07 20:40:15 +0900 (Sat, 07 Dec 2013)

  New Revision: a0031bbd7e4b9db97a1a2a662ade297bbbe7447b
  https://github.com/groonga/groonga/commit/a0031bbd7e4b9db97a1a2a662ade297bbbe7447b

  Message:
    geo_in_rectangle: extract computing code for in_rectangle_data

  Modified files:
    lib/geo.c

  Modified: lib/geo.c (+59 -52)
===================================================================
--- lib/geo.c    2013-12-07 20:33:12 +0900 (b1299bf)
+++ lib/geo.c    2013-12-07 20:40:15 +0900 (513bf22)
@@ -1061,6 +1061,62 @@ exit :
   return ctx->rc;
 }
 
+static void
+in_rectangle_data_compute(grn_ctx *ctx, in_rectangle_data *data)
+{
+  int latitude_distance, longitude_distance;
+  int diff_bit;
+  grn_geo_point base;
+  grn_geo_point *top_left, *bottom_right;
+  grn_geo_point *geo_point_input;
+  uint8_t geo_key_input[sizeof(grn_geo_point)];
+  uint8_t geo_key_base[sizeof(grn_geo_point)];
+  uint8_t geo_key_top_left[sizeof(grn_geo_point)];
+  uint8_t geo_key_bottom_right[sizeof(grn_geo_point)];
+
+  top_left = data->top_left;
+  bottom_right = data->bottom_right;
+
+  latitude_distance = top_left->latitude - bottom_right->latitude;
+  longitude_distance = bottom_right->longitude - top_left->longitude;
+  if (latitude_distance > longitude_distance) {
+    geo_point_input = bottom_right;
+    base.latitude = bottom_right->latitude;
+    base.longitude = bottom_right->longitude - longitude_distance;
+  } else {
+    geo_point_input = top_left;
+    base.latitude = top_left->latitude - latitude_distance;
+    base.longitude = top_left->longitude;
+  }
+  grn_gton(geo_key_input, geo_point_input, sizeof(grn_geo_point));
+  grn_gton(geo_key_base, &base, sizeof(grn_geo_point));
+  diff_bit = compute_diff_bit(geo_key_input, geo_key_base);
+  compute_min_and_max(&base, diff_bit, &(data->min), &(data->max));
+
+  grn_gton(geo_key_top_left, top_left, sizeof(grn_geo_point));
+  grn_gton(geo_key_bottom_right, bottom_right, sizeof(grn_geo_point));
+  data->rectangle_common_bit =
+    compute_diff_bit(geo_key_top_left, geo_key_bottom_right) - 1;
+  compute_min_and_max_key(geo_key_top_left, data->rectangle_common_bit + 1,
+                          data->rectangle_common_key, NULL);
+
+#ifdef GEO_DEBUG
+  printf("base:         ");
+  grn_p_geo_point(ctx, &base);
+  printf("min:          ");
+  grn_p_geo_point(ctx, &(data->min));
+  printf("max:          ");
+  grn_p_geo_point(ctx, &(data->max));
+  printf("top-left:     ");
+  grn_p_geo_point(ctx, top_left);
+  printf("bottom-right: ");
+  grn_p_geo_point(ctx, bottom_right);
+  printf("rectangle-common-bit:%10d\n", data->rectangle_common_bit);
+  printf("distance(latitude):  %10d\n", latitude_distance);
+  printf("distance(longitude): %10d\n", longitude_distance);
+#endif
+}
+
 static grn_rc
 in_rectangle_data_prepare(grn_ctx *ctx, grn_obj *index,
                           grn_obj *top_left_point,
@@ -1120,58 +1176,9 @@ in_rectangle_data_prepare(grn_ctx *ctx, grn_obj *index,
     goto exit;
   }
 
-  {
-    int latitude_distance, longitude_distance;
-    int diff_bit;
-    grn_geo_point base;
-    grn_geo_point *top_left, *bottom_right;
-    grn_geo_point *geo_point_input;
-    uint8_t geo_key_input[sizeof(grn_geo_point)];
-    uint8_t geo_key_base[sizeof(grn_geo_point)];
-    uint8_t geo_key_top_left[sizeof(grn_geo_point)];
-    uint8_t geo_key_bottom_right[sizeof(grn_geo_point)];
-
-    top_left = data->top_left;
-    bottom_right = data->bottom_right;
-
-    latitude_distance = top_left->latitude - bottom_right->latitude;
-    longitude_distance = bottom_right->longitude - top_left->longitude;
-    if (latitude_distance > longitude_distance) {
-      geo_point_input = bottom_right;
-      base.latitude = bottom_right->latitude;
-      base.longitude = bottom_right->longitude - longitude_distance;
-    } else {
-      geo_point_input = top_left;
-      base.latitude = top_left->latitude - latitude_distance;
-      base.longitude = top_left->longitude;
-    }
-    grn_gton(geo_key_input, geo_point_input, sizeof(grn_geo_point));
-    grn_gton(geo_key_base, &base, sizeof(grn_geo_point));
-    diff_bit = compute_diff_bit(geo_key_input, geo_key_base);
-    compute_min_and_max(&base, diff_bit, &(data->min), &(data->max));
-
-    grn_gton(geo_key_top_left, top_left, sizeof(grn_geo_point));
-    grn_gton(geo_key_bottom_right, bottom_right, sizeof(grn_geo_point));
-    data->rectangle_common_bit =
-      compute_diff_bit(geo_key_top_left, geo_key_bottom_right) - 1;
-    compute_min_and_max_key(geo_key_top_left, data->rectangle_common_bit + 1,
-                            data->rectangle_common_key, NULL);
-
-#ifdef GEO_DEBUG
-    printf("base:         ");
-    grn_p_geo_point(ctx, &base);
-    printf("min:          ");
-    grn_p_geo_point(ctx, &(data->min));
-    printf("max:          ");
-    grn_p_geo_point(ctx, &(data->max));
-    printf("top-left:     ");
-    grn_p_geo_point(ctx, top_left);
-    printf("bottom-right: ");
-    grn_p_geo_point(ctx, bottom_right);
-    printf("rectangle-common-bit:%10d\n", data->rectangle_common_bit);
-    printf("distance(latitude):  %10d\n", latitude_distance);
-    printf("distance(longitude): %10d\n", longitude_distance);
-#endif
+  in_rectangle_data_compute(ctx, data);
+  if (ctx->rc != GRN_SUCCESS) {
+    goto exit;
   }
 
 exit :
-------------- next part --------------
HTML����������������������������...
Download 



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