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")); +}