Kouhei Sutou
null+****@clear*****
Mon Jul 14 00:08:17 JST 2014
Kouhei Sutou 2014-07-14 00:08:17 +0900 (Mon, 14 Jul 2014) New Revision: 0e67681749cf9e1a225220b517503694ce1ad1e4 https://github.com/groonga/groonga/commit/0e67681749cf9e1a225220b517503694ce1ad1e4 Message: Support outputting weight uvector Modified files: lib/output.c test/command/suite/select/output/value/weight_vector/reference.test Modified: lib/output.c (+69 -51) =================================================================== --- lib/output.c 2014-07-14 00:07:33 +0900 (6bae6c7) +++ lib/output.c 2014-07-14 00:08:17 +0900 (1d44bc2) @@ -593,10 +593,10 @@ grn_text_atoj(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type, GRN_VALUE_FIX_SIZE_INIT(&buf, GRN_OBJ_VECTOR, DB_OBJ(obj)->range); } else { GRN_VALUE_VAR_SIZE_INIT(&buf, GRN_OBJ_VECTOR, DB_OBJ(obj)->range); - if (obj->header.flags & GRN_OBJ_WITH_WEIGHT) { - format.flags |= GRN_OBJ_FORMAT_WITH_WEIGHT; - format_argument = &format; - } + } + if (obj->header.flags & GRN_OBJ_WITH_WEIGHT) { + format.flags |= GRN_OBJ_FORMAT_WITH_WEIGHT; + format_argument = &format; } } else { GRN_VALUE_VAR_SIZE_INIT(&buf, 0, DB_OBJ(obj)->range); @@ -843,11 +843,17 @@ grn_output_uvector(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type, grn_obj *uvector, grn_obj_format *format) { grn_bool output_result_set = GRN_FALSE; + grn_bool with_weight = GRN_FALSE; + grn_obj *range; + grn_bool range_is_type; if (format) { if (GRN_BULK_VSIZE(&(format->columns)) > 0) { output_result_set = GRN_TRUE; } + if (format->flags & GRN_OBJ_FORMAT_WITH_WEIGHT) { + with_weight = GRN_TRUE; + } } if (output_result_set) { @@ -855,60 +861,72 @@ grn_output_uvector(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type, return; } - { - grn_obj *range = grn_ctx_at(ctx, uvector->header.domain); - if (range && range->header.type == GRN_TYPE) { - int value_size = ((struct _grn_type *)range)->obj.range; - char *v = (char *)GRN_BULK_HEAD(uvector), - *ve = (char *)GRN_BULK_CURR(uvector); - grn_output_array_open(ctx, outbuf, output_type, "VECTOR", -1); - if (v < ve) { - for (;;) { - grn_obj value; - GRN_OBJ_INIT(&value, GRN_BULK, 0, uvector->header.domain); - grn_bulk_write_from(ctx, &value, v, 0, value_size); - grn_output_obj(ctx, outbuf, output_type, &value, NULL); - - v += value_size; - if (v < ve) { + range = grn_ctx_at(ctx, uvector->header.domain); + range_is_type = (range->header.type == GRN_TYPE); + if (range_is_type) { + unsigned int i, n; + char *raw_elements; + unsigned int element_size; + grn_obj element; - } else { - break; - } - } - } - grn_output_array_close(ctx, outbuf, output_type); + raw_elements = GRN_BULK_HEAD(uvector); + element_size = GRN_TYPE_SIZE(DB_OBJ(range)); + n = GRN_BULK_VSIZE(uvector) / element_size; + + grn_output_array_open(ctx, outbuf, output_type, "VECTOR", n); + GRN_OBJ_INIT(&element, GRN_BULK, 0, uvector->header.domain); + for (i = 0; i < n; i++) { + GRN_BULK_REWIND(&element); + grn_bulk_write_from(ctx, &element, raw_elements + (element_size * i), + 0, element_size); + grn_output_obj(ctx, outbuf, output_type, &element, NULL); + } + GRN_OBJ_FIN(ctx, &element); + grn_output_array_close(ctx, outbuf, output_type); + } else { + unsigned int i, n; + grn_obj id_value; + grn_obj key_value; + + GRN_UINT32_INIT(&id_value, 0); + GRN_OBJ_INIT(&key_value, GRN_BULK, 0, range->header.domain); + + n = grn_vector_size(ctx, uvector); + if (with_weight) { + grn_output_map_open(ctx, outbuf, output_type, "WEIGHT_VECTOR", n); } else { - grn_id *v = (grn_id *)GRN_BULK_HEAD(uvector), - *ve = (grn_id *)GRN_BULK_CURR(uvector); - grn_output_array_open(ctx, outbuf, output_type, "VECTOR", ve - v); - if (v < ve) { - grn_obj key; - GRN_OBJ_INIT(&key, GRN_BULK, 0, range->header.domain); - for (;;) { - if (range->header.type != GRN_TABLE_NO_KEY) { - grn_table_get_key2(ctx, range, *v, &key); - grn_output_obj(ctx, outbuf, output_type, &key, NULL); - GRN_BULK_REWIND(&key); - } else { - grn_obj id; - GRN_UINT32_INIT(&id, 0); - GRN_UINT32_SET(ctx, &id, *v); - grn_output_obj(ctx, outbuf, output_type, &id, NULL); - GRN_OBJ_FIN(ctx, &id); - } - v++; - if (v < ve) { + grn_output_array_open(ctx, outbuf, output_type, "VECTOR", n); + } - } else { - break; - } - } - GRN_OBJ_FIN(ctx, &key); + for (i = 0; i < n; i++) { + grn_id id; + unsigned int weight; + + id = grn_uvector_get_element(ctx, uvector, i, &weight); + if (range->header.type == GRN_TABLE_NO_KEY) { + GRN_UINT32_SET(ctx, &id_value, id); + grn_output_obj(ctx, outbuf, output_type, &id_value, NULL); + } else { + GRN_BULK_REWIND(&key_value); + grn_table_get_key2(ctx, range, id, &key_value); + grn_output_obj(ctx, outbuf, output_type, &key_value, NULL); + } + + if (with_weight) { + grn_output_uint64(ctx, outbuf, output_type, weight); } + } + + if (with_weight) { + grn_output_map_close(ctx, outbuf, output_type); + } else { grn_output_array_close(ctx, outbuf, output_type); } + + GRN_OBJ_FIN(ctx, &id_value); + GRN_OBJ_FIN(ctx, &key_value); } + grn_obj_unlink(ctx, range); } static inline void Modified: test/command/suite/select/output/value/weight_vector/reference.test (+0 -2) =================================================================== --- test/command/suite/select/output/value/weight_vector/reference.test 2014-07-14 00:07:33 +0900 (06afbd6) +++ test/command/suite/select/output/value/weight_vector/reference.test 2014-07-14 00:08:17 +0900 (87eab36) @@ -1,5 +1,3 @@ -#@omit "weight vector for reference type will be supported in the future" - table_create Tags TABLE_PAT_KEY ShortText table_create Memos TABLE_HASH_KEY ShortText -------------- next part -------------- HTML����������������������������...Download