[Groonga-commit] groonga/groonga at 76e4b41 [master] Support alias to accessor such as _key

アーカイブの一覧に戻る

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 



More information about the Groonga-commit mailing list
アーカイブの一覧に戻る