null+****@clear*****
null+****@clear*****
2010年 7月 7日 (水) 14:35:11 JST
Kouhei Sutou 2010-07-07 05:35:11 +0000 (Wed, 07 Jul 2010)
New Revision: bfa455593a610b91d80b13e0d0a2f110cafdf91c
Log:
add tests for near cursor on geo point but they're failed for now.
Is it not implemented yet? Or wrong usage?
Modified files:
test/unit/core/test-table-patricia-trie-cursor.c
Modified: test/unit/core/test-table-patricia-trie-cursor.c (+181 -8)
===================================================================
--- test/unit/core/test-table-patricia-trie-cursor.c 2010-07-07 03:29:15 +0000 (f3571f5)
+++ test/unit/core/test-table-patricia-trie-cursor.c 2010-07-07 05:35:11 +0000 (68ec7c5)
@@ -17,16 +17,34 @@
*/
#include <groonga.h>
+#include <db.h>
#include <gcutter.h>
#include <glib/gstdio.h>
#include "../lib/grn-assertions.h"
+#define COORDINATE(hours, minutes, seconds) \
+ ((hours) * 3600 + (minutes) * 60 + (seconds)) * 1000
+
+#define POINT(latitude_hours, latitude_minutes, latitude_seconds, \
+ longitude_hours, longitude_minutes, longitude_seconds) \
+ g_strdup_printf( \
+ "%dx%d", \
+ COORDINATE(latitude_hours, latitude_minutes, latitude_seconds), \
+ COORDINATE(longitude_hours, longitude_minutes, longitude_seconds))
+
+#define TAKEN_POINT(latitude_hours, latitude_minutes, latitude_seconds, \
+ longitude_hours, longitude_minutes, longitude_seconds) \
+ cut_take_string(POINT(latitude_hours, latitude_minutes, latitude_seconds, \
+ longitude_hours, longitude_minutes, longitude_seconds))
+
void data_prefix_short_text(void);
void test_prefix_short_text(gpointer data);
void data_near_uint32(void);
void test_near_uint32(gpointer data);
+void data_near_geo_point(void);
+void test_near_geo_point(gpointer data);
void data_common_prefix_search(void);
void test_common_prefix_search(gpointer data);
@@ -143,17 +161,61 @@ create_uint32_table(void)
table = grn_ctx_get(context, table_name, strlen(table_name));
}
+static void
+create_geo_point_table(void)
+{
+ const char *table_name = "GeoPointPat";
+
+ assert_send_commands(
+ cut_take_printf("table_create %s TABLE_PAT_KEY UInt32", table_name));
+ assert_send_commands(
+ cut_take_printf("load --table %s\n"
+ "[\n"
+ " [\"_key\"],\n"
+ " [\"%s\"],"
+ " [\"%s\"],"
+ " [\"%s\"],"
+ " [\"%s\"],"
+ " [\"%s\"],"
+ " [\"%s\"],"
+ " [\"%s\"],"
+ " [\"%s\"],"
+ " [\"%s\"]"
+ "]",
+ table_name,
+ 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)));
+
+ table = grn_ctx_get(context, table_name, strlen(table_name));
+}
+
void
data_prefix_short_text(void)
{
-#define ADD_DATA(label, expected, min, offset, limit, flags) \
- gcut_add_datum(label, \
- "expected", G_TYPE_POINTER, \
- expected, gcut_list_string_free, \
- "min", G_TYPE_STRING, min, \
- "offset", G_TYPE_INT, offset, \
- "limit", G_TYPE_INT, limit, \
- "flags", G_TYPE_INT, flags, \
+#define ADD_DATA(label, expected, min, offset, limit, flags) \
+ gcut_add_datum(label, \
+ "expected", G_TYPE_POINTER, \
+ expected, gcut_list_string_free, \
+ "min", G_TYPE_STRING, min, \
+ "offset", G_TYPE_INT, offset, \
+ "limit", G_TYPE_INT, limit, \
+ "flags", G_TYPE_INT, flags, \
NULL)
ADD_DATA("alphabet - ascending",
@@ -331,6 +393,117 @@ test_near_uint32(gpointer data)
}
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(89, 59, 59,
+ 179, 59, 59),
+ POINT(89, 59, 59,
+ 179, -59, -59),
+ POINT(88, 58, 58,
+ 178, 58, 58),
+ 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 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(89, 59, 59,
+ 179, 59, 59),
+ POINT(89, 59, 59,
+ 179, -59, -59),
+ POINT(88, 58, 58,
+ 178, 58, 58),
+ POINT(-89, -59, -59,
+ -179, -59, -59),
+ POINT(-89, -59, -59,
+ 179, 59, 59),
+ POINT(-88, -58, -58,
+ -178, -58, -58),
+ NULL),
+ 1000,
+ 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 min_size, offset, limit, flags;
+ grn_obj max_string, max;
+ const GList *expected_keys;
+ GList *actual_keys = NULL;
+
+ create_geo_point_table();
+
+ 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);
+}
+
+void
data_common_prefix_search(void)
{
#define ADD_DATA(label, expected, min_size, max, offset, limit, flags) \