null+****@clear*****
null+****@clear*****
2010年 8月 10日 (火) 09:26:53 JST
Kouhei Sutou 2010-08-10 00:26:53 +0000 (Tue, 10 Aug 2010) New Revision: 8ef45ca4e67d0e16a4acfae07588d21d2174a711 Log: split mesh detection logic. Modified files: lib/geo.c Modified: lib/geo.c (+25 -10) =================================================================== --- lib/geo.c 2010-08-10 00:11:40 +0000 (0d2b81c) +++ lib/geo.c 2010-08-10 00:26:53 +0000 (7ee7669) @@ -197,21 +197,17 @@ typedef enum { MESH_LEFT_BOTTOM } mesh_position; +/* meshes should have 19 >= spaces.*/ static int -grn_geo_table_sort_collect_points(grn_ctx *ctx, grn_obj *table, grn_obj *index, - grn_pat *pat, - geo_entry *entries, int n_entries, - int n, int accessorp, - grn_geo_point *base_point, - double d_far, int diff_bit) +grn_geo_get_meshes_for_circle(grn_ctx *ctx, grn_geo_point *base_point, + double d_far, int diff_bit, + mesh_entry *meshes) { + double d; int n_meshes; - grn_geo_point geo_base, geo_min, geo_max; - mesh_entry meshes[19]; int lat_diff, lng_diff; - double d; - geo_entry *ep, *p; mesh_position position; + grn_geo_point geo_base, geo_min, geo_max; compute_min_and_max(base_point, diff_bit, &geo_min, &geo_max); @@ -353,6 +349,24 @@ grn_geo_table_sort_collect_points(grn_ctx *ctx, grn_obj *table, grn_obj *index, #undef add_sub_mesh #undef add_mesh + return n_meshes; +} + +static int +grn_geo_table_sort_collect_points(grn_ctx *ctx, grn_obj *table, grn_obj *index, + grn_pat *pat, + geo_entry *entries, int n_entries, + int n, int accessorp, + grn_geo_point *base_point, + double d_far, int diff_bit) +{ + int n_meshes; + mesh_entry meshes[19]; + geo_entry *ep, *p; + + n_meshes = grn_geo_get_meshes_for_circle(ctx, base_point, d_far, diff_bit, + meshes); + ep = entries + n_entries; while (n_meshes--) { grn_id tid; @@ -367,6 +381,7 @@ grn_geo_table_sort_collect_points(grn_ctx *ctx, grn_obj *table, grn_obj *index, while ((tid = grn_pat_cursor_next(ctx, pc))) { grn_ii_cursor *ic = grn_ii_cursor_open(ctx, (grn_ii *)index, tid, 0, 0, 1, 0); if (ic) { + double d; grn_geo_point pos; grn_ii_posting *posting; grn_pat_get_key(ctx, pat, tid, &pos, sizeof(grn_geo_point));