null+****@clear*****
null+****@clear*****
2010年 8月 12日 (木) 10:15:37 JST
Kouhei Sutou 2010-08-12 01:15:37 +0000 (Thu, 12 Aug 2010) New Revision: 0aa339c773c41712c5a1766cc60ea68d1de87e8c Log: use grn_geo_in_rectangle(). Modified files: lib/proc.c test/unit/story/taiyaki/test-geo.c Modified: lib/proc.c (+1 -20) =================================================================== --- lib/proc.c 2010-08-11 09:24:27 +0000 (4814e39) +++ lib/proc.c 2010-08-12 01:15:37 +0000 (ae81437) @@ -2069,26 +2069,7 @@ func_geo_in_rectangle(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *us grn_obj *obj; unsigned char r = GRN_FALSE; if (nargs == 3) { - grn_obj *pos = args[0], *pos1 = args[1], *pos2 = args[2], pos1_, pos2_; - grn_geo_point *p, *p1, *p2; - grn_id domain = pos->header.domain; - if (domain == GRN_DB_TOKYO_GEO_POINT || domain == GRN_DB_WGS84_GEO_POINT) { - if (pos1->header.domain != domain) { - GRN_OBJ_INIT(&pos1_, GRN_BULK, 0, domain); - if (grn_obj_cast(ctx, pos1, &pos1_, 0)) { goto exit; } - pos1 = &pos1_; - } - if (pos2->header.domain != domain) { - GRN_OBJ_INIT(&pos2_, GRN_BULK, 0, domain); - if (grn_obj_cast(ctx, pos2, &pos2_, 0)) { goto exit; } - pos2 = &pos2_; - } - p = ((grn_geo_point *)GRN_BULK_HEAD(pos)); - p1 = ((grn_geo_point *)GRN_BULK_HEAD(pos1)); - p2 = ((grn_geo_point *)GRN_BULK_HEAD(pos2)); - r = ((p1->longitude <= p->longitude) && (p->longitude <= p2->longitude) && - (p1->latitude <= p->latitude) && (p->latitude <= p2->latitude)); - } + r = grn_geo_in_rectangle(ctx, args[0], args[1], args[2]); } exit : if ((obj = GRN_PROC_ALLOC(GRN_DB_UINT32, 0))) { Modified: test/unit/story/taiyaki/test-geo.c (+31 -0) =================================================================== --- test/unit/story/taiyaki/test-geo.c 2010-08-11 09:24:27 +0000 (f9a6a69) +++ test/unit/story/taiyaki/test-geo.c 2010-08-12 01:15:37 +0000 (3910718) @@ -22,6 +22,7 @@ #include "../../lib/grn-assertions.h" void test_in_circle(void); +void test_in_rectangle(void); void test_sort(void); void test_filter_by_tag_and_sort_by_distance_from_tokyo_tocho(void); void test_but_white(void); @@ -122,6 +123,36 @@ test_in_circle(void) } void +test_in_rectangle(void) +{ + gdouble takada_no_baba_latitude = 35.7121; + gdouble takada_no_baba_longitude = 139.7038; + gdouble tsukiji_latitude = 35.6684; + gdouble tsukiji_longitude = 139.7727; + gdouble budoukan_latitude = 35.69328; + gdouble budoukan_longitude = 139.74968; + + cut_assert_equal_string( + "[[[3]," + "[[\"name\",\"ShortText\"],[\"_score\",\"Int32\"]]," + "[\"たいやき神田達磨 八重洲店\",3273]," + "[\"銀座 かずや\",3713]," + "[\"たい焼き鉄次 大丸東京店\",3732]" + "]]", + send_command( + cut_take_printf( + "select Shops " + "--sortby '+_score, +name' " + "--output_columns 'name, _score' " + "--filter 'geo_in_rectangle(location, \"%s\", \"%s\") > 0' " + "--scorer '_score=geo_distance(location, \"%s\")'", + grn_test_location_string(takada_no_baba_latitude, + takada_no_baba_longitude), + grn_test_location_string(tsukiji_latitude, tsukiji_longitude), + grn_test_location_string(budoukan_latitude, budoukan_longitude)))); +} + +void test_sort(void) { gdouble yurakucho_latitude = 35.67487;