[Groonga-commit] groonga/groonga at 96f257c [master] expr: dynamically expand scan_info->args

Back to archive index

Susumu Yata null+****@clear*****
Fri Nov 17 11:48:11 JST 2017


Susumu Yata	2017-11-17 11:48:11 +0900 (Fri, 17 Nov 2017)

  New Revision: 96f257c176c47b265813fc13a444105a881bec7a
  https://github.com/groonga/groonga/commit/96f257c176c47b265813fc13a444105a881bec7a

  Message:
    expr: dynamically expand scan_info->args
    
    This commit enables in_values using an index with more than 126 values
    
    GitHub: fix #760

  Modified files:
    lib/expr.c
    lib/grn_expr.h
    lib/mrb/mrb_expr.c

  Modified: lib/expr.c (+40 -23)
===================================================================
--- lib/expr.c    2017-11-17 11:20:46 +0900 (8300f4567)
+++ lib/expr.c    2017-11-17 11:48:11 +0900 (810ac5a35)
@@ -3890,7 +3890,7 @@ grn_expr_get_value(grn_ctx *ctx, grn_obj *expr, int offset)
 #define DEFAULT_TERM_EXTRACT_POLICY 0
 #define DEFAULT_WEIGHT_VECTOR_SIZE 4096
 
-#define GRN_SCAN_INFO_MAX_N_ARGS 128
+#define GRN_SCAN_INFO_INITIAL_MAX_N_ARGS 16
 
 struct _grn_scan_info {
   uint32_t start;
@@ -3902,7 +3902,8 @@ struct _grn_scan_info {
   grn_obj wv;
   grn_obj index;
   grn_obj *query;
-  grn_obj *args[GRN_SCAN_INFO_MAX_N_ARGS];
+  grn_obj **args;
+  grn_obj *initial_args[GRN_SCAN_INFO_INITIAL_MAX_N_ARGS];
   int max_interval;
   int similarity_threshold;
   grn_obj scorers;
@@ -3912,6 +3913,7 @@ struct _grn_scan_info {
     grn_bool specified;
     int start;
   } position;
+  int32_t max_nargs;
 };
 
 #define SI_FREE(si) do {\
@@ -3920,6 +3922,9 @@ struct _grn_scan_info {
   GRN_OBJ_FIN(ctx, &(si)->scorers);\
   GRN_OBJ_FIN(ctx, &(si)->scorer_args_exprs);\
   GRN_OBJ_FIN(ctx, &(si)->scorer_args_expr_offsets);\
+  if ((si)->args != (si)->initial_args) {\
+    GRN_FREE((si)->args);\
+  }\
   GRN_FREE(si);\
 } while (0)
 
@@ -3930,6 +3935,8 @@ struct _grn_scan_info {
     (si)->logical_op = GRN_OP_OR;\
     (si)->flags = SCAN_PUSH;\
     (si)->nargs = 0;\
+    (si)->max_nargs = GRN_SCAN_INFO_INITIAL_MAX_N_ARGS;\
+    (si)->args = (si)->initial_args;\
     (si)->max_interval = DEFAULT_MAX_INTERVAL;\
     (si)->similarity_threshold = DEFAULT_SIMILARITY_THRESHOLD;\
     (si)->start = (st);\
@@ -4249,6 +4256,8 @@ grn_scan_info_open(grn_ctx *ctx, int start)
   si->logical_op = GRN_OP_OR;
   si->flags = SCAN_PUSH;
   si->nargs = 0;
+  si->max_nargs = GRN_SCAN_INFO_INITIAL_MAX_N_ARGS;
+  si->args = si->initial_args;
   si->max_interval = DEFAULT_MAX_INTERVAL;
   si->similarity_threshold = DEFAULT_SIMILARITY_THRESHOLD;
   si->start = start;
@@ -4366,10 +4375,24 @@ grn_scan_info_set_similarity_threshold(scan_info *si, int similarity_threshold)
 }
 
 grn_bool
-grn_scan_info_push_arg(scan_info *si, grn_obj *arg)
-{
-  if (si->nargs >= GRN_SCAN_INFO_MAX_N_ARGS) {
-    return GRN_FALSE;
+grn_scan_info_push_arg(grn_ctx *ctx, scan_info *si, grn_obj *arg)
+{
+  if (si->nargs >= si->max_nargs) {
+    grn_obj **args;
+    int32_t max_nargs = si->max_nargs * 2;
+    if (si->args == si->initial_args) {
+      args = GRN_MALLOCN(grn_obj *, max_nargs);
+      if (args == NULL) {
+        return GRN_FALSE;
+      }
+    } else {
+      args = (grn_obj **)GRN_REALLOC(si->args, sizeof(grn_obj *) * max_nargs);
+      if (args == NULL) {
+        return GRN_FALSE;
+      }
+    }
+    si->args = args;
+    si->max_nargs = max_nargs;
   }
 
   si->args[si->nargs++] = arg;
@@ -4803,8 +4826,8 @@ grn_scan_info_build_full_not(grn_ctx *ctx,
           return GRN_FALSE;
         }
         all_records_si->op = GRN_OP_CALL;
-        all_records_si->args[all_records_si->nargs++] =
-          grn_ctx_get(ctx, "all_records", -1);
+        grn_scan_info_push_arg(ctx, all_records_si,
+                               grn_ctx_get(ctx, "all_records", -1));
         last_si->logical_op = GRN_OP_AND_NOT;
         last_si->flags &= ~SCAN_PUSH;
         sis[*i] = sis[*i - 1];
@@ -4840,8 +4863,8 @@ grn_scan_info_build_full_not(grn_ctx *ctx,
             return GRN_FALSE;
           }
           all_records_si->op = GRN_OP_CALL;
-          all_records_si->args[all_records_si->nargs++] =
-            grn_ctx_get(ctx, "all_records", -1);
+          grn_scan_info_push_arg(ctx, all_records_si,
+                                 grn_ctx_get(ctx, "all_records", -1));
           sis[*i] = sis[*i - 1];
           sis[*i - 1] = all_records_si;
           (*i)++;
@@ -5081,9 +5104,7 @@ grn_scan_info_build_full(grn_ctx *ctx, grn_obj *expr, int *n,
       if (c->value == var) {
         stat = SCAN_VAR;
       } else {
-        if (si->nargs < GRN_SCAN_INFO_MAX_N_ARGS) {
-          si->args[si->nargs++] = c->value;
-        }
+        grn_scan_info_push_arg(ctx, si, c->value);
         if (stat == SCAN_START) { si->flags |= SCAN_PRE_CONST; }
         stat = SCAN_CONST;
       }
@@ -5117,9 +5138,7 @@ grn_scan_info_build_full(grn_ctx *ctx, grn_obj *expr, int *n,
       case SCAN_CONST :
       case SCAN_VAR :
         stat = SCAN_COL1;
-        if (si->nargs < GRN_SCAN_INFO_MAX_N_ARGS) {
-          si->args[si->nargs++] = c->value;
-        }
+        grn_scan_info_push_arg(ctx, si, c->value);
         break;
       case SCAN_COL1 :
         {
@@ -5203,9 +5222,7 @@ grn_scan_info_build_full(grn_ctx *ctx, grn_obj *expr, int *n,
       case SCAN_START :
         if (!si) { SI_ALLOC(si, i, c - e->codes); }
         stat = SCAN_COL1;
-        if (si->nargs < GRN_SCAN_INFO_MAX_N_ARGS) {
-          si->args[si->nargs++] = c->value;
-        }
+        grn_scan_info_push_arg(ctx, si, c->value);
         break;
       default :
         break;
@@ -5397,8 +5414,8 @@ grn_scan_info_build_simple_operation(grn_ctx *ctx,
   si = sis[0];
   si->end = 2;
   si->op = operator->op;
-  si->args[si->nargs++] = target->value;
-  si->args[si->nargs++] = constant->value;
+  grn_scan_info_push_arg(ctx, si, target->value);
+  grn_scan_info_push_arg(ctx, si, constant->value);
   {
     int32_t weight = 0;
     if (operator->value && operator->value->header.domain == GRN_DB_INT32) {
@@ -5500,8 +5517,8 @@ grn_scan_info_build_simple_and_operations(grn_ctx *ctx,
     if (!si) {
       goto exit;
     }
-    si->args[si->nargs++] = target->value;
-    si->args[si->nargs++] = constant->value;
+    grn_scan_info_push_arg(ctx, si, target->value);
+    grn_scan_info_push_arg(ctx, si, constant->value);
     si->op = operator->op;
     si->end = i + 2;
     si->flags &= ~SCAN_PUSH;

  Modified: lib/grn_expr.h (+1 -1)
===================================================================
--- lib/grn_expr.h    2017-11-17 11:20:46 +0900 (c20821f99)
+++ lib/grn_expr.h    2017-11-17 11:48:11 +0900 (6e0edbac2)
@@ -66,7 +66,7 @@ int grn_scan_info_get_max_interval(scan_info *si);
 void grn_scan_info_set_max_interval(scan_info *si, int max_interval);
 int grn_scan_info_get_similarity_threshold(scan_info *si);
 void grn_scan_info_set_similarity_threshold(scan_info *si, int similarity_threshold);
-grn_bool grn_scan_info_push_arg(scan_info *si, grn_obj *arg);
+grn_bool grn_scan_info_push_arg(grn_ctx *ctx, scan_info *si, grn_obj *arg);
 grn_obj *grn_scan_info_get_arg(grn_ctx *ctx, scan_info *si, int i);
 int grn_scan_info_get_start_position(scan_info *si);
 void grn_scan_info_set_start_position(scan_info *si, int start);

  Modified: lib/mrb/mrb_expr.c (+2 -1)
===================================================================
--- lib/mrb/mrb_expr.c    2017-11-17 11:20:46 +0900 (47ef3b5b1)
+++ lib/mrb/mrb_expr.c    2017-11-17 11:48:11 +0900 (91d69fd1d)
@@ -300,6 +300,7 @@ mrb_grn_scan_info_get_arg(mrb_state *mrb, mrb_value self)
 static mrb_value
 mrb_grn_scan_info_push_arg(mrb_state *mrb, mrb_value self)
 {
+  grn_ctx *ctx = (grn_ctx *)mrb->ud;
   scan_info *si;
   mrb_value mrb_arg;
   grn_bool success;
@@ -307,7 +308,7 @@ mrb_grn_scan_info_push_arg(mrb_state *mrb, mrb_value self)
   mrb_get_args(mrb, "o", &mrb_arg);
 
   si = DATA_PTR(self);
-  success = grn_scan_info_push_arg(si, DATA_PTR(mrb_arg));
+  success = grn_scan_info_push_arg(ctx, si, DATA_PTR(mrb_arg));
 
   return mrb_bool_value(success);
 }
-------------- next part --------------
HTML����������������������������...
URL: https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20171117/c609f185/attachment-0001.htm 



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