Kouhei Sutou
null+****@clear*****
Tue Nov 21 11:57:32 JST 2017
Kouhei Sutou 2017-11-21 11:57:32 +0900 (Tue, 21 Nov 2017) New Revision: f57039b09e7e0a3d68199ee9de29f87e140eb34d https://github.com/groonga/groonga/commit/f57039b09e7e0a3d68199ee9de29f87e140eb34d Message: Support getting column values throw reference vector Added files: test/command/suite/select/function/min/reference_vector_column_uint8.expected test/command/suite/select/function/min/reference_vector_column_uint8.test Modified files: lib/db.c Modified: lib/db.c (+41 -3) =================================================================== --- lib/db.c 2017-11-21 11:11:54 +0900 (f588aa8c8) +++ lib/db.c 2017-11-21 11:57:32 +0900 (bc2529df2) @@ -6835,10 +6835,48 @@ grn_accessor_get_value(grn_ctx *ctx, grn_accessor *a, grn_id id, grn_obj *value) value->header.domain = GRN_DB_FLOAT; break; case GRN_ACCESSOR_GET_COLUMN_VALUE : - /* todo : support vector */ grn_obj_get_value(ctx, a->obj, id, value); - vp = GRN_BULK_HEAD(value) + size0; - vs = GRN_BULK_VSIZE(value) - size0; + if (value->header.type == GRN_UVECTOR && a->next) { + int i, n; + grn_id *sub_ids; + grn_obj sub_records; + grn_obj sub_value; + grn_id sub_value_range; + + n = (GRN_BULK_VSIZE(value) - size0) / sizeof(grn_id); + sub_ids = (grn_id *)(GRN_BULK_HEAD(value) + size0); + GRN_RECORD_INIT(&sub_records, GRN_OBJ_VECTOR, value->header.domain); + for (i = 0; i < n; i++) { + GRN_RECORD_PUT(ctx, &sub_records, sub_ids[i]); + } + + sub_value_range = grn_obj_get_range(ctx, (grn_obj *)(a->next)); + grn_obj_reinit(ctx, value, sub_value_range, GRN_OBJ_VECTOR); + GRN_VOID_INIT(&sub_value); + for (i = 0; i < n; i++) { + grn_id sub_id = GRN_RECORD_VALUE_AT(&sub_records, i); + GRN_BULK_REWIND(&sub_value); + grn_accessor_get_value(ctx, a->next, sub_id, &sub_value); + if (value->header.type == GRN_UVECTOR) { + grn_bulk_write(ctx, + value, + GRN_BULK_HEAD(&sub_value), + GRN_BULK_VSIZE(&sub_value)); + } else { + grn_vector_add_element(ctx, + value, + GRN_BULK_HEAD(&sub_value), + GRN_BULK_VSIZE(&sub_value), + 0, + sub_value.header.domain); + } + } + GRN_OBJ_FIN(ctx, &sub_value); + return value; + } else { + vp = GRN_BULK_HEAD(value) + size0; + vs = GRN_BULK_VSIZE(value) - size0; + } break; case GRN_ACCESSOR_GET_DB_OBJ : value = grn_ctx_at(ctx, id); Added: test/command/suite/select/function/min/reference_vector_column_uint8.expected (+22 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/function/min/reference_vector_column_uint8.expected 2017-11-21 11:57:32 +0900 (8ac882372) @@ -0,0 +1,22 @@ +table_create Users TABLE_PAT_KEY ShortText +[[0,0.0,0.0],true] +column_create Users age COLUMN_SCALAR UInt8 +[[0,0.0,0.0],true] +table_create Logs TABLE_NO_KEY +[[0,0.0,0.0],true] +column_create Logs users COLUMN_VECTOR Users +[[0,0.0,0.0],true] +load --table Users +[ +{"_key": "alice", "age": 12}, +{"_key": "bob", "age": 29}, +{"_key": "chris", "age": 3} +] +[[0,0.0,0.0],3] +load --table Logs +[ +{"users": ["bob", "chris", "alice"]} +] +[[0,0.0,0.0],1] +select Logs --output_columns '_id, min(users.age)' +[[0,0.0,0.0],[[[1],[["_id","UInt32"],["min",null]],[1,3]]]] Added: test/command/suite/select/function/min/reference_vector_column_uint8.test (+20 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/function/min/reference_vector_column_uint8.test 2017-11-21 11:57:32 +0900 (55115cca9) @@ -0,0 +1,20 @@ +table_create Users TABLE_PAT_KEY ShortText +column_create Users age COLUMN_SCALAR UInt8 + +table_create Logs TABLE_NO_KEY +column_create Logs users COLUMN_VECTOR Users + +load --table Users +[ +{"_key": "alice", "age": 12}, +{"_key": "bob", "age": 29}, +{"_key": "chris", "age": 3} +] + +load --table Logs +[ +{"users": ["bob", "chris", "alice"]} +] + +select Logs \ + --output_columns '_id, min(users.age)' -------------- next part -------------- HTML����������������������������... URL: https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20171121/323348ed/attachment-0001.htm