[Groonga-commit] groonga/groonga at 426d4bd [master] Optimize search by column only expression

Back to archive index

Kouhei Sutou null+****@clear*****
Fri Apr 8 16:25:07 JST 2016


Kouhei Sutou	2016-04-08 16:25:07 +0900 (Fri, 08 Apr 2016)

  New Revision: 426d4bda09cfbb4c6e8133677ccf7558d0ffd53e
  https://github.com/groonga/groonga/commit/426d4bda09cfbb4c6e8133677ccf7558d0ffd53e

  Message:
    Optimize search by column only expression

  Modified files:
    lib/expr.c

  Modified: lib/expr.c (+69 -0)
===================================================================
--- lib/expr.c    2016-04-08 16:11:12 +0900 (fb71a06)
+++ lib/expr.c    2016-04-08 16:25:07 +0900 (01fe9b0)
@@ -5035,6 +5035,13 @@ typedef union {
   struct {
     grn_obj *expr;
     grn_obj *variable;
+    grn_obj *column;
+    grn_obj value_buffer;
+    grn_obj score_buffer;
+  } value;
+  struct {
+    grn_obj *expr;
+    grn_obj *variable;
 #ifdef GRN_SUPPORT_REGEXP
     OnigRegex regex;
     grn_obj value_buffer;
@@ -5140,6 +5147,64 @@ grn_table_select_sequential_fin_constant(grn_ctx *ctx,
 {
 }
 
+static grn_bool
+grn_table_select_sequential_is_value(grn_ctx *ctx, grn_obj *expr)
+{
+  grn_expr *e = (grn_expr *)expr;
+  grn_expr_code *target;
+
+  if (e->codes_curr != 1) {
+    return GRN_FALSE;
+  }
+
+  target = &(e->codes[0]);
+
+  if (target->op != GRN_OP_GET_VALUE) {
+    return GRN_FALSE;
+  }
+  if (!target->value) {
+    return GRN_FALSE;
+  }
+
+  return GRN_TRUE;
+}
+
+static void
+grn_table_select_sequential_init_value(grn_ctx *ctx,
+                                       grn_table_select_sequential_data *data)
+{
+  grn_expr *e = (grn_expr *)(data->value.expr);
+
+  data->value.column = e->codes[0].value;
+  GRN_VOID_INIT(&(data->value.value_buffer));
+  GRN_INT32_INIT(&(data->value.score_buffer), 0);
+}
+
+static int32_t
+grn_table_select_sequential_exec_value(grn_ctx *ctx,
+                                       grn_id id,
+                                       grn_table_select_sequential_data *data)
+{
+  grn_obj *value_buffer = &(data->value.value_buffer);
+  grn_obj *score_buffer = &(data->value.score_buffer);
+  int32_t score;
+
+  GRN_BULK_REWIND(value_buffer);
+  grn_obj_get_value(ctx, data->value.column, id, value_buffer);
+  GRN_BULK_REWIND(score_buffer);
+  score = exec_result_to_score(ctx, value_buffer, score_buffer);
+
+  return score;
+}
+
+static void
+grn_table_select_sequential_fin_value(grn_ctx *ctx,
+                                      grn_table_select_sequential_data *data)
+{
+  GRN_OBJ_FIN(ctx, &(data->value.score_buffer));
+  GRN_OBJ_FIN(ctx, &(data->value.value_buffer));
+}
+
 #ifdef GRN_SUPPORT_REGEXP
 static grn_bool
 grn_table_select_sequential_is_simple_regexp(grn_ctx *ctx, grn_obj *expr)
@@ -5538,6 +5603,10 @@ grn_table_select_sequential(grn_ctx *ctx, grn_obj *table, grn_obj *expr,
     init = grn_table_select_sequential_init_constant;
     exec = grn_table_select_sequential_exec_constant;
     fin = grn_table_select_sequential_fin_constant;
+  } else if (grn_table_select_sequential_is_value(ctx, expr)) {
+    init = grn_table_select_sequential_init_value;
+    exec = grn_table_select_sequential_exec_value;
+    fin = grn_table_select_sequential_fin_value;
 #ifdef GRN_SUPPORT_REGEXP
   } else if (grn_table_select_sequential_is_simple_regexp(ctx, expr)) {
     init = grn_table_select_sequential_init_simple_regexp;
-------------- next part --------------
HTML����������������������������...
Télécharger 



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