diff --git a/plugins/functions/vector.c b/plugins/functions/vector.c index a7283fc59e..a7c52b7861 100644 --- a/plugins/functions/vector.c +++ b/plugins/functions/vector.c @@ -371,6 +371,287 @@ func_vector_new(grn_ctx *ctx, int n_args, grn_obj **args, return vector; } +static grn_obj * +func_vector_find_vector(grn_ctx *ctx, + grn_obj *target, + grn_obj *query, + grn_operator operator, + grn_user_data *user_data) +{ + grn_obj *found_element = NULL; + grn_operator_exec_func *exec; + grn_obj element; + unsigned int i; + unsigned int n_elements = 0; + + exec = grn_operator_to_exec_func(operator); + GRN_VOID_INIT(&element); + n_elements = grn_vector_size(ctx, target); + for (i = 0; i < n_elements; i++) { + const char *content; + unsigned int content_size; + grn_id domain; + + content_size = grn_vector_get_element(ctx, + target, + i, + &content, + NULL, + &domain); + grn_obj_reinit(ctx, &element, domain, 0); + grn_bulk_write(ctx, &element, content, content_size); + if (exec(ctx, &element, query)) { + found_element = grn_plugin_proc_alloc(ctx, user_data, domain, 0); + grn_bulk_write(ctx, found_element, content, content_size); + break; + } + } + GRN_OBJ_FIN(ctx, &element); + + return found_element; +} + +static grn_obj * +func_vector_find_uvector_number(grn_ctx *ctx, + grn_obj *target, + grn_obj *query, + grn_operator operator, + grn_user_data *user_data) +{ + grn_obj *found_element = NULL; + grn_obj query_number_raw; + grn_obj *query_number = NULL; + size_t i, n_elements; + unsigned int element_size; + + if (query->header.domain == target->header.domain) { + query_number = query; + } else { + GRN_VALUE_FIX_SIZE_INIT(&query_number_raw, 0, target->header.domain); + if (grn_obj_cast(ctx, query, &query_number_raw, GRN_FALSE) != GRN_SUCCESS) { + GRN_OBJ_FIN(ctx, &query_number_raw); + return NULL; + } + query_number = &query_number_raw; + } + element_size = grn_uvector_element_size(ctx, target); + n_elements = GRN_BULK_VSIZE(target) / element_size; + if (operator == GRN_OP_EQUAL) { + for (i = 0; i < n_elements; i++) { + if (memcmp(GRN_BULK_HEAD(target) + (i * element_size), + GRN_BULK_HEAD(query_number), + element_size) == 0) { + found_element = grn_plugin_proc_alloc(ctx, + user_data, + target->header.domain, + 0); + grn_bulk_write(ctx, + found_element, + GRN_BULK_HEAD(target) + (i * element_size), + element_size); + break; + } + } + } else { + grn_operator_exec_func *exec; + grn_obj element; + + exec = grn_operator_to_exec_func(operator); + GRN_VALUE_FIX_SIZE_INIT(&element, 0, target->header.domain); + for (i = 0; i < n_elements; i++) { + GRN_BULK_REWIND(&element); + grn_bulk_write(ctx, + &element, + GRN_BULK_HEAD(target) + (i * element_size), + element_size); + if (exec(ctx, &element, query_number)) { + found_element = grn_plugin_proc_alloc(ctx, + user_data, + target->header.domain, + 0); + grn_bulk_write(ctx, + found_element, + GRN_BULK_HEAD(target) + (i * element_size), + element_size); + break; + } + } + GRN_OBJ_FIN(ctx, &element); + } + if (query_number == &query_number_raw) { + GRN_OBJ_FIN(ctx, &query_number_raw); + } + + return found_element; +} + +static grn_obj * +func_vector_find_uvector_record(grn_ctx *ctx, + grn_obj *target, + grn_obj *query, + grn_operator operator, + grn_user_data *user_data) +{ + grn_obj *found_element = NULL; + grn_id query_id = GRN_ID_NIL; + grn_id *ids; + size_t i, n_elements; + + if (operator != GRN_OP_EQUAL) { + return NULL; + } + + if (query->header.domain == target->header.domain) { + query_id = GRN_RECORD_VALUE(query); + } else { + grn_obj query_id_raw; + GRN_RECORD_INIT(&query_id_raw, 0, target->header.domain); + if (grn_obj_cast(ctx, query, &query_id_raw, GRN_FALSE) != GRN_SUCCESS) { + GRN_OBJ_FIN(ctx, &query_id_raw); + return NULL; + } + query_id = GRN_RECORD_VALUE(&query_id_raw); + GRN_OBJ_FIN(ctx, &query_id_raw); + } + ids = (grn_id *)GRN_BULK_HEAD(target); + n_elements = GRN_BULK_VSIZE(target) / sizeof(grn_id); + for (i = 0; i < n_elements; i++) { + if (ids[i] == query_id) { + found_element = grn_plugin_proc_alloc(ctx, + user_data, + target->header.domain, + 0); + GRN_RECORD_SET(ctx, found_element, ids[i]); + break; + } + } + + return found_element; +} + +static grn_obj * +func_vector_find_uvector(grn_ctx *ctx, + grn_obj *target, + grn_obj *query, + grn_operator operator, + grn_user_data *user_data) +{ + if (grn_type_id_is_number_family(ctx, target->header.domain)) { + return func_vector_find_uvector_number(ctx, + target, + query, + operator, + user_data); + } else if (grn_type_id_is_builtin(ctx, target->header.domain)) { + return NULL; + } else { + return func_vector_find_uvector_record(ctx, + target, + query, + operator, + user_data); + } +} + +static grn_obj * +func_vector_find_pvector(grn_ctx *ctx, + grn_obj *target, + grn_obj *query, + grn_operator operator, + grn_user_data *user_data) +{ + grn_obj *found_element = NULL; + grn_operator_exec_func *exec; + grn_obj **elements; + unsigned int i; + unsigned int n_elements = 0; + + exec = grn_operator_to_exec_func(operator); + elements = (grn_obj **)GRN_BULK_HEAD(target); + n_elements = sizeof(grn_id) / GRN_BULK_VSIZE(target); + for (i = 0; i < n_elements; i++) { + grn_obj *element = elements[i]; + if (exec(ctx, element, query)) { + found_element = + grn_plugin_proc_alloc(ctx, user_data, element->header.domain, 0); + grn_bulk_write(ctx, + found_element, + GRN_BULK_HEAD(element), + GRN_BULK_VSIZE(element)); + break; + } + } + + return found_element; +} + +static grn_obj * +func_vector_find(grn_ctx *ctx, int n_args, grn_obj **args, + grn_user_data *user_data) +{ + const char *context = "vector_find()"; + grn_obj *target; + grn_obj *query = NULL; + grn_operator operator = GRN_OP_EQUAL; + grn_obj *found_element = NULL; + + if (n_args < 2 || n_args > 3) { + GRN_PLUGIN_ERROR(ctx, GRN_INVALID_ARGUMENT, + "%s: wrong number of arguments (%d for 2..3)", + context, + n_args); + return NULL; + } + + target = args[0]; + query = args[1]; + if (n_args == 3) { + operator = grn_plugin_proc_get_value_mode(ctx, args[2], operator, context); + if (ctx->rc != GRN_SUCCESS) { + return NULL; + } + } + + switch (target->header.type) { + case GRN_VECTOR : + case GRN_PVECTOR : + case GRN_UVECTOR : + break; + default : + { + grn_obj inspected; + + GRN_TEXT_INIT(&inspected, 0); + grn_inspect(ctx, target, &inspected); + GRN_PLUGIN_ERROR(ctx, GRN_INVALID_ARGUMENT, + "%s: target object must be vector: <%.*s>", + context, + (int)GRN_TEXT_LEN(&inspected), + GRN_TEXT_VALUE(&inspected)); + GRN_OBJ_FIN(ctx, &inspected); + return NULL; + } + break; + } + + if (target->header.type == GRN_VECTOR) { + found_element = + func_vector_find_vector(ctx, target, query, operator, user_data); + } else if (target->header.type == GRN_UVECTOR) { + found_element = + func_vector_find_uvector(ctx, target, query, operator, user_data); + } else if (target->header.type == GRN_PVECTOR) { + found_element = + func_vector_find_pvector(ctx, target, query, operator, user_data); + } + + if (!found_element) { + found_element = grn_plugin_proc_alloc(ctx, user_data, GRN_DB_VOID, 0); + } + + return found_element; +} + grn_rc GRN_PLUGIN_INIT(grn_ctx *ctx) { @@ -391,6 +672,9 @@ GRN_PLUGIN_REGISTER(grn_ctx *ctx) grn_proc_create(ctx, "vector_new", -1, GRN_PROC_FUNCTION, func_vector_new, NULL, NULL, 0, NULL); + grn_proc_create(ctx, "vector_find", -1, GRN_PROC_FUNCTION, func_vector_find, + NULL, NULL, 0, NULL); + return rc; } diff --git a/test/command/suite/select/function/vector/vector_find/int8.expected b/test/command/suite/select/function/vector/vector_find/int8.expected new file mode 100644 index 0000000000..0c7239b4dc --- /dev/null +++ b/test/command/suite/select/function/vector/vector_find/int8.expected @@ -0,0 +1,64 @@ +plugin_register functions/vector +[[0,0.0,0.0],true] +table_create Memos TABLE_HASH_KEY ShortText +[[0,0.0,0.0],true] +column_create Memos numbers COLUMN_VECTOR Int8 +[[0,0.0,0.0],true] +load --table Memos +[ +{"_key": "Positive", "numbers": [1, 2, 3, 4, 5]}, +{"_key": "Even", "numbers": [2, 4, 6, 8, 10]}, +{"_key": "Nothing"} +] +[[0,0.0,0.0],3] +select Memos --output_columns 'numbers, vector_find(numbers, 4)' +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + 3 + ], + [ + [ + "numbers", + "Int8" + ], + [ + "vector_find", + null + ] + ], + [ + [ + 1, + 2, + 3, + 4, + 5 + ], + 4 + ], + [ + [ + 2, + 4, + 6, + 8, + 10 + ], + 4 + ], + [ + [ + + ], + null + ] + ] + ] +] diff --git a/test/command/suite/select/function/vector/vector_find/int8.test b/test/command/suite/select/function/vector/vector_find/int8.test new file mode 100644 index 0000000000..dcf8d7ebd0 --- /dev/null +++ b/test/command/suite/select/function/vector/vector_find/int8.test @@ -0,0 +1,14 @@ +plugin_register functions/vector + +table_create Memos TABLE_HASH_KEY ShortText +column_create Memos numbers COLUMN_VECTOR Int8 + +load --table Memos +[ +{"_key": "Positive", "numbers": [1, 2, 3, 4, 5]}, +{"_key": "Even", "numbers": [2, 4, 6, 8, 10]}, +{"_key": "Nothing"} +] + +select Memos \ + --output_columns 'numbers, vector_find(numbers, 4)' diff --git a/test/command/suite/select/function/vector/vector_find/int8_less_than.expected b/test/command/suite/select/function/vector/vector_find/int8_less_than.expected new file mode 100644 index 0000000000..2c52bb421c --- /dev/null +++ b/test/command/suite/select/function/vector/vector_find/int8_less_than.expected @@ -0,0 +1,64 @@ +plugin_register functions/vector +[[0,0.0,0.0],true] +table_create Memos TABLE_HASH_KEY ShortText +[[0,0.0,0.0],true] +column_create Memos numbers COLUMN_VECTOR Int8 +[[0,0.0,0.0],true] +load --table Memos +[ +{"_key": "Positive", "numbers": [5, 4, 3, 2, 1]}, +{"_key": "Even", "numbers": [10, 8, 6, 4, 2]}, +{"_key": "Nothing"} +] +[[0,0.0,0.0],3] +select Memos --output_columns 'numbers, vector_find(numbers, 4, "<")' +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + 3 + ], + [ + [ + "numbers", + "Int8" + ], + [ + "vector_find", + null + ] + ], + [ + [ + 5, + 4, + 3, + 2, + 1 + ], + 3 + ], + [ + [ + 10, + 8, + 6, + 4, + 2 + ], + 2 + ], + [ + [ + + ], + null + ] + ] + ] +] diff --git a/test/command/suite/select/function/vector/vector_find/int8_less_than.test b/test/command/suite/select/function/vector/vector_find/int8_less_than.test new file mode 100644 index 0000000000..dae137f429 --- /dev/null +++ b/test/command/suite/select/function/vector/vector_find/int8_less_than.test @@ -0,0 +1,14 @@ +plugin_register functions/vector + +table_create Memos TABLE_HASH_KEY ShortText +column_create Memos numbers COLUMN_VECTOR Int8 + +load --table Memos +[ +{"_key": "Positive", "numbers": [5, 4, 3, 2, 1]}, +{"_key": "Even", "numbers": [10, 8, 6, 4, 2]}, +{"_key": "Nothing"} +] + +select Memos \ + --output_columns 'numbers, vector_find(numbers, 4, "<")' diff --git a/test/command/suite/select/function/vector/vector_find/invalid_operator.expected b/test/command/suite/select/function/vector/vector_find/invalid_operator.expected new file mode 100644 index 0000000000..4cf9c325b1 --- /dev/null +++ b/test/command/suite/select/function/vector/vector_find/invalid_operator.expected @@ -0,0 +1,63 @@ +plugin_register functions/vector +[[0,0.0,0.0],true] +table_create Memos TABLE_HASH_KEY ShortText +[[0,0.0,0.0],true] +column_create Memos tags COLUMN_VECTOR ShortText +[[0,0.0,0.0],true] +load --table Memos +[ +{"_key": "Groonga", "tags": ["Great", "Groonga"]}, +{"_key": "Rroonga", "tags": ["Full text search", "Groonga", "Ruby"]}, +{"_key": "Nothing"} +] +[[0,0.0,0.0],3] +select Memos --output_columns 'tags, vector_find(tags, "Gr", "invalid")' +[ + [ + [ + -22, + 0.0, + 0.0 + ], + "vector_find(): mode must be one of them: [\"==\", \"EQUAL\", \"!=\", \"NOT_EQUAL\", \"<\", \"LESS\", \">\", \"GREATER\", \"<=\", \"LESS_EQUAL\", \">" + ], + [ + [ + [ + 3 + ], + [ + [ + "tags", + "ShortText" + ], + [ + "vector_find", + null + ] + ], + [ + [ + "Great", + "Groonga" + ], + "vector_find(): mode must be one of them: [\"==\", \"EQUAL\", \"!=\", \"NOT_EQUAL\", \"<\", \"LESS\", \">\", \"GREATER\", \"<=\", \"LESS_EQUAL\", \">" + ], + [ + [ + "Full text search", + "Groonga", + "Ruby" + ], + "vector_find(): mode must be one of them: [\"==\", \"EQUAL\", \"!=\", \"NOT_EQUAL\", \"<\", \"LESS\", \">\", \"GREATER\", \"<=\", \"LESS_EQUAL\", \">" + ], + [ + [ + + ], + "vector_find(): mode must be one of them: [\"==\", \"EQUAL\", \"!=\", \"NOT_EQUAL\", \"<\", \"LESS\", \">\", \"GREATER\", \"<=\", \"LESS_EQUAL\", \">" + ] + ] + ] +] +#|e| vector_find(): mode must be one of them: ["==", "EQUAL", "!=", "NOT_EQUAL", "<", "LESS", ">", "GREATER", "<=", "LESS_EQUAL", ">=", "GREATER_EQUAL", "@", "MATCH", "*N", "NEAR", "*S", "SIMILAR", "^", "@^", "PREFIX", "$", "@$", "SUFFIX", "~", "@~", "REGEXP"]: diff --git a/test/command/suite/select/function/vector/vector_find/invalid_operator.test b/test/command/suite/select/function/vector/vector_find/invalid_operator.test new file mode 100644 index 0000000000..89f37f236c --- /dev/null +++ b/test/command/suite/select/function/vector/vector_find/invalid_operator.test @@ -0,0 +1,14 @@ +plugin_register functions/vector + +table_create Memos TABLE_HASH_KEY ShortText +column_create Memos tags COLUMN_VECTOR ShortText + +load --table Memos +[ +{"_key": "Groonga", "tags": ["Great", "Groonga"]}, +{"_key": "Rroonga", "tags": ["Full text search", "Groonga", "Ruby"]}, +{"_key": "Nothing"} +] + +select Memos \ + --output_columns 'tags, vector_find(tags, "Gr", "invalid")' diff --git a/test/command/suite/select/function/vector/vector_find/reference.expected b/test/command/suite/select/function/vector/vector_find/reference.expected new file mode 100644 index 0000000000..2eb6eccb43 --- /dev/null +++ b/test/command/suite/select/function/vector/vector_find/reference.expected @@ -0,0 +1,62 @@ +plugin_register functions/vector +[[0,0.0,0.0],true] +table_create Tags TABLE_PAT_KEY ShortText +[[0,0.0,0.0],true] +table_create Memos TABLE_HASH_KEY ShortText +[[0,0.0,0.0],true] +column_create Memos tags COLUMN_VECTOR Tags +[[0,0.0,0.0],true] +load --table Memos +[ +{"_key": "Groonga", "tags": ["Groonga", "Full text search"]}, +{"_key": "Rroonga", "tags": ["Groonga", "Full text search", "Ruby", "Library"]}, +{"_key": "Nothing"} +] +[[0,0.0,0.0],3] +select Memos --output_columns 'tags, vector_find(tags, "Full text search")' +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + 3 + ], + [ + [ + "tags", + "Tags" + ], + [ + "vector_find", + null + ] + ], + [ + [ + "Groonga", + "Full text search" + ], + "Full text search" + ], + [ + [ + "Groonga", + "Full text search", + "Ruby", + "Library" + ], + "Full text search" + ], + [ + [ + + ], + null + ] + ] + ] +] diff --git a/test/command/suite/select/function/vector/vector_find/reference.test b/test/command/suite/select/function/vector/vector_find/reference.test new file mode 100644 index 0000000000..07339262ce --- /dev/null +++ b/test/command/suite/select/function/vector/vector_find/reference.test @@ -0,0 +1,16 @@ +plugin_register functions/vector + +table_create Tags TABLE_PAT_KEY ShortText + +table_create Memos TABLE_HASH_KEY ShortText +column_create Memos tags COLUMN_VECTOR Tags + +load --table Memos +[ +{"_key": "Groonga", "tags": ["Groonga", "Full text search"]}, +{"_key": "Rroonga", "tags": ["Groonga", "Full text search", "Ruby", "Library"]}, +{"_key": "Nothing"} +] + +select Memos \ + --output_columns 'tags, vector_find(tags, "Full text search")' diff --git a/test/command/suite/select/function/vector/vector_find/short_text.expected b/test/command/suite/select/function/vector/vector_find/short_text.expected new file mode 100644 index 0000000000..c3bf4acb04 --- /dev/null +++ b/test/command/suite/select/function/vector/vector_find/short_text.expected @@ -0,0 +1,59 @@ +plugin_register functions/vector +[[0,0.0,0.0],true] +table_create Memos TABLE_HASH_KEY ShortText +[[0,0.0,0.0],true] +column_create Memos tags COLUMN_VECTOR ShortText +[[0,0.0,0.0],true] +load --table Memos +[ +{"_key": "Groonga", "tags": ["Groonga", "Full text search"]}, +{"_key": "Rroonga", "tags": ["Groonga", "Full text search", "Ruby"]}, +{"_key": "Nothing"} +] +[[0,0.0,0.0],3] +select Memos --output_columns 'tags, vector_find(tags, "Full text search")' +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + 3 + ], + [ + [ + "tags", + "ShortText" + ], + [ + "vector_find", + null + ] + ], + [ + [ + "Groonga", + "Full text search" + ], + "Full text search" + ], + [ + [ + "Groonga", + "Full text search", + "Ruby" + ], + "Full text search" + ], + [ + [ + + ], + null + ] + ] + ] +] diff --git a/test/command/suite/select/function/vector/vector_find/short_text.test b/test/command/suite/select/function/vector/vector_find/short_text.test new file mode 100644 index 0000000000..0515b7bc70 --- /dev/null +++ b/test/command/suite/select/function/vector/vector_find/short_text.test @@ -0,0 +1,14 @@ +plugin_register functions/vector + +table_create Memos TABLE_HASH_KEY ShortText +column_create Memos tags COLUMN_VECTOR ShortText + +load --table Memos +[ +{"_key": "Groonga", "tags": ["Groonga", "Full text search"]}, +{"_key": "Rroonga", "tags": ["Groonga", "Full text search", "Ruby"]}, +{"_key": "Nothing"} +] + +select Memos \ + --output_columns 'tags, vector_find(tags, "Full text search")' diff --git a/test/command/suite/select/function/vector/vector_find/short_text_prefix.expected b/test/command/suite/select/function/vector/vector_find/short_text_prefix.expected new file mode 100644 index 0000000000..ee71b032fc --- /dev/null +++ b/test/command/suite/select/function/vector/vector_find/short_text_prefix.expected @@ -0,0 +1,59 @@ +plugin_register functions/vector +[[0,0.0,0.0],true] +table_create Memos TABLE_HASH_KEY ShortText +[[0,0.0,0.0],true] +column_create Memos tags COLUMN_VECTOR ShortText +[[0,0.0,0.0],true] +load --table Memos +[ +{"_key": "Groonga", "tags": ["Great", "Groonga"]}, +{"_key": "Rroonga", "tags": ["Full text search", "Groonga", "Ruby"]}, +{"_key": "Nothing"} +] +[[0,0.0,0.0],3] +select Memos --output_columns 'tags, vector_find(tags, "Gr", "@^")' +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + 3 + ], + [ + [ + "tags", + "ShortText" + ], + [ + "vector_find", + null + ] + ], + [ + [ + "Great", + "Groonga" + ], + "Great" + ], + [ + [ + "Full text search", + "Groonga", + "Ruby" + ], + "Groonga" + ], + [ + [ + + ], + null + ] + ] + ] +] diff --git a/test/command/suite/select/function/vector/vector_find/short_text_prefix.test b/test/command/suite/select/function/vector/vector_find/short_text_prefix.test new file mode 100644 index 0000000000..a1f1f7e350 --- /dev/null +++ b/test/command/suite/select/function/vector/vector_find/short_text_prefix.test @@ -0,0 +1,14 @@ +plugin_register functions/vector + +table_create Memos TABLE_HASH_KEY ShortText +column_create Memos tags COLUMN_VECTOR ShortText + +load --table Memos +[ +{"_key": "Groonga", "tags": ["Great", "Groonga"]}, +{"_key": "Rroonga", "tags": ["Full text search", "Groonga", "Ruby"]}, +{"_key": "Nothing"} +] + +select Memos \ + --output_columns 'tags, vector_find(tags, "Gr", "@^")' diff --git a/test/command/suite/select/function/vector/vector_find/weight_reference_vector.expected b/test/command/suite/select/function/vector/vector_find/weight_reference_vector.expected new file mode 100644 index 0000000000..85ac3820d8 --- /dev/null +++ b/test/command/suite/select/function/vector/vector_find/weight_reference_vector.expected @@ -0,0 +1,61 @@ +plugin_register functions/vector +[[0,0.0,0.0],true] +table_create Tags TABLE_PAT_KEY ShortText +[[0,0.0,0.0],true] +table_create Memos TABLE_HASH_KEY ShortText +[[0,0.0,0.0],true] +column_create Memos tags COLUMN_VECTOR|WITH_WEIGHT Tags +[[0,0.0,0.0],true] +load --table Memos +[ +{"_key": "Groonga", "tags": {"Groonga": 100, "Full text search": 90}}, +{"_key": "Rroonga", "tags": {"Groonga": 100, "Full text search": 90, "Ruby": 50, "Library": 30}}, +{"_key": "Nothing"} +] +[[0,0.0,0.0],3] +select Memos --output_columns 'tags, vector_find(tags, "Full text search")' +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + 3 + ], + [ + [ + "tags", + "Tags" + ], + [ + "vector_find", + null + ] + ], + [ + { + "Groonga": 100, + "Full text search": 90 + }, + "Full text search" + ], + [ + { + "Groonga": 100, + "Full text search": 90, + "Ruby": 50, + "Library": 30 + }, + "Full text search" + ], + [ + { + }, + null + ] + ] + ] +] diff --git a/test/command/suite/select/function/vector/vector_find/weight_reference_vector.test b/test/command/suite/select/function/vector/vector_find/weight_reference_vector.test new file mode 100644 index 0000000000..1d46ce7b19 --- /dev/null +++ b/test/command/suite/select/function/vector/vector_find/weight_reference_vector.test @@ -0,0 +1,16 @@ +plugin_register functions/vector + +table_create Tags TABLE_PAT_KEY ShortText + +table_create Memos TABLE_HASH_KEY ShortText +column_create Memos tags COLUMN_VECTOR|WITH_WEIGHT Tags + +load --table Memos +[ +{"_key": "Groonga", "tags": {"Groonga": 100, "Full text search": 90}}, +{"_key": "Rroonga", "tags": {"Groonga": 100, "Full text search": 90, "Ruby": 50, "Library": 30}}, +{"_key": "Nothing"} +] + +select Memos \ + --output_columns 'tags, vector_find(tags, "Full text search")'