Kouhei Sutou
null+****@clear*****
Wed Nov 19 17:56:24 JST 2014
Kouhei Sutou 2014-11-19 17:56:24 +0900 (Wed, 19 Nov 2014) New Revision: 14d4b7a3242154cd8352810357e2ebeeefe4282e https://github.com/groonga/groonga/commit/14d4b7a3242154cd8352810357e2ebeeefe4282e Message: select: support 'reference_column @ "query"' without index Added files: test/command/suite/select/filter/no_index/match/reference_text/no_normalizer.expected test/command/suite/select/filter/no_index/match/reference_text/no_normalizer.test test/command/suite/select/filter/no_index/match/reference_text/normalizer.expected test/command/suite/select/filter/no_index/match/reference_text/normalizer.test test/command/suite/select/filter/no_index/match/text_text.expected test/command/suite/select/filter/no_index/match/text_text.test Modified files: lib/expr.c Modified: lib/expr.c (+104 -31) =================================================================== --- lib/expr.c 2014-11-19 00:05:04 +0900 (70e4be2) +++ lib/expr.c 2014-11-19 17:56:24 +0900 (e86ece7) @@ -2666,51 +2666,124 @@ grn_proc_call(grn_ctx *ctx, grn_obj *proc, int nargs, grn_obj *caller) } while (0) static grn_bool -pseudo_query_scan(grn_ctx *ctx, grn_obj *x, grn_obj *y) +pseudo_query_scan_raw_text_raw_text(grn_ctx *ctx, + const char *x, unsigned int x_len, + const char *y, unsigned int y_len) { grn_obj *normalizer; - grn_obj *a = NULL, *b = NULL; + grn_obj *norm_x; + grn_obj *norm_y; + const char *norm_x_raw; + const char *norm_y_raw; grn_bool matched = GRN_FALSE; normalizer = grn_ctx_get(ctx, GRN_NORMALIZER_AUTO_NAME, -1); - switch (x->header.domain) { - case GRN_DB_SHORT_TEXT: - case GRN_DB_TEXT: - case GRN_DB_LONG_TEXT: - a = grn_string_open(ctx, GRN_TEXT_VALUE(x), GRN_TEXT_LEN(x), - normalizer, 0); - break; - default: - break; - } + norm_x = grn_string_open(ctx, x, x_len, normalizer, 0); + norm_y = grn_string_open(ctx, y, y_len, normalizer, 0); + grn_string_get_normalized(ctx, norm_x, &norm_x_raw, NULL, NULL); + grn_string_get_normalized(ctx, norm_y, &norm_y_raw, NULL, NULL); + /* normalized str doesn't contain '\0'. */ + matched = (strstr(norm_x_raw, norm_y_raw) != NULL); - switch (y->header.domain) { - case GRN_DB_SHORT_TEXT: - case GRN_DB_TEXT: - case GRN_DB_LONG_TEXT: - b = grn_string_open(ctx, GRN_TEXT_VALUE(y), GRN_TEXT_LEN(y), - normalizer, 0); - break; - default: - break; - } + grn_obj_close(ctx, norm_x); + grn_obj_close(ctx, norm_y); + grn_obj_unlink(ctx, normalizer); - /* normalized str doesn't contain '\0'. */ - if (a && b) { - const char *a_norm, *b_norm; - grn_string_get_normalized(ctx, a, &a_norm, NULL, NULL); - grn_string_get_normalized(ctx, b, &b_norm, NULL, NULL); - matched = (strstr(a_norm, b_norm) != NULL); + return matched; +} + +static grn_bool +pseudo_query_scan_record_text(grn_ctx *ctx, grn_obj *record, grn_obj *table, + grn_obj *y) +{ + grn_obj *normalizer; + char x_key[GRN_TABLE_MAX_KEY_SIZE]; + int x_key_len; + grn_bool matched = GRN_FALSE; + + if (table->header.domain != GRN_DB_SHORT_TEXT) { + return GRN_FALSE; } - if (a) { grn_obj_close(ctx, a); } - if (b) { grn_obj_close(ctx, b); } + x_key_len = grn_table_get_key(ctx, table, GRN_RECORD_VALUE(record), + x_key, GRN_TABLE_MAX_KEY_SIZE); + grn_table_get_info(ctx, table, NULL, NULL, NULL, &normalizer, NULL); + if (normalizer) { + grn_obj *norm_y; + const char *norm_y_raw; + norm_y = grn_string_open(ctx, GRN_TEXT_VALUE(y), GRN_TEXT_LEN(y), + normalizer, 0); + grn_string_get_normalized(ctx, norm_y, &norm_y_raw, NULL, NULL); + + if (x_key_len == GRN_TABLE_MAX_KEY_SIZE) { + grn_obj x_key_buffer; + GRN_TEXT_INIT(&x_key_buffer, 0); + GRN_TEXT_PUT(ctx, &x_key_buffer, x_key, x_key_len); + GRN_TEXT_PUTC(ctx, &x_key_buffer, '\0'); + matched = (strstr(GRN_TEXT_VALUE(&x_key_buffer), norm_y_raw) != NULL); + GRN_OBJ_FIN(ctx, &x_key_buffer); + } else { + x_key[x_key_len] = '\0'; + matched = (strstr(x_key, norm_y_raw) != NULL); + } - if (normalizer) { grn_obj_unlink(ctx, normalizer); } + grn_obj_close(ctx, norm_y); + } else { + matched = pseudo_query_scan_raw_text_raw_text(ctx, + x_key, + x_key_len, + GRN_TEXT_VALUE(y), + GRN_TEXT_LEN(y)); + } return matched; } +static grn_bool +pseudo_query_scan_text_text(grn_ctx *ctx, grn_obj *x, grn_obj *y) +{ + return pseudo_query_scan_raw_text_raw_text(ctx, + GRN_TEXT_VALUE(x), + GRN_TEXT_LEN(x), + GRN_TEXT_VALUE(y), + GRN_TEXT_LEN(y)); +} + +static grn_bool +pseudo_query_scan(grn_ctx *ctx, grn_obj *x, grn_obj *y) +{ + switch (x->header.domain) { + case GRN_DB_SHORT_TEXT : + case GRN_DB_TEXT : + case GRN_DB_LONG_TEXT : + switch (y->header.domain) { + case GRN_DB_SHORT_TEXT : + case GRN_DB_TEXT : + case GRN_DB_LONG_TEXT : + return pseudo_query_scan_text_text(ctx, x, y); + default : + break; + } + return GRN_FALSE; + default: + { + grn_obj *domain; + domain = grn_ctx_at(ctx, x->header.domain); + if (GRN_OBJ_TABLEP(domain)) { + switch (y->header.domain) { + case GRN_DB_SHORT_TEXT : + case GRN_DB_TEXT : + case GRN_DB_LONG_TEXT : + return pseudo_query_scan_record_text(ctx, x, domain, y); + default : + break; + } + } + } + return GRN_FALSE; + } +} + inline static void grn_expr_exec_get_member(grn_ctx *ctx, grn_obj *expr, Added: test/command/suite/select/filter/no_index/match/reference_text/no_normalizer.expected (+40 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/filter/no_index/match/reference_text/no_normalizer.expected 2014-11-19 17:56:24 +0900 (d4ba47d) @@ -0,0 +1,40 @@ +table_create Paths TABLE_PAT_KEY ShortText +[[0,0.0,0.0],true] +table_create Memos TABLE_NO_KEY +[[0,0.0,0.0],true] +column_create Memos path COLUMN_SCALAR Paths +[[0,0.0,0.0],true] +load --table Memos +[ +{"path": "/data/Groonga/db"} +] +[[0,0.0,0.0],1] +select Memos --filter 'path @ "gROONGA"' +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + 1 + ], + [ + [ + "_id", + "UInt32" + ], + [ + "path", + "Paths" + ] + ], + [ + 1, + "/data/Groonga/db" + ] + ] + ] +] Added: test/command/suite/select/filter/no_index/match/reference_text/no_normalizer.test (+11 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/filter/no_index/match/reference_text/no_normalizer.test 2014-11-19 17:56:24 +0900 (ec184e8) @@ -0,0 +1,11 @@ +table_create Paths TABLE_PAT_KEY ShortText + +table_create Memos TABLE_NO_KEY +column_create Memos path COLUMN_SCALAR Paths + +load --table Memos +[ +{"path": "/data/Groonga/db"} +] + +select Memos --filter 'path @ "gROONGA"' Added: test/command/suite/select/filter/no_index/match/reference_text/normalizer.expected (+40 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/filter/no_index/match/reference_text/normalizer.expected 2014-11-19 17:56:24 +0900 (957cdf9) @@ -0,0 +1,40 @@ +table_create Paths TABLE_PAT_KEY ShortText --normalizer NormalizerAuto +[[0,0.0,0.0],true] +table_create Memos TABLE_NO_KEY +[[0,0.0,0.0],true] +column_create Memos path COLUMN_SCALAR Paths +[[0,0.0,0.0],true] +load --table Memos +[ +{"path": "/data/Groonga/db"} +] +[[0,0.0,0.0],1] +select Memos --filter 'path @ "gROONGA"' +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + 1 + ], + [ + [ + "_id", + "UInt32" + ], + [ + "path", + "Paths" + ] + ], + [ + 1, + "/data/groonga/db" + ] + ] + ] +] Added: test/command/suite/select/filter/no_index/match/reference_text/normalizer.test (+11 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/filter/no_index/match/reference_text/normalizer.test 2014-11-19 17:56:24 +0900 (b30692d) @@ -0,0 +1,11 @@ +table_create Paths TABLE_PAT_KEY ShortText --normalizer NormalizerAuto + +table_create Memos TABLE_NO_KEY +column_create Memos path COLUMN_SCALAR Paths + +load --table Memos +[ +{"path": "/data/Groonga/db"} +] + +select Memos --filter 'path @ "gROONGA"' Added: test/command/suite/select/filter/no_index/match/text_text.expected (+11 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/filter/no_index/match/text_text.expected 2014-11-19 17:56:24 +0900 (547e61e) @@ -0,0 +1,11 @@ +table_create Memos TABLE_NO_KEY +[[0,0.0,0.0],true] +column_create Memos content COLUMN_SCALAR Text +[[0,0.0,0.0],true] +load --table Memos +[ +{"content": "Groonga"} +] +[[0,0.0,0.0],1] +select Memos --filter 'content @ "gROONGA"' +[[0,0.0,0.0],[[[1],[["_id","UInt32"],["content","Text"]],[1,"Groonga"]]]] Added: test/command/suite/select/filter/no_index/match/text_text.test (+9 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/filter/no_index/match/text_text.test 2014-11-19 17:56:24 +0900 (c3938d4) @@ -0,0 +1,9 @@ +table_create Memos TABLE_NO_KEY +column_create Memos content COLUMN_SCALAR Text + +load --table Memos +[ +{"content": "Groonga"} +] + +select Memos --filter 'content @ "gROONGA"' -------------- next part -------------- HTML����������������������������...Download