null+****@clear*****
null+****@clear*****
2011年 11月 18日 (金) 17:16:15 JST
Kouhei Sutou 2011-11-18 08:16:15 +0000 (Fri, 18 Nov 2011)
New Revision: 5868d0204658dd11ad61d4f757f0c361a7b7db2c
Log:
[geo] make minimum reduce bit customizable. refs #1173
Modified files:
lib/geo.c
lib/geo.h
Modified: lib/geo.c (+16 -2)
===================================================================
--- lib/geo.c 2011-11-18 07:50:14 +0000 (a1a7855)
+++ lib/geo.c 2011-11-18 08:16:15 +0000 (4dd8047)
@@ -22,6 +22,8 @@
#include <string.h>
#include <stdlib.h>
+#define GEO_KEY_MAX_BITS 64
+
typedef struct {
grn_id id;
double d;
@@ -1089,6 +1091,17 @@ grn_geo_cursor_open_in_rectangle(grn_ctx *ctx,
(data.min.longitude == data.top_left->longitude &&
data.max.longitude == data.bottom_right->longitude);
}
+ {
+ const char *minimum_reduce_bit_env;
+ cursor->minimum_reduce_bit = 0;
+ minimum_reduce_bit_env = getenv("GRN_GEO_IN_RECTANGLE_MINIMUM_REDUCE_BIT");
+ if (minimum_reduce_bit_env) {
+ cursor->minimum_reduce_bit = atoi(minimum_reduce_bit_env);
+ }
+ if (cursor->minimum_reduce_bit < 1) {
+ cursor->minimum_reduce_bit = 1;
+ }
+ }
exit :
grn_obj_unlink(ctx, &(data.top_left_point_buffer));
@@ -1133,6 +1146,7 @@ grn_geo_cursor_entry_next(grn_ctx *ctx,
{
uint8_t *top_left_key = cursor->top_left_key;
uint8_t *bottom_right_key = cursor->bottom_right_key;
+ int max_target_bit = GEO_KEY_MAX_BITS - cursor->minimum_reduce_bit;
if (cursor->current_entry < 0) {
return GRN_FALSE;
@@ -1149,9 +1163,9 @@ grn_geo_cursor_entry_next(grn_ctx *ctx,
inspect_cursor_entry(ctx, entry);
#endif
- if (entry->target_bit >= 63) {
+ if (entry->target_bit >= max_target_bit) {
#ifdef GEO_DEBUG
- printf("only 1 entry is remained\n");
+ printf("%d: force stopping to reduce a mesh\n", entry->target_bit);
#endif
break;
}
Modified: lib/geo.h (+1 -0)
===================================================================
--- lib/geo.h 2011-11-18 07:50:14 +0000 (8ccfb73)
+++ lib/geo.h 2011-11-18 08:16:15 +0000 (2e14908)
@@ -94,6 +94,7 @@ struct _grn_geo_cursor_in_rectangle {
int rest;
grn_geo_cursor_entry entries[64];
int current_entry;
+ int minimum_reduce_bit;
};
grn_rc grn_geo_cursor_close(grn_ctx *ctx, grn_obj *geo_cursor);