Kouhei Sutou
null+****@clear*****
Fri Feb 3 10:42:35 JST 2017
Kouhei Sutou 2017-02-03 10:42:35 +0900 (Fri, 03 Feb 2017) New Revision: 2eacae2977e64feab50feaeb30b621377d458393 https://github.com/groonga/groonga/commit/2eacae2977e64feab50feaeb30b621377d458393 Message: Add predicates for vector and weight vector Modified files: include/groonga/obj.h lib/obj.c test/unit/core/test-object.c Modified: include/groonga/obj.h (+3 -1) =================================================================== --- include/groonga/obj.h 2017-02-01 23:20:07 +0900 (91c80b4) +++ include/groonga/obj.h 2017-02-03 10:42:35 +0900 (1d7867e) @@ -1,6 +1,6 @@ /* -*- c-basic-offset: 2 -*- */ /* - Copyright(C) 2015-2016 Brazil + Copyright(C) 2015-2017 Brazil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -33,6 +33,8 @@ GRN_API grn_bool grn_obj_is_true(grn_ctx *ctx, grn_obj *obj); GRN_API grn_bool grn_obj_is_builtin(grn_ctx *ctx, grn_obj *obj); GRN_API grn_bool grn_obj_is_table(grn_ctx *ctx, grn_obj *obj); GRN_API grn_bool grn_obj_is_column(grn_ctx *ctx, grn_obj *obj); +GRN_API grn_bool grn_obj_is_vector_column(grn_ctx *ctx, grn_obj *obj); +GRN_API grn_bool grn_obj_is_weight_vector_column(grn_ctx *ctx, grn_obj *obj); GRN_API grn_bool grn_obj_is_reference_column(grn_ctx *ctx, grn_obj *obj); GRN_API grn_bool grn_obj_is_index_column(grn_ctx *ctx, grn_obj *obj); GRN_API grn_bool grn_obj_is_accessor(grn_ctx *ctx, grn_obj *obj); Modified: lib/obj.c (+23 -1) =================================================================== --- lib/obj.c 2017-02-01 23:20:07 +0900 (1ce0a16) +++ lib/obj.c 2017-02-03 10:42:35 +0900 (092869e) @@ -1,6 +1,6 @@ /* -*- c-basic-offset: 2 -*- */ /* - Copyright(C) 2015-2016 Brazil + Copyright(C) 2015-2017 Brazil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -119,6 +119,28 @@ grn_obj_is_column(grn_ctx *ctx, grn_obj *obj) } grn_bool +grn_obj_is_vector_column(grn_ctx *ctx, grn_obj *obj) +{ + if (!grn_obj_is_column(ctx, obj)) { + return GRN_FALSE; + } + + return ((obj->header.type == GRN_COLUMN_VAR_SIZE) && + ((obj->header.flags & GRN_OBJ_COLUMN_TYPE_MASK) == + GRN_OBJ_COLUMN_VECTOR)); +} + +grn_bool +grn_obj_is_weight_vector_column(grn_ctx *ctx, grn_obj *obj) +{ + if (!grn_obj_is_vector_column(ctx, obj)) { + return GRN_FALSE; + } + + return (obj->header.flags & GRN_OBJ_WITH_WEIGHT) == GRN_OBJ_WITH_WEIGHT; +} + +grn_bool grn_obj_is_reference_column(grn_ctx *ctx, grn_obj *obj) { grn_obj *range; Modified: test/unit/core/test-object.c (+79 -0) =================================================================== --- test/unit/core/test-object.c 2017-02-01 23:20:07 +0900 (ff14bfe) +++ test/unit/core/test-object.c 2017-02-03 10:42:35 +0900 (03f594d) @@ -31,6 +31,10 @@ void data_is_table(void); void test_is_table(gconstpointer data); void data_is_column(void); void test_is_column(gconstpointer data); +void data_is_vector_column(void); +void test_is_vector_column(gconstpointer data); +void data_is_weight_vector_column(void); +void test_is_weight_vector_column(gconstpointer data); void data_is_reference_column(void); void test_is_reference_column(gconstpointer data); void data_is_index_column(void); @@ -226,6 +230,81 @@ test_is_column(gconstpointer data) } void +data_is_vector_column(void) +{ +#define ADD_DATUM(label, expected, name) \ + gcut_add_datum(label, \ + "expected", G_TYPE_BOOLEAN, expected, \ + "name", G_TYPE_STRING, name, \ + NULL) + + ADD_DATUM("table", FALSE, "Users"); + ADD_DATUM("fix size scalar column", FALSE, "Users.age"); + ADD_DATUM("var size scalar column", FALSE, "Users.name"); + ADD_DATUM("vector column", TRUE, "Users.tags"); + ADD_DATUM("index column", FALSE, "Names.users"); + +#undef ADD_DATUM +} + +void +test_is_vector_column(gconstpointer data) +{ + const gchar *name; + grn_obj *object; + + assert_send_command("table_create Users TABLE_HASH_KEY ShortText"); + assert_send_command("column_create Users age COLUMN_SCALAR UInt8"); + assert_send_command("column_create Users name COLUMN_SCALAR ShortText"); + assert_send_command("column_create Users tags COLUMN_VECTOR ShortText"); + assert_send_command("table_create Names TABLE_PAT_KEY ShortText"); + assert_send_command("column_create Names users COLUMN_INDEX Users name"); + + name = gcut_data_get_string(data, "name"); + object = grn_ctx_get(context, name, strlen(name)); + if (gcut_data_get_string(data, "expected")) { + cut_assert_true(grn_obj_is_vector_column(context, object)); + } else { + cut_assert_false(grn_obj_is_vector_column(context, object)); + } +} + +void +data_is_weight_vector_column(void) +{ +#define ADD_DATUM(label, expected, name) \ + gcut_add_datum(label, \ + "expected", G_TYPE_BOOLEAN, expected, \ + "name", G_TYPE_STRING, name, \ + NULL) + + ADD_DATUM("vector column", FALSE, "Users.tags"); + ADD_DATUM("weight vector column", TRUE, "Users.weight_tags"); + +#undef ADD_DATUM +} + +void +test_is_weight_vector_column(gconstpointer data) +{ + const gchar *name; + grn_obj *object; + + assert_send_command("table_create Users TABLE_HASH_KEY ShortText"); + assert_send_command("column_create Users tags COLUMN_VECTOR ShortText"); + assert_send_command("column_create Users weight_tags " + "COLUMN_VECTOR|WITH_WEIGHT ShortText"); + + name = gcut_data_get_string(data, "name"); + object = grn_ctx_get(context, name, strlen(name)); + if (gcut_data_get_string(data, "expected")) { + cut_assert_true(grn_obj_is_weight_vector_column(context, object)); + } else { + cut_assert_false(grn_obj_is_weight_vector_column(context, object)); + } +} + +void data_is_reference_column(void) { #define ADD_DATUM(label, expected, name) \ -------------- next part -------------- HTML����������������������������...Download