null+****@clear*****
null+****@clear*****
2010年 6月 30日 (水) 10:34:55 JST
Nobuyoshi Nakada 2010-06-30 01:34:55 +0000 (Wed, 30 Jun 2010)
New Revision: 58b4b093443aca84acb03bac354b3f0605a8cfa9
Log:
support vector value in select. 325
Modified files:
lib/output.c
lib/str.c
test/unit/core/test-command-select.c
Modified: lib/output.c (+31 -16)
===================================================================
--- lib/output.c 2010-06-30 08:17:10 +0000 (23b6a2c)
+++ lib/output.c 2010-06-30 01:34:55 +0000 (d51ae66)
@@ -443,9 +443,9 @@ grn_text_atoj(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type,
{
int vs;
grn_obj buf;
- GRN_TEXT_INIT(&buf, 0);
if (obj->header.type == GRN_ACCESSOR) {
grn_accessor *a = (grn_accessor *)obj;
+ GRN_TEXT_INIT(&buf, 0);
for (;;) {
GRN_BULK_REWIND(&buf);
switch (a->action) {
@@ -477,11 +477,11 @@ grn_text_atoj(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type,
buf.header.domain = GRN_DB_INT32;
break;
case GRN_ACCESSOR_GET_COLUMN_VALUE :
- /* todo : support vector */
- grn_obj_get_value(ctx, a->obj, id, &buf);
if ((a->obj->header.flags & GRN_OBJ_COLUMN_TYPE_MASK) == GRN_OBJ_COLUMN_VECTOR) {
- grn_id *idp = (grn_id *)GRN_BULK_HEAD(&buf);
if (a->next) {
+ grn_id *idp;
+ grn_obj_get_value(ctx, a->obj, id, &buf);
+ idp = (grn_id *)GRN_BULK_HEAD(&buf);
vs = GRN_BULK_VSIZE(&buf) / sizeof(grn_id);
grn_output_array_open(ctx, outbuf, output_type, "COLUMN", vs);
for (; vs--; idp++) {
@@ -489,19 +489,11 @@ grn_text_atoj(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type,
}
grn_output_array_close(ctx, outbuf, output_type);
} else {
- grn_obj b;
- GRN_RECORD_INIT(&b, 0, DB_OBJ(a->obj)->range);
- vs = GRN_BULK_VSIZE(&buf) / sizeof(grn_id);
- grn_output_array_open(ctx, outbuf, output_type, "COLUMN", vs);
- /* todo: support other fixe sized data types */
- for (; vs--; idp++) {
- GRN_RECORD_SET(ctx, &b, *idp);
- grn_output_obj(ctx, outbuf, output_type, &b, NULL);
- }
- grn_output_array_close(ctx, outbuf, output_type);
- GRN_OBJ_FIN(ctx, &b);
+ grn_text_atoj(ctx, outbuf, output_type, a->obj, id);
}
goto exit;
+ } else {
+ grn_obj_get_value(ctx, a->obj, id, &buf);
}
break;
case GRN_ACCESSOR_GET_DB_OBJ :
@@ -522,6 +514,29 @@ grn_text_atoj(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type,
}
}
} else {
+ switch (obj->header.type) {
+ case GRN_COLUMN_FIX_SIZE :
+ GRN_VALUE_FIX_SIZE_INIT(&buf, 0, DB_OBJ(obj)->range);
+ break;
+ case GRN_COLUMN_VAR_SIZE :
+ if ((obj->header.flags & GRN_OBJ_COLUMN_TYPE_MASK) == GRN_OBJ_COLUMN_VECTOR) {
+ grn_obj *range = grn_ctx_at(ctx, DB_OBJ(obj)->range);
+ if (range->header.flags & GRN_OBJ_KEY_VAR_SIZE) {
+ GRN_VALUE_VAR_SIZE_INIT(&buf, GRN_OBJ_VECTOR, DB_OBJ(obj)->range);
+ } else {
+ GRN_VALUE_FIX_SIZE_INIT(&buf, GRN_OBJ_VECTOR, DB_OBJ(obj)->range);
+ }
+ } else {
+ GRN_VALUE_VAR_SIZE_INIT(&buf, 0, DB_OBJ(obj)->range);
+ }
+ break;
+ case GRN_COLUMN_INDEX :
+ GRN_UINT32_INIT(&buf, 0);
+ break;
+ default:
+ GRN_TEXT_INIT(&buf, 0);
+ break;
+ }
grn_obj_get_value(ctx, obj, id, &buf);
}
grn_output_obj(ctx, outbuf, output_type, &buf, NULL);
@@ -906,7 +921,7 @@ grn_output_obj(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type,
GRN_TEXT_INIT(&id, 0);
if (tc) {
for (i = 0; !grn_table_cursor_next_o(ctx, tc, &id); i++) {
- grn_output_array_open(ctx, outbuf, output_type, "HIT", -1);
+ grn_output_array_open(ctx, outbuf, output_type, "HIT", ncolumns);
for (j = 0; j < ncolumns; j++) {
grn_text_atoj_o(ctx, outbuf, output_type, columns[j], &id);
}
Modified: lib/str.c (+30 -15)
===================================================================
--- lib/str.c 2010-06-30 08:17:10 +0000 (badcb0f)
+++ lib/str.c 2010-06-30 01:34:55 +0000 (7dcc4be)
@@ -2418,9 +2418,9 @@ grn_text_atoj(grn_ctx *ctx, grn_obj *bulk, grn_obj *obj, grn_id id)
{
int vs;
grn_obj buf;
- GRN_TEXT_INIT(&buf, 0);
if (obj->header.type == GRN_ACCESSOR) {
grn_accessor *a = (grn_accessor *)obj;
+ GRN_TEXT_INIT(&buf, 0);
for (;;) {
GRN_BULK_REWIND(&buf);
switch (a->action) {
@@ -2452,11 +2452,11 @@ grn_text_atoj(grn_ctx *ctx, grn_obj *bulk, grn_obj *obj, grn_id id)
buf.header.domain = GRN_DB_INT32;
break;
case GRN_ACCESSOR_GET_COLUMN_VALUE :
- /* todo : support vector */
- grn_obj_get_value(ctx, a->obj, id, &buf);
if ((a->obj->header.flags & GRN_OBJ_COLUMN_TYPE_MASK) == GRN_OBJ_COLUMN_VECTOR) {
- grn_id *idp = (grn_id *)GRN_BULK_HEAD(&buf);
if (a->next) {
+ grn_id *idp;
+ grn_obj_get_value(ctx, a->obj, id, &buf);
+ idp = (grn_id *)GRN_BULK_HEAD(&buf);
GRN_TEXT_PUTC(ctx, bulk, '[');
for (vs = GRN_BULK_VSIZE(&buf) / sizeof(grn_id); vs--; idp++) {
grn_text_atoj(ctx, bulk, (grn_obj *)a->next, *idp);
@@ -2464,19 +2464,11 @@ grn_text_atoj(grn_ctx *ctx, grn_obj *bulk, grn_obj *obj, grn_id id)
}
GRN_TEXT_PUTC(ctx, bulk, ']');
} else {
- grn_obj b;
- GRN_RECORD_INIT(&b, 0, DB_OBJ(a->obj)->range);
- GRN_TEXT_PUTC(ctx, bulk, '[');
- /* todo: support other fixe sized data types */
- for (vs = GRN_BULK_VSIZE(&buf) / sizeof(grn_id); vs--; idp++) {
- GRN_RECORD_SET(ctx, &b, *idp);
- grn_text_otoj(ctx, bulk, &b, NULL);
- if (vs) { GRN_TEXT_PUTC(ctx, bulk, ','); }
- }
- GRN_TEXT_PUTC(ctx, bulk, ']');
- GRN_OBJ_FIN(ctx, &b);
+ grn_text_atoj(ctx, bulk, a->obj, id);
}
goto exit;
+ } else {
+ grn_obj_get_value(ctx, a->obj, id, &buf);
}
break;
case GRN_ACCESSOR_GET_DB_OBJ :
@@ -2497,6 +2489,29 @@ grn_text_atoj(grn_ctx *ctx, grn_obj *bulk, grn_obj *obj, grn_id id)
}
}
} else {
+ switch (obj->header.type) {
+ case GRN_COLUMN_FIX_SIZE :
+ GRN_VALUE_FIX_SIZE_INIT(&buf, 0, DB_OBJ(obj)->range);
+ break;
+ case GRN_COLUMN_VAR_SIZE :
+ if ((obj->header.flags & GRN_OBJ_COLUMN_TYPE_MASK) == GRN_OBJ_COLUMN_VECTOR) {
+ grn_obj *range = grn_ctx_at(ctx, DB_OBJ(obj)->range);
+ if (range->header.flags & GRN_OBJ_KEY_VAR_SIZE) {
+ GRN_VALUE_VAR_SIZE_INIT(&buf, GRN_OBJ_VECTOR, DB_OBJ(obj)->range);
+ } else {
+ GRN_VALUE_FIX_SIZE_INIT(&buf, GRN_OBJ_VECTOR, DB_OBJ(obj)->range);
+ }
+ } else {
+ GRN_VALUE_VAR_SIZE_INIT(&buf, 0, DB_OBJ(obj)->range);
+ }
+ break;
+ case GRN_COLUMN_INDEX :
+ GRN_UINT32_INIT(&buf, 0);
+ break;
+ default:
+ GRN_TEXT_INIT(&buf, 0);
+ break;
+ }
grn_obj_get_value(ctx, obj, id, &buf);
}
grn_text_otoj(ctx, bulk, &buf, NULL);
Modified: test/unit/core/test-command-select.c (+52 -0)
===================================================================
--- test/unit/core/test-command-select.c 2010-06-30 08:17:10 +0000 (d12c2d2)
+++ test/unit/core/test-command-select.c 2010-06-30 01:34:55 +0000 (01e9ea4)
@@ -24,6 +24,8 @@
void test_nil_column_reference_value(void);
void test_output_columns_with_space(void);
+void test_vector_geo_point(void);
+void test_vector_geo_point_with_query(void);
static gchar *tmp_directory;
@@ -120,3 +122,53 @@ test_output_columns_with_space(void)
send_command("select Sites "
"--output_columns '_key, uri'"));
}
+
+void
+test_vector_geo_point(void)
+{
+ assert_send_command("table_create Shops TABLE_HASH_KEY ShortText");
+ assert_send_command("column_create Shops places COLUMN_VECTOR WGS84GeoPoint");
+ assert_send_command("load "
+ "'["
+ "[\"_key\",\"places\"],"
+ "[\"daruma\","
+ "[\"130094061x505025099\",\"130185500x505009000\"]]"
+ "]' "
+ "Shops");
+ cut_assert_equal_string("[["
+ "[1],"
+ "["
+ "[\"_id\",\"UInt32\"],"
+ "[\"_key\",\"ShortText\"],"
+ "[\"places\",\"WGS84GeoPoint\"]"
+ "],"
+ "[1,\"daruma\","
+ "[\"130094061x505025099\",\"130185500x505009000\"]]"
+ "]]",
+ send_command("select Shops"));
+}
+
+void
+test_vector_geo_point_with_query(void)
+{
+ assert_send_command("table_create Shops TABLE_HASH_KEY ShortText");
+ assert_send_command("column_create Shops places COLUMN_VECTOR WGS84GeoPoint");
+ assert_send_command("load "
+ "'["
+ "[\"_key\",\"places\"],"
+ "[\"daruma\","
+ "[\"130094061x505025099\",\"130185500x505009000\"]]"
+ "]' "
+ "Shops");
+ cut_assert_equal_string("[["
+ "[1],"
+ "["
+ "[\"_id\",\"UInt32\"],"
+ "[\"_key\",\"ShortText\"],"
+ "[\"places\",\"WGS84GeoPoint\"]"
+ "],"
+ "[1,\"daruma\","
+ "[\"130094061x505025099\",\"130185500x505009000\"]]"
+ "]]",
+ send_command("select Shops --query _key:daruma"));
+}