void data_near_geo_point(void) { #define ADD_DATA(label, expected, min_size, max, offset, limit, flags) \ gcut_add_datum(label, \ "expected", G_TYPE_POINTER, \ expected, gcut_list_string_free, \ "min-size", G_TYPE_INT, min_size, \ "max", G_TYPE_STRING, max, \ "offset", G_TYPE_INT, offset, \ "limit", G_TYPE_INT, limit, \ "flags", G_TYPE_INT, flags, \ NULL) ADD_DATA("no limit", gcut_list_string_new(POINT(1, 2, 3, 4, 5, 6), POINT(1, 2, 3, 7, 8, 9), POINT(7, 8, 9, 4, 5, 6), POINT(88, 58, 58, 178, 58, 58), POINT(89, 59, 59, 179, -59, -59), POINT(89, 59, 59, 179, 59, 59), POINT(-89, -59, -59, 179, 59, 59), POINT(-89, -59, -59, -179, -59, -59), POINT(-88, -58, -58, -178, -58, -58), NULL), 0, TAKEN_POINT(0, 0, 0, 0, 0, 0), 0, -1, 0); ADD_DATA("min-size", gcut_list_string_new(POINT(1, 2, 3, 4, 5, 6), POINT(1, 2, 3, 7, 8, 9), POINT(7, 8, 9, 4, 5, 6), NULL), 1, TAKEN_POINT(0, 0, 0, 0, 0, 0), 0, -1, 0); #undef ADD_DATA }
void test_near_geo_point(gpointer data) { grn_id id; int offset, limit; const GList *expected_keys; GList *actual_keys = NULL; grn_table_sort_key keys[2]; grn_obj base, base_string, location; create_geo_table(cut_take_printf(" [\"%s\"],\n" " [\"%s\"],\n" " [\"%s\"],\n" " [\"%s\"],\n" " [\"%s\"],\n" " [\"%s\"],\n" " [\"%s\"],\n" " [\"%s\"],\n" " [\"%s\"],\n" " [\"%s\"],\n" " [\"%s\"],\n" " [\"%s\"],\n" " [\"%s\"],\n" " [\"%s\"],\n" " [\"%s\"]", TAKEN_POINT(0, 0, 0, 180, 0, 0), TAKEN_POINT(0, 0, 0, -179, -59, -59), TAKEN_POINT(-1, -1, -1, 180, 0, 0), TAKEN_POINT(2, 1, 1, 180, 0, 0), TAKEN_POINT(-2, -1, -1, -179, -59, -59), TAKEN_POINT(1, 2, 1, -179, -59, -59), TAKEN_POINT(90, 0, 0, 0, 0, 0), TAKEN_POINT(-90, 0, 0, 1, 0, 0), TAKEN_POINT(1, 0, 0, 1, 0, 0), TAKEN_POINT(1, 1, 0, 1, 1, 0), TAKEN_POINT(1, 1, 1, 1, 1, 1), TAKEN_POINT(-1, 0, 0, 1, 1, 1), TAKEN_POINT(-1, -1, -1, 0, 0, 0), TAKEN_POINT(-1, -2, -1, -1, -1, -1), TAKEN_POINT(1, 1, 10, -1, -1, -1))); result = grn_table_create(context, NULL, 0, NULL, GRN_TABLE_NO_KEY, NULL, table); grn_test_assert_context(context); GRN_TEXT_INIT(&base_string, 0); GRN_TEXT_SETS(context, &base_string, gcut_data_get_string(data, "base")); GRN_WGS84_GEO_POINT_INIT(&base, 0); grn_obj_cast(context, &base_string, &base, FALSE); GRN_OBJ_FIN(context, &base_string); offset = gcut_data_get_int(data, "offset"); if (offset > 0) { cut_omit("geo sort doesn't support offset yet."); } limit = gcut_data_get_int(data, "limit"); keys[0].key = column; keys[0].flags = GRN_TABLE_SORT_GEO; keys[0].offset = 0; keys[1].key = &base; keys[1].flags = 0; keys[1].offset = 0; grn_table_sort(context, table, offset, limit, result, keys, 2); GRN_OBJ_FIN(context, &base); grn_test_assert_context(context); cursor = grn_table_cursor_open(context, result, NULL, 0, NULL, 0, 0, -1, GRN_CURSOR_ASCENDING); grn_test_assert_context(context); GRN_WGS84_GEO_POINT_INIT(&location, 0); while ((id = grn_table_cursor_next(context, cursor))) { gint32 *key; int key_size; gint latitude, longitude; key_size = grn_table_cursor_get_value(context, cursor, (void **)&key); GRN_BULK_REWIND(&location); grn_obj_get_value(context, column, *key, &location); GRN_GEO_POINT_VALUE(&location, latitude, longitude); actual_keys = g_list_append(actual_keys, inspect_point(latitude, longitude)); } GRN_OBJ_FIN(context, &location); gcut_take_list(actual_keys, g_free); expected_keys = gcut_data_get_pointer(data, "expected"); gcut_assert_equal_list_string(expected_keys, actual_keys); }
void data_near_geo_point(void) { #define ADD_DATA(label, expected, base, offset, limit) \ gcut_add_datum(label, \ "expected", G_TYPE_POINTER, \ expected, g_list_free, \ "base", G_TYPE_INT, base, \ "offset", G_TYPE_INT, offset, \ "limit", G_TYPE_INT, limit, \ NULL) ADD_DATA("no limit", gcut_list_string_new(INSPECTED_POINT(-1, -1, -1, 0, 0, 0), INSPECTED_POINT(1, 0, 0, 1, 0, 0), INSPECTED_POINT(-1, 0, 0, 1, 1, 1), INSPECTED_POINT(1, 1, 0, 1, 1, 0), INSPECTED_POINT(1, 1, 1, 1, 1, 1), INSPECTED_POINT(1, 1, 10, -1, -1, -1), INSPECTED_POINT(-1, -2, -1, -1, -1, -1), INSPECTED_POINT(90, 0, 0, 0, 0, 0), INSPECTED_POINT(-90, 0, 0, 1, 0, 0), INSPECTED_POINT(-2, -1, -1, -179, -59, -59), INSPECTED_POINT(2, 1, 1, 180, 0, 0), INSPECTED_POINT(1, 2, 1, -179, -59, -59), INSPECTED_POINT(-1, -1, -1, 180, 0, 0), INSPECTED_POINT(0, 0, 0, -179, -59, -59), INSPECTED_POINT(0, 0, 0, 180, 0, 0), NULL), TAKEN_POINT(0, 0, 0, 0, 0, 0), 0, -1); ADD_DATA("limit", gcut_list_string_new(INSPECTED_POINT(-1, -1, -1, 0, 0, 0), INSPECTED_POINT(1, 0, 0, 1, 0, 0), INSPECTED_POINT(-1, 0, 0, 1, 1, 1), NULL), TAKEN_POINT(0, 0, 0, 0, 0, 0), 0, 3); ADD_DATA("offset - limit", gcut_list_string_new(INSPECTED_POINT(-1, 0, 0, 1, 1, 1), INSPECTED_POINT(1, 1, 0, 1, 1, 0), INSPECTED_POINT(1, 1, 1, 1, 1, 1), NULL), TAKEN_POINT(0, 0, 0, 0, 0, 0), 2, 3); #undef ADD_DATA }
void test_near_geo_point(gpointer data) { grn_id id; int min_size, offset, limit, flags; grn_obj max_string, max; const GList *expected_keys; GList *actual_keys = NULL; create_geo_point_table( cut_take_printf(" [\"%s\"]," " [\"%s\"]," " [\"%s\"]," " [\"%s\"]," " [\"%s\"]," " [\"%s\"]," " [\"%s\"]," " [\"%s\"]," " [\"%s\"]", TAKEN_POINT(1, 2, 3, 4, 5, 6), TAKEN_POINT(1, 2, 3, 7, 8, 9), TAKEN_POINT(7, 8, 9, 4, 5, 6), TAKEN_POINT(89, 59, 59, 179, 59, 59), TAKEN_POINT(89, 59, 59, 179, -59, -59), TAKEN_POINT(88, 58, 58, 178, 58, 58), TAKEN_POINT(-89, -59, -59, -179, -59, -59), TAKEN_POINT(-89, -59, -59, 179, 59, 59), TAKEN_POINT(-88, -58, -58, -178, -58, -58))); min_size = gcut_data_get_int(data, "min-size"); GRN_TEXT_INIT(&max_string, 0); GRN_TEXT_PUTS(context, &max_string, gcut_data_get_string(data, "max")); GRN_WGS84_GEO_POINT_INIT(&max, 0); grn_obj_cast(context, &max_string, &max, FALSE); grn_obj_unlink(context, &max_string); offset = gcut_data_get_int(data, "offset"); limit = gcut_data_get_int(data, "limit"); flags = gcut_data_get_int(data, "flags"); cursor = grn_table_cursor_open(context, table, NULL, min_size, GRN_BULK_HEAD(&max), GRN_BULK_VSIZE(&max), offset, limit, flags | GRN_CURSOR_PREFIX); grn_obj_unlink(context, &max); grn_test_assert_context(context); while ((id = grn_table_cursor_next(context, cursor))) { grn_geo_point *key; int key_size; key_size = grn_table_cursor_get_key(context, cursor, (void **)&key); actual_keys = g_list_append(actual_keys, g_strdup_printf("%dx%d", key->latitude, key->longitude)); } gcut_take_list(actual_keys, g_free); expected_keys = gcut_data_get_pointer(data, "expected"); gcut_assert_equal_list_string(expected_keys, actual_keys); }