Naoya Murakami
null+****@clear*****
Wed Jul 12 12:22:33 JST 2017
Naoya Murakami 2017-07-12 12:22:33 +0900 (Wed, 12 Jul 2017) New Revision: 5f7809b7f2f92a2f97553108c5acb3c4328cf9cf https://github.com/groonga/groonga/commit/5f7809b7f2f92a2f97553108c5acb3c4328cf9cf Merged ef59b31: Merge pull request #735 from naoa/min-max-vector Message: min,max: support number in vector Added files: test/command/suite/select/function/max/reference_vector_time.expected test/command/suite/select/function/max/reference_vector_time.test test/command/suite/select/function/max/vector_time.expected test/command/suite/select/function/max/vector_time.test test/command/suite/select/function/min/reference_vector_time.expected test/command/suite/select/function/min/reference_vector_time.test test/command/suite/select/function/min/vector_time.expected test/command/suite/select/function/min/vector_time.test Modified files: lib/proc.c Modified: lib/proc.c (+181 -60) =================================================================== --- lib/proc.c 2017-07-12 10:41:15 +0900 (29add30) +++ lib/proc.c 2017-07-12 12:22:33 +0900 (a151ab4) @@ -1482,6 +1482,93 @@ compare_number(grn_ctx *ctx, grn_obj *number1, grn_obj *number2, grn_id type) #undef COMPARE_AND_RETURN } +inline static void +get_number_in_grn_uvector(grn_ctx *ctx, grn_obj *uvector, unsigned int offset, + grn_obj *buf) +{ +#define GET_UVECTOR_ELEMENT_AS(type) do { \ + GRN_ ## type ## _SET(ctx, \ + buf, \ + GRN_ ## type ## _VALUE_AT(uvector, offset)); \ + } while (GRN_FALSE) + switch (uvector->header.domain) { + case GRN_DB_BOOL : + GET_UVECTOR_ELEMENT_AS(BOOL); + break; + case GRN_DB_INT8 : + GET_UVECTOR_ELEMENT_AS(INT8); + break; + case GRN_DB_UINT8 : + GET_UVECTOR_ELEMENT_AS(UINT8); + break; + case GRN_DB_INT16 : + GET_UVECTOR_ELEMENT_AS(INT16); + break; + case GRN_DB_UINT16 : + GET_UVECTOR_ELEMENT_AS(UINT16); + break; + case GRN_DB_INT32 : + GET_UVECTOR_ELEMENT_AS(INT32); + break; + case GRN_DB_UINT32 : + GET_UVECTOR_ELEMENT_AS(UINT32); + break; + case GRN_DB_INT64 : + GET_UVECTOR_ELEMENT_AS(INT64); + break; + case GRN_DB_UINT64 : + GET_UVECTOR_ELEMENT_AS(UINT64); + break; + case GRN_DB_FLOAT : + GET_UVECTOR_ELEMENT_AS(FLOAT); + break; + case GRN_DB_TIME : + GET_UVECTOR_ELEMENT_AS(TIME); + break; + default : + GET_UVECTOR_ELEMENT_AS(RECORD); + break; + } +#undef GET_UVECTOR_ELEMENT_AS +} + +inline static void +apply_max(grn_ctx *ctx, grn_obj *number, grn_obj *max, + grn_obj *casted_number, grn_obj *casted_max, grn_id cast_type) +{ + grn_id domain = number->header.domain; + if (!is_comparable_number_type(domain)) { + return; + } + cast_type = larger_number_type(cast_type, domain); + if (!number_safe_cast(ctx, number, casted_number, cast_type)) { + return; + } + if (max->header.domain == GRN_DB_VOID) { + grn_obj_reinit(ctx, max, cast_type, 0); + GRN_TEXT_SET(ctx, max, + GRN_TEXT_VALUE(casted_number), + GRN_TEXT_LEN(casted_number)); + return; + } + + if (max->header.domain != cast_type) { + if (!number_safe_cast(ctx, max, casted_max, cast_type)) { + return; + } + grn_obj_reinit(ctx, max, cast_type, 0); + GRN_TEXT_SET(ctx, max, + GRN_TEXT_VALUE(casted_max), + GRN_TEXT_LEN(casted_max)); + } + if (compare_number(ctx, casted_number, max, cast_type) > 0) { + grn_obj_reinit(ctx, max, cast_type, 0); + GRN_TEXT_SET(ctx, max, + GRN_TEXT_VALUE(casted_number), + GRN_TEXT_LEN(casted_number)); + } +} + static grn_obj * func_max(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) { @@ -1497,38 +1584,37 @@ func_max(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) GRN_VOID_INIT(&casted_max); GRN_VOID_INIT(&casted_number); - for (i = 0; i < nargs; i++) { - grn_obj *number = args[i]; - grn_id domain = number->header.domain; - if (!is_comparable_number_type(domain)) { - continue; - } - cast_type = larger_number_type(cast_type, domain); - if (!number_safe_cast(ctx, number, &casted_number, cast_type)) { - continue; - } - if (max->header.domain == GRN_DB_VOID) { - grn_obj_reinit(ctx, max, cast_type, 0); - GRN_TEXT_SET(ctx, max, - GRN_TEXT_VALUE(&casted_number), - GRN_TEXT_LEN(&casted_number)); - continue; - } - if (max->header.domain != cast_type) { - if (!number_safe_cast(ctx, max, &casted_max, cast_type)) { - continue; + for (i = 0; i < nargs; i++) { + switch (args[i]->header.type) { + case GRN_BULK : + apply_max(ctx, args[i], max, &casted_number, &casted_max, cast_type); + break; + case GRN_UVECTOR : + { + unsigned int j; + unsigned int n_elements; + grn_obj number_in_uvector; + grn_obj *domain; + + domain = grn_ctx_at(ctx, args[i]->header.domain); + GRN_OBJ_INIT(&number_in_uvector, GRN_BULK, 0, args[i]->header.domain); + n_elements = grn_uvector_size(ctx, args[i]); + for (j = 0; j < n_elements; j++) { + get_number_in_grn_uvector(ctx, args[i], j, &number_in_uvector); + if (grn_obj_is_table(ctx, domain)) { + grn_obj_reinit(ctx, &number_in_uvector, domain->header.domain, 0); + grn_table_get_key2(ctx, domain, + GRN_RECORD_VALUE(&number_in_uvector), + &number_in_uvector); + } + apply_max(ctx, &number_in_uvector, max, &casted_number, &casted_max, cast_type); + } + GRN_OBJ_FIN(ctx, &number_in_uvector); } - grn_obj_reinit(ctx, max, cast_type, 0); - GRN_TEXT_SET(ctx, max, - GRN_TEXT_VALUE(&casted_max), - GRN_TEXT_LEN(&casted_max)); - } - if (compare_number(ctx, &casted_number, max, cast_type) > 0) { - grn_obj_reinit(ctx, max, cast_type, 0); - GRN_TEXT_SET(ctx, max, - GRN_TEXT_VALUE(&casted_number), - GRN_TEXT_LEN(&casted_number)); + break; + default : + continue; } } GRN_OBJ_FIN(ctx, &casted_max); @@ -1537,6 +1623,43 @@ func_max(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) return max; } +static void +apply_min(grn_ctx *ctx, grn_obj *number, grn_obj *min, + grn_obj *casted_number, grn_obj *casted_min, grn_id cast_type) +{ + grn_id domain = number->header.domain; + if (!is_comparable_number_type(domain)) { + return; + } + cast_type = smaller_number_type(cast_type, domain); + if (!number_safe_cast(ctx, number, casted_number, cast_type)) { + return; + } + if (min->header.domain == GRN_DB_VOID) { + grn_obj_reinit(ctx, min, cast_type, 0); + GRN_TEXT_SET(ctx, min, + GRN_TEXT_VALUE(casted_number), + GRN_TEXT_LEN(casted_number)); + return; + } + + if (min->header.domain != cast_type) { + if (!number_safe_cast(ctx, min, casted_min, cast_type)) { + return; + } + grn_obj_reinit(ctx, min, cast_type, 0); + GRN_TEXT_SET(ctx, min, + GRN_TEXT_VALUE(casted_min), + GRN_TEXT_LEN(casted_min)); + } + if (compare_number(ctx, casted_number, min, cast_type) < 0) { + grn_obj_reinit(ctx, min, cast_type, 0); + GRN_TEXT_SET(ctx, min, + GRN_TEXT_VALUE(casted_number), + GRN_TEXT_LEN(casted_number)); + } +} + static grn_obj * func_min(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) { @@ -1553,37 +1676,35 @@ func_min(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) GRN_VOID_INIT(&casted_min); GRN_VOID_INIT(&casted_number); for (i = 0; i < nargs; i++) { - grn_obj *number = args[i]; - grn_id domain = number->header.domain; - if (!is_comparable_number_type(domain)) { - continue; - } - cast_type = smaller_number_type(cast_type, domain); - if (!number_safe_cast(ctx, number, &casted_number, cast_type)) { - continue; - } - if (min->header.domain == GRN_DB_VOID) { - grn_obj_reinit(ctx, min, cast_type, 0); - GRN_TEXT_SET(ctx, min, - GRN_TEXT_VALUE(&casted_number), - GRN_TEXT_LEN(&casted_number)); - continue; - } - - if (min->header.domain != cast_type) { - if (!number_safe_cast(ctx, min, &casted_min, cast_type)) { - continue; + switch (args[i]->header.type) { + case GRN_BULK : + apply_min(ctx, args[i], min, &casted_number, &casted_min, cast_type); + break; + case GRN_UVECTOR : + { + unsigned int j; + unsigned int n_elements; + grn_obj number_in_uvector; + grn_obj *domain; + + domain = grn_ctx_at(ctx, args[i]->header.domain); + GRN_OBJ_INIT(&number_in_uvector, GRN_BULK, 0, args[i]->header.domain); + n_elements = grn_uvector_size(ctx, args[i]); + for (j = 0; j < n_elements; j++) { + get_number_in_grn_uvector(ctx, args[i], j, &number_in_uvector); + if (grn_obj_is_table(ctx, domain)) { + grn_obj_reinit(ctx, &number_in_uvector, domain->header.domain, 0); + grn_table_get_key2(ctx, domain, + GRN_RECORD_VALUE(&number_in_uvector), + &number_in_uvector); + } + apply_min(ctx, &number_in_uvector, min, &casted_number, &casted_min, cast_type); + } + GRN_OBJ_FIN(ctx, &number_in_uvector); } - grn_obj_reinit(ctx, min, cast_type, 0); - GRN_TEXT_SET(ctx, min, - GRN_TEXT_VALUE(&casted_min), - GRN_TEXT_LEN(&casted_min)); - } - if (compare_number(ctx, &casted_number, min, cast_type) < 0) { - grn_obj_reinit(ctx, min, cast_type, 0); - GRN_TEXT_SET(ctx, min, - GRN_TEXT_VALUE(&casted_number), - GRN_TEXT_LEN(&casted_number)); + break; + default : + continue; } } GRN_OBJ_FIN(ctx, &casted_min); Added: test/command/suite/select/function/max/reference_vector_time.expected (+13 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/function/max/reference_vector_time.expected 2017-07-12 12:22:33 +0900 (2f9ac22) @@ -0,0 +1,13 @@ +table_create Dates TABLE_PAT_KEY Time +[[0,0.0,0.0],true] +table_create Values TABLE_NO_KEY +[[0,0.0,0.0],true] +column_create Values time_values COLUMN_VECTOR Dates +[[0,0.0,0.0],true] +load --table Values +[ +{"time_values": ["2017-07-12 00:00:00", "2017-05-12 00:00:00"]} +] +[[0,0.0,0.0],1] +select Values --filter true --output_columns '_id, max(time_values, "2017-06-12 00:00:00")' +[[0,0.0,0.0],[[[1],[["_id","UInt32"],["max",null]],[1,1499785200.0]]]] Added: test/command/suite/select/function/max/reference_vector_time.test (+13 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/function/max/reference_vector_time.test 2017-07-12 12:22:33 +0900 (0c3ae27) @@ -0,0 +1,13 @@ +table_create Dates TABLE_PAT_KEY Time + +table_create Values TABLE_NO_KEY +column_create Values time_values COLUMN_VECTOR Dates + +load --table Values +[ +{"time_values": ["2017-07-12 00:00:00", "2017-05-12 00:00:00"]} +] + +select Values \ + --filter true \ + --output_columns '_id, max(time_values, "2017-06-12 00:00:00")' Added: test/command/suite/select/function/max/vector_time.expected (+11 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/function/max/vector_time.expected 2017-07-12 12:22:33 +0900 (cc0f42b) @@ -0,0 +1,11 @@ +table_create Values TABLE_NO_KEY +[[0,0.0,0.0],true] +column_create Values time_values COLUMN_VECTOR Time +[[0,0.0,0.0],true] +load --table Values +[ +{"time_values": ["2017-07-12 00:00:00", "2017-05-12 00:00:00"]} +] +[[0,0.0,0.0],1] +select Values --filter true --output_columns '_id, max(time_values, "2017-06-12 00:00:00")' +[[0,0.0,0.0],[[[1],[["_id","UInt32"],["max",null]],[1,1499785200.0]]]] Added: test/command/suite/select/function/max/vector_time.test (+11 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/function/max/vector_time.test 2017-07-12 12:22:33 +0900 (ff08a26) @@ -0,0 +1,11 @@ +table_create Values TABLE_NO_KEY +column_create Values time_values COLUMN_VECTOR Time + +load --table Values +[ +{"time_values": ["2017-07-12 00:00:00", "2017-05-12 00:00:00"]} +] + +select Values \ + --filter true \ + --output_columns '_id, max(time_values, "2017-06-12 00:00:00")' Added: test/command/suite/select/function/min/reference_vector_time.expected (+13 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/function/min/reference_vector_time.expected 2017-07-12 12:22:33 +0900 (1f08b2f) @@ -0,0 +1,13 @@ +table_create Dates TABLE_PAT_KEY Time +[[0,0.0,0.0],true] +table_create Values TABLE_NO_KEY +[[0,0.0,0.0],true] +column_create Values time_values COLUMN_VECTOR Dates +[[0,0.0,0.0],true] +load --table Values +[ +{"time_values": ["2017-07-12 00:00:00", "2017-05-12 00:00:00"]} +] +[[0,0.0,0.0],1] +select Values --filter true --output_columns '_id, min(time_values, "2017-06-12 00:00:00")' +[[0,0.0,0.0],[[[1],[["_id","UInt32"],["min",null]],[1,1494514800.0]]]] Added: test/command/suite/select/function/min/reference_vector_time.test (+13 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/function/min/reference_vector_time.test 2017-07-12 12:22:33 +0900 (cdac70b) @@ -0,0 +1,13 @@ +table_create Dates TABLE_PAT_KEY Time + +table_create Values TABLE_NO_KEY +column_create Values time_values COLUMN_VECTOR Dates + +load --table Values +[ +{"time_values": ["2017-07-12 00:00:00", "2017-05-12 00:00:00"]} +] + +select Values \ + --filter true \ + --output_columns '_id, min(time_values, "2017-06-12 00:00:00")' Added: test/command/suite/select/function/min/vector_time.expected (+11 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/function/min/vector_time.expected 2017-07-12 12:22:33 +0900 (dfa2ae4) @@ -0,0 +1,11 @@ +table_create Values TABLE_NO_KEY +[[0,0.0,0.0],true] +column_create Values time_values COLUMN_VECTOR Time +[[0,0.0,0.0],true] +load --table Values +[ +{"time_values": ["2017-07-12 00:00:00", "2017-05-12 00:00:00"]} +] +[[0,0.0,0.0],1] +select Values --filter true --output_columns '_id, min(time_values, "2017-06-12 00:00:00")' +[[0,0.0,0.0],[[[1],[["_id","UInt32"],["min",null]],[1,1494514800.0]]]] Added: test/command/suite/select/function/min/vector_time.test (+11 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/function/min/vector_time.test 2017-07-12 12:22:33 +0900 (3aaace7) @@ -0,0 +1,11 @@ +table_create Values TABLE_NO_KEY +column_create Values time_values COLUMN_VECTOR Time + +load --table Values +[ +{"time_values": ["2017-07-12 00:00:00", "2017-05-12 00:00:00"]} +] + +select Values \ + --filter true \ + --output_columns '_id, min(time_values, "2017-06-12 00:00:00")' -------------- next part -------------- HTML����������������������������...Download