Kouhei Sutou
null+****@clear*****
Tue Feb 27 01:47:39 JST 2018
Kouhei Sutou 2018-02-27 01:47:39 +0900 (Tue, 27 Feb 2018) New Revision: 76e4b41bf682019925452544bfbfd28a0e5b45c1 https://github.com/groonga/groonga/commit/76e4b41bf682019925452544bfbfd28a0e5b45c1 Message: Support alias to accessor such as _key Added files: test/command/suite/select/filter/alias/accessor_full.expected test/command/suite/select/filter/alias/accessor_full.test test/command/suite/select/filter/alias/accessor_local.expected test/command/suite/select/filter/alias/accessor_local.test Modified files: lib/db.c Modified: lib/db.c (+128 -63) =================================================================== --- lib/db.c 2018-02-23 13:02:55 +0900 (a77011ff7) +++ lib/db.c 2018-02-27 01:47:39 +0900 (e4850950a) @@ -550,80 +550,101 @@ grn_db_get_cache(grn_ctx *ctx, grn_obj *db) GRN_API_RETURN(cache); } -grn_obj * -grn_ctx_get(grn_ctx *ctx, const char *name, int name_size) +static grn_obj * +grn_alias_resolve(grn_ctx *ctx, + const char *name, + int name_size, + grn_obj *alias_name_buffer, + grn_bool get_object) { - grn_obj *obj = NULL; - grn_obj *db; - if (!ctx || !ctx->impl || !(db = ctx->impl->db)) { - return NULL; + grn_db *db; + grn_obj *alias_table = NULL; + grn_obj *alias_column = NULL; + + db = (grn_db *)(ctx->impl->db); + + if (name_size < 0) { + name_size = strlen(name); } - GRN_API_ENTER; - if (GRN_DB_P(db)) { - grn_db *s = (grn_db *)db; - grn_obj *alias_table = NULL; - grn_obj *alias_column = NULL; - grn_obj alias_name_buffer; - if (name_size < 0) { - name_size = strlen(name); - } - GRN_TEXT_INIT(&alias_name_buffer, 0); - while (GRN_TRUE) { + while (GRN_TRUE) { + if (get_object) { grn_id id; - id = grn_table_get(ctx, s->keys, name, name_size); + id = grn_table_get(ctx, db->keys, name, name_size); if (id) { - obj = grn_ctx_at(ctx, id); - break; + return grn_ctx_at(ctx, id); } + } - if (!alias_column) { - grn_id alias_column_id; - const char *alias_column_name; - uint32_t alias_column_name_size; + if (!alias_column) { + grn_id alias_column_id; + const char *alias_column_name; + uint32_t alias_column_name_size; - grn_config_get(ctx, - "alias.column", -1, - &alias_column_name, &alias_column_name_size); - if (!alias_column_name) { - break; - } - alias_column_id = grn_table_get(ctx, - s->keys, - alias_column_name, - alias_column_name_size); - if (!alias_column_id) { - break; - } - alias_column = grn_ctx_at(ctx, alias_column_id); - if (alias_column->header.type != GRN_COLUMN_VAR_SIZE) { - break; - } - if (alias_column->header.flags & GRN_OBJ_VECTOR) { - break; - } - if (DB_OBJ(alias_column)->range != GRN_DB_SHORT_TEXT) { - break; - } - alias_table = grn_ctx_at(ctx, alias_column->header.domain); - if (alias_table->header.type == GRN_TABLE_NO_KEY) { - break; - } + grn_config_get(ctx, + "alias.column", -1, + &alias_column_name, &alias_column_name_size); + if (!alias_column_name) { + break; } + alias_column_id = grn_table_get(ctx, + db->keys, + alias_column_name, + alias_column_name_size); + if (!alias_column_id) { + break; + } + alias_column = grn_ctx_at(ctx, alias_column_id); + if (alias_column->header.type != GRN_COLUMN_VAR_SIZE) { + break; + } + if (alias_column->header.flags & GRN_OBJ_VECTOR) { + break; + } + if (DB_OBJ(alias_column)->range != GRN_DB_SHORT_TEXT) { + break; + } + alias_table = grn_ctx_at(ctx, alias_column->header.domain); + if (alias_table->header.type == GRN_TABLE_NO_KEY) { + break; + } + } - { - grn_id alias_id; - alias_id = grn_table_get(ctx, alias_table, name, name_size); - if (!alias_id) { - break; - } - GRN_BULK_REWIND(&alias_name_buffer); - grn_obj_get_value(ctx, alias_column, alias_id, &alias_name_buffer); - name = GRN_TEXT_VALUE(&alias_name_buffer); - name_size = GRN_TEXT_LEN(&alias_name_buffer); + { + grn_id alias_id; + alias_id = grn_table_get(ctx, alias_table, name, name_size); + if (!alias_id) { + break; } + GRN_BULK_REWIND(alias_name_buffer); + grn_obj_get_value(ctx, alias_column, alias_id, alias_name_buffer); + name = GRN_TEXT_VALUE(alias_name_buffer); + name_size = GRN_TEXT_LEN(alias_name_buffer); } + } + + return NULL; +} + +grn_obj * +grn_ctx_get(grn_ctx *ctx, const char *name, int name_size) +{ + grn_obj *obj = NULL; + grn_obj *db; + if (!ctx || !ctx->impl || !(db = ctx->impl->db)) { + return NULL; + } + GRN_API_ENTER; + if (GRN_DB_P(db)) { + grn_obj alias_name_buffer; + + GRN_TEXT_INIT(&alias_name_buffer, 0); + obj = grn_alias_resolve(ctx, + name, + name_size, + &alias_name_buffer, + GRN_TRUE); GRN_OBJ_FIN(ctx, &alias_name_buffer); } GRN_API_RETURN(obj); @@ -4731,8 +4752,52 @@ grn_obj_column(grn_ctx *ctx, grn_obj *table, const char *name, unsigned int name grn_obj *column = NULL; GRN_API_ENTER; if (GRN_OBJ_TABLEP(table)) { - if (grn_db_check_name(ctx, name, name_size) || - !(column = grn_obj_column_(ctx, table, name, name_size))) { + if (grn_db_check_name(ctx, name, name_size) == GRN_SUCCESS) { + column = grn_obj_column_(ctx, table, name, name_size); + if (!column && + !(DB_OBJ(table)->id & GRN_OBJ_TMP_OBJECT) && + ctx->impl && + ctx->impl->db) { + char column_name[GRN_TABLE_MAX_KEY_SIZE]; + int table_name_size; + table_name_size = grn_obj_name(ctx, + table, + column_name, + GRN_TABLE_MAX_KEY_SIZE); + if (table_name_size > 0) { + int column_name_size = table_name_size; + grn_obj alias_name_buffer; + column_name[column_name_size++] = GRN_DB_DELIMITER; + grn_memcpy(column_name + column_name_size, + name, + name_size); + column_name_size += name_size; + GRN_TEXT_INIT(&alias_name_buffer, 0); + grn_alias_resolve(ctx, + column_name, + column_name_size, + &alias_name_buffer, + GRN_FALSE); + if (GRN_TEXT_LEN(&alias_name_buffer) > 0) { + const char *alias_name = GRN_TEXT_VALUE(&alias_name_buffer); + size_t alias_name_size = GRN_TEXT_LEN(&alias_name_buffer); + const size_t delimiter_size = 1; + if (alias_name_size > table_name_size + delimiter_size && + alias_name[table_name_size] == GRN_DB_DELIMITER && + strncmp(alias_name, column_name, table_name_size) == 0) { + alias_name += table_name_size + 1; + alias_name_size -= table_name_size + 1; + } + column = grn_obj_get_accessor(ctx, + table, + alias_name, + alias_name_size); + } + GRN_OBJ_FIN(ctx, &alias_name_buffer); + } + } + } + if (!column) { column = grn_obj_get_accessor(ctx, table, name, name_size); } } else if (GRN_ACCESSORP(table)) { Added: test/command/suite/select/filter/alias/accessor_full.expected (+33 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/filter/alias/accessor_full.expected 2018-02-27 01:47:39 +0900 (88bfe99c7) @@ -0,0 +1,33 @@ +config_set alias.column Aliases.real_name +[[0,0.0,0.0],true] +table_create Aliases TABLE_HASH_KEY ShortText +[[0,0.0,0.0],true] +column_create Aliases real_name COLUMN_SCALAR ShortText +[[0,0.0,0.0],true] +table_create Memos TABLE_HASH_KEY ShortText +[[0,0.0,0.0],true] +load --table Memos +[ +{"_key": "Groonga"} +] +[[0,0.0,0.0],1] +select Memos --filter 'caption == "Groonga"' +[ + [ + [ + -63, + 0.0, + 0.0 + ], + "Syntax error: <caption| |== \"Groonga\">: [expr][parse] unknown identifier: <caption>" + ] +] +#|e| [expr][parse] unknown identifier: <caption> +#|e| Syntax error: <caption| |== "Groonga">: Syntax error: <caption| |== "Groonga">: [expr][parse] unknown identifier: <caption> +load --table Aliases +[ +{"_key": "Memos.caption", "real_name": "Memos._key"} +] +[[0,0.0,0.0],1] +select Memos --filter 'caption == "Groonga"' +[[0,0.0,0.0],[[[1],[["_id","UInt32"],["_key","ShortText"]],[1,"Groonga"]]]] Added: test/command/suite/select/filter/alias/accessor_full.test (+20 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/filter/alias/accessor_full.test 2018-02-27 01:47:39 +0900 (ce92181a2) @@ -0,0 +1,20 @@ +config_set alias.column Aliases.real_name + +table_create Aliases TABLE_HASH_KEY ShortText +column_create Aliases real_name COLUMN_SCALAR ShortText + +table_create Memos TABLE_HASH_KEY ShortText + +load --table Memos +[ +{"_key": "Groonga"} +] + +select Memos --filter 'caption == "Groonga"' + +load --table Aliases +[ +{"_key": "Memos.caption", "real_name": "Memos._key"} +] + +select Memos --filter 'caption == "Groonga"' Added: test/command/suite/select/filter/alias/accessor_local.expected (+33 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/filter/alias/accessor_local.expected 2018-02-27 01:47:39 +0900 (f31350003) @@ -0,0 +1,33 @@ +config_set alias.column Aliases.real_name +[[0,0.0,0.0],true] +table_create Aliases TABLE_HASH_KEY ShortText +[[0,0.0,0.0],true] +column_create Aliases real_name COLUMN_SCALAR ShortText +[[0,0.0,0.0],true] +table_create Memos TABLE_HASH_KEY ShortText +[[0,0.0,0.0],true] +load --table Memos +[ +{"_key": "Groonga"} +] +[[0,0.0,0.0],1] +select Memos --filter 'caption == "Groonga"' +[ + [ + [ + -63, + 0.0, + 0.0 + ], + "Syntax error: <caption| |== \"Groonga\">: [expr][parse] unknown identifier: <caption>" + ] +] +#|e| [expr][parse] unknown identifier: <caption> +#|e| Syntax error: <caption| |== "Groonga">: Syntax error: <caption| |== "Groonga">: [expr][parse] unknown identifier: <caption> +load --table Aliases +[ +{"_key": "Memos.caption", "real_name": "_key"} +] +[[0,0.0,0.0],1] +select Memos --filter 'caption == "Groonga"' +[[0,0.0,0.0],[[[1],[["_id","UInt32"],["_key","ShortText"]],[1,"Groonga"]]]] Added: test/command/suite/select/filter/alias/accessor_local.test (+20 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/filter/alias/accessor_local.test 2018-02-27 01:47:39 +0900 (9e61ea232) @@ -0,0 +1,20 @@ +config_set alias.column Aliases.real_name + +table_create Aliases TABLE_HASH_KEY ShortText +column_create Aliases real_name COLUMN_SCALAR ShortText + +table_create Memos TABLE_HASH_KEY ShortText + +load --table Memos +[ +{"_key": "Groonga"} +] + +select Memos --filter 'caption == "Groonga"' + +load --table Aliases +[ +{"_key": "Memos.caption", "real_name": "_key"} +] + +select Memos --filter 'caption == "Groonga"' -------------- next part -------------- HTML����������������������������... URL: https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20180227/817831a5/attachment-0001.htm