Navigation Menu

Skip to content

Commit

Permalink
Support alias to accessor such as _key
Browse files Browse the repository at this point in the history
  • Loading branch information
kou committed Feb 26, 2018
1 parent e62a15f commit 76e4b41
Show file tree
Hide file tree
Showing 5 changed files with 234 additions and 63 deletions.
191 changes: 128 additions & 63 deletions lib/db.c
Expand Up @@ -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);
Expand Down Expand Up @@ -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)) {
Expand Down
33 changes: 33 additions & 0 deletions test/command/suite/select/filter/alias/accessor_full.expected
@@ -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"]]]]
20 changes: 20 additions & 0 deletions test/command/suite/select/filter/alias/accessor_full.test
@@ -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"'
33 changes: 33 additions & 0 deletions test/command/suite/select/filter/alias/accessor_local.expected
@@ -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"]]]]
20 changes: 20 additions & 0 deletions test/command/suite/select/filter/alias/accessor_local.test
@@ -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"'

0 comments on commit 76e4b41

Please sign in to comment.