[Groonga-commit] groonga/groonga at 8294d71 [master] query log: support showing condition in each "filter"

Back to archive index

Kouhei Sutou null+****@clear*****
Thu Feb 15 18:19:30 JST 2018


Kouhei Sutou	2018-02-15 18:19:30 +0900 (Thu, 15 Feb 2018)

  New Revision: 8294d712bca1786626c5774266e3a620fe64fad0
  https://github.com/groonga/groonga/commit/8294d712bca1786626c5774266e3a620fe64fad0

  Message:
    query log: support showing condition in each "filter"
    
    It's disabled by default. You need to set
    GRN_QUERY_LOG_SHOW_CONDITION=yes environment variable to enable it.
    
    If we confirm that this change doesn't have big impact for performance
    and doesn't cause a crash for any query.

  Modified files:
    lib/expr.c

  Modified: lib/expr.c (+160 -1)
===================================================================
--- lib/expr.c    2018-02-15 18:13:14 +0900 (4db25b4a2)
+++ lib/expr.c    2018-02-15 18:19:30 +0900 (94386a544)
@@ -45,6 +45,7 @@ static double grn_table_select_enough_filtered_ratio = 0.0;
 static int grn_table_select_max_n_enough_filtered_records = 1000;
 static grn_bool grn_table_select_and_min_skip_enable = GRN_TRUE;
 static grn_bool grn_scan_info_regexp_dot_asterisk_enable = GRN_TRUE;
+static grn_bool grn_query_log_show_condition = GRN_FALSE;
 
 void
 grn_expr_init_from_env(void)
@@ -94,6 +95,18 @@ grn_expr_init_from_env(void)
       grn_scan_info_regexp_dot_asterisk_enable = GRN_TRUE;
     }
   }
+
+  {
+    char grn_query_log_show_condition_env[GRN_ENV_BUFFER_SIZE];
+    grn_getenv("GRN_QUERY_LOG_SHOW_CONDITION",
+               grn_query_log_show_condition_env,
+               GRN_ENV_BUFFER_SIZE);
+    if (strcmp(grn_query_log_show_condition_env, "yes") == 0) {
+      grn_query_log_show_condition = GRN_TRUE;
+    } else {
+      grn_query_log_show_condition = GRN_FALSE;
+    }
+  }
 }
 
 grn_obj *
@@ -6941,6 +6954,139 @@ grn_table_select_index(grn_ctx *ctx, grn_obj *table, scan_info *si,
   return processed;
 }
 
+static void
+grn_table_select_inspect_condition_argument(grn_ctx *ctx,
+                                            grn_obj *buffer,
+                                            grn_obj *argument)
+{
+  grn_obj *domain;
+
+  switch (argument->header.type) {
+  case GRN_BULK :
+    domain = grn_ctx_at(ctx, argument->header.domain);
+    if (grn_obj_is_table(ctx, domain)) {
+      grn_record_inspect_without_columns(ctx, buffer, argument);
+    } else {
+      grn_inspect(ctx, buffer, argument);
+    }
+    break;
+  case GRN_UVECTOR :
+    domain = grn_ctx_at(ctx, argument->header.domain);
+    if (grn_obj_is_table(ctx, domain)) {
+      grn_uvector_record_inspect_without_columns(ctx, buffer, argument);
+    } else {
+      grn_inspect(ctx, buffer, argument);
+    }
+    break;
+  case GRN_TABLE_HASH_KEY :
+  case GRN_TABLE_PAT_KEY :
+  case GRN_TABLE_NO_KEY :
+  case GRN_COLUMN_FIX_SIZE :
+  case GRN_COLUMN_VAR_SIZE :
+  case GRN_COLUMN_INDEX :
+    grn_inspect_name(ctx, buffer, argument);
+    break;
+  default :
+    grn_inspect(ctx, buffer, argument);
+    break;
+  }
+}
+
+static const char *
+grn_table_select_inspect_condition(grn_ctx *ctx,
+                                   grn_obj *buffer,
+                                   scan_info *si,
+                                   grn_expr *expr)
+{
+  uint32_t i;
+  uint32_t n_codes;
+  grn_operator last_operator;
+
+  if (!grn_query_log_show_condition) {
+    return "";
+  }
+
+  n_codes = si->end - si->start + 1;
+  last_operator = expr->codes[si->end].op;
+
+  GRN_BULK_REWIND(buffer);
+
+  GRN_TEXT_PUTS(ctx, buffer, ": ");
+
+  switch (last_operator) {
+  case GRN_OP_CALL :
+    for (i = si->start; i <= si->end; i++) {
+      grn_expr_code *code = expr->codes + i;
+      if (i == si->start) {
+        if (grn_obj_is_proc(ctx, code->value)) {
+          grn_inspect_name(ctx, buffer, code->value);
+        } else {
+          grn_table_select_inspect_condition_argument(ctx, buffer, code->value);
+        }
+        GRN_TEXT_PUTC(ctx, buffer, '(');
+      } else if (code->value) {
+        if (i > si->start + 1) {
+          GRN_TEXT_PUTS(ctx, buffer, ", ");
+        }
+        grn_table_select_inspect_condition_argument(ctx, buffer, code->value);
+      }
+    }
+    GRN_TEXT_PUTC(ctx, buffer, ')');
+    break;
+  case GRN_OP_EQUAL :
+  case GRN_OP_NOT_EQUAL :
+  case GRN_OP_LESS :
+  case GRN_OP_GREATER :
+  case GRN_OP_LESS_EQUAL :
+  case GRN_OP_GREATER_EQUAL :
+  case GRN_OP_MATCH :
+    if (n_codes == 3) {
+      grn_expr_code *arg1 = expr->codes + si->start;
+      grn_expr_code *arg2 = expr->codes + si->start + 1;
+
+      if (arg1->value->header.type == GRN_EXPR) {
+        GRN_TEXT_PUTS(ctx, buffer, "(match columns)");
+      } else {
+        grn_table_select_inspect_condition_argument(ctx, buffer, arg1->value);
+      }
+      GRN_TEXT_PUTC(ctx, buffer, ' ');
+      GRN_TEXT_PUTS(ctx, buffer, grn_operator_to_string(last_operator));
+      GRN_TEXT_PUTC(ctx, buffer, ' ');
+      grn_table_select_inspect_condition_argument(ctx, buffer, arg2->value);
+    } else {
+      GRN_TEXT_PUTS(ctx, buffer, grn_operator_to_string(last_operator));
+      GRN_TEXT_PUTC(ctx, buffer, '(');
+      for (i = si->start; i < si->end; i++) {
+        grn_expr_code *code = expr->codes + i;
+        GRN_TEXT_PUTS(ctx, buffer, ", ");
+        if (code->value) {
+          grn_table_select_inspect_condition_argument(ctx, buffer, code->value);
+        } else {
+          GRN_TEXT_PUTS(ctx, buffer, grn_operator_to_string(code->op));
+        }
+      }
+      GRN_TEXT_PUTC(ctx, buffer, ')');
+    }
+    break;
+  default :
+    for (i = si->start; i <= si->end; i++) {
+      grn_expr_code *code = expr->codes + i;
+      if (i > si->start) {
+        GRN_TEXT_PUTC(ctx, buffer, ' ');
+      }
+      if (code->value) {
+        grn_table_select_inspect_condition_argument(ctx, buffer, code->value);
+      } else {
+        GRN_TEXT_PUTS(ctx, buffer, grn_operator_to_string(code->op));
+      }
+    }
+    break;
+  }
+
+  GRN_TEXT_PUTC(ctx, buffer, '\0');
+  return GRN_TEXT_VALUE(buffer);
+}
+
 grn_obj *
 grn_table_select(grn_ctx *ctx, grn_obj *table, grn_obj *expr,
                  grn_obj *res, grn_operator op)
@@ -6977,8 +7123,11 @@ grn_table_select(grn_ctx *ctx, grn_obj *table, grn_obj *expr,
       grn_expr_code *codes = e->codes;
       uint32_t codes_curr = e->codes_curr;
       grn_id min_id = GRN_ID_NIL;
+      grn_obj condition_inspect_buffer;
+
       v = grn_expr_get_var_by_offset(ctx, (grn_obj *)e, 0);
       GRN_PTR_INIT(&res_stack, GRN_OBJ_VECTOR, GRN_ID_NIL);
+      GRN_TEXT_INIT(&condition_inspect_buffer, 0);
       for (i = 0; i < scanner->n_sis; i++) {
         scan_info *si = scanner->sis[i];
         if (si->flags & SCAN_POP) {
@@ -7011,11 +7160,19 @@ grn_table_select(grn_ctx *ctx, grn_obj *table, grn_obj *expr,
             e->codes_curr = si->end - si->start + 1;
             grn_table_select_sequential(ctx, table, (grn_obj *)e, v,
                                         res, si->logical_op);
+            e->codes = codes;
+            e->codes_curr = codes_curr;
             min_id = GRN_ID_NIL;
           }
         }
         GRN_QUERY_LOG(ctx, GRN_QUERY_LOG_SIZE,
-                      ":", "filter(%d)", grn_table_size(ctx, res));
+                      ":", "filter(%d)%s",
+                      grn_table_size(ctx, res),
+                      grn_table_select_inspect_condition(
+                        ctx,
+                        &condition_inspect_buffer,
+                        si,
+                        e));
         if (ctx->rc) {
           if (res_created) {
             grn_obj_close(ctx, res);
@@ -7025,6 +7182,8 @@ grn_table_select(grn_ctx *ctx, grn_obj *table, grn_obj *expr,
         }
       }
 
+      GRN_OBJ_FIN(ctx, &condition_inspect_buffer);
+
       i = 0;
       if (!res_created) { i++; }
       for (; i < GRN_BULK_VSIZE(&res_stack) / sizeof(grn_obj *); i++) {
-------------- next part --------------
HTML����������������������������...
URL: https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20180215/abb79c98/attachment-0001.htm 



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