[Groonga-commit] groonga/groonga at 14d4b7a [master] select: support 'reference_column @ "query"' without index

Back to archive index

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 



More information about the Groonga-commit mailing list
Back to archive index