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