[Groonga-commit] groonga/groonga at 9b35b94 [master] Support adding conditions to existing grn_snip from grn_expr

Back to archive index

Kouhei Sutou null+****@clear*****
Tue Jan 21 11:28:19 JST 2014


Kouhei Sutou	2014-01-21 11:28:19 +0900 (Tue, 21 Jan 2014)

  New Revision: 9b35b94f05ea0e83d760f55267e67495674dcdd6
  https://github.com/groonga/groonga/commit/9b35b94f05ea0e83d760f55267e67495674dcdd6

  Message:
    Support adding conditions to existing grn_snip from grn_expr
    
    New function:
    
      * grn_expr_snip_add_conditions()

  Modified files:
    include/groonga.h
    lib/expr.c

  Modified: include/groonga.h (+8 -0)
===================================================================
--- include/groonga.h    2014-01-21 11:17:01 +0900 (200690a)
+++ include/groonga.h    2014-01-21 11:28:19 +0900 (ce956ab)
@@ -1715,6 +1715,14 @@ GRN_API grn_snip *grn_expr_snip(grn_ctx *ctx, grn_obj *expr, int flags,
                                 const char **opentags, unsigned int *opentag_lens,
                                 const char **closetags, unsigned int *closetag_lens,
                                 grn_snip_mapping *mapping);
+GRN_API grn_rc grn_expr_snip_add_conditions(grn_ctx *ctx,
+                                            grn_obj *expr,
+                                            grn_snip *snip,
+                                            unsigned int n_tags,
+                                            const char **opentags,
+                                            unsigned int *opentag_lens,
+                                            const char **closetags,
+                                            unsigned int *closetag_lens);
 
 GRN_API grn_table_sort_key *grn_table_sort_key_from_str(grn_ctx *ctx,
                                                         const char *str, unsigned int str_size,

  Modified: lib/expr.c (+68 -54)
===================================================================
--- lib/expr.c    2014-01-21 11:17:01 +0900 (78e7653)
+++ lib/expr.c    2014-01-21 11:28:19 +0900 (5de60f7)
@@ -1,6 +1,6 @@
 /* -*- c-basic-offset: 2 -*- */
 /*
-  Copyright(C) 2010-2013 Brazil
+  Copyright(C) 2010-2014 Brazil
 
   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
@@ -6468,73 +6468,87 @@ grn_expr_parser_close(grn_ctx *ctx)
   return ctx->rc;
 }
 
-grn_snip *
-grn_expr_snip(grn_ctx *ctx, grn_obj *expr, int flags,
-              unsigned int width, unsigned int max_results,
-              unsigned int n_tags,
-              const char **opentags, unsigned int *opentag_lens,
-              const char **closetags, unsigned int *closetag_lens,
-              grn_snip_mapping *mapping)
+grn_rc
+grn_expr_snip_add_conditions(grn_ctx *ctx, grn_obj *expr, grn_snip *snip,
+                             unsigned int n_tags,
+                             const char **opentags, unsigned int *opentag_lens,
+                             const char **closetags, unsigned int *closetag_lens)
 {
   int i, n;
   scan_info **sis, *si;
-  grn_snip *res = NULL;
   GRN_API_ENTER;
   if ((sis = scan_info_build(ctx, expr, &n, GRN_OP_OR, 0))) {
-    if ((res = grn_snip_open(ctx, flags, width, max_results,
-                           NULL, 0, NULL, 0, mapping))) {
-      int butp = 0, nparens = 0, npbut = 0;
-      grn_obj but_stack;
-      grn_obj snip_stack;
-      GRN_UINT32_INIT(&but_stack, GRN_OBJ_VECTOR);
-      GRN_PTR_INIT(&snip_stack, GRN_OBJ_VECTOR, GRN_ID_NIL);
-      for (i = n; i--;) {
-        si = sis[i];
-        if (si->flags & SCAN_POP) {
-          nparens++;
-          if (si->logical_op == GRN_OP_AND_NOT) {
-            GRN_UINT32_PUT(ctx, &but_stack, npbut);
-            npbut = nparens;
-            butp = 1 - butp;
-          }
-        } else {
-          if (si->op == GRN_OP_MATCH && si->query) {
-            if (butp == (si->logical_op == GRN_OP_AND_NOT)) {
-              GRN_PTR_PUT(ctx, &snip_stack, si->query);
-            }
+    int butp = 0, nparens = 0, npbut = 0;
+    grn_obj but_stack;
+    grn_obj snip_stack;
+    GRN_UINT32_INIT(&but_stack, GRN_OBJ_VECTOR);
+    GRN_PTR_INIT(&snip_stack, GRN_OBJ_VECTOR, GRN_ID_NIL);
+    for (i = n; i--;) {
+      si = sis[i];
+      if (si->flags & SCAN_POP) {
+        nparens++;
+        if (si->logical_op == GRN_OP_AND_NOT) {
+          GRN_UINT32_PUT(ctx, &but_stack, npbut);
+          npbut = nparens;
+          butp = 1 - butp;
+        }
+      } else {
+        if (si->op == GRN_OP_MATCH && si->query) {
+          if (butp == (si->logical_op == GRN_OP_AND_NOT)) {
+            GRN_PTR_PUT(ctx, &snip_stack, si->query);
           }
-          if (si->flags & SCAN_PUSH) {
-            if (nparens == npbut) {
-              butp = 1 - butp;
-              GRN_UINT32_POP(&but_stack, npbut);
-            }
-            nparens--;
+        }
+        if (si->flags & SCAN_PUSH) {
+          if (nparens == npbut) {
+            butp = 1 - butp;
+            GRN_UINT32_POP(&but_stack, npbut);
           }
+          nparens--;
         }
       }
-      if (n_tags) {
-        for (i = 0;; i = (i + 1) % n_tags) {
-          grn_obj *q;
-          GRN_PTR_POP(&snip_stack, q);
-          if (!q) { break; }
-          grn_snip_add_cond(ctx, res, GRN_TEXT_VALUE(q), GRN_TEXT_LEN(q),
-                            opentags[i], opentag_lens[i], closetags[i], closetag_lens[i]);
-        }
-      } else {
-        for (;;) {
-          grn_obj *q;
-          GRN_PTR_POP(&snip_stack, q);
-          if (!q) { break; }
-          grn_snip_add_cond(ctx, res, GRN_TEXT_VALUE(q), GRN_TEXT_LEN(q),
-                            NULL, 0, NULL, 0);
-        }
+    }
+    if (n_tags) {
+      for (i = 0;; i = (i + 1) % n_tags) {
+        grn_obj *q;
+        GRN_PTR_POP(&snip_stack, q);
+        if (!q) { break; }
+        grn_snip_add_cond(ctx, snip, GRN_TEXT_VALUE(q), GRN_TEXT_LEN(q),
+                          opentags[i], opentag_lens[i], closetags[i], closetag_lens[i]);
+      }
+    } else {
+      for (;;) {
+        grn_obj *q;
+        GRN_PTR_POP(&snip_stack, q);
+        if (!q) { break; }
+        grn_snip_add_cond(ctx, snip, GRN_TEXT_VALUE(q), GRN_TEXT_LEN(q),
+                          NULL, 0, NULL, 0);
       }
-      GRN_OBJ_FIN(ctx, &but_stack);
-      GRN_OBJ_FIN(ctx, &snip_stack);
     }
+    GRN_OBJ_FIN(ctx, &but_stack);
+    GRN_OBJ_FIN(ctx, &snip_stack);
     for (i = n; i--;) { SI_FREE(sis[i]); }
     GRN_FREE(sis);
   }
+  GRN_API_RETURN(GRN_SUCCESS);
+}
+
+grn_snip *
+grn_expr_snip(grn_ctx *ctx, grn_obj *expr, int flags,
+              unsigned int width, unsigned int max_results,
+              unsigned int n_tags,
+              const char **opentags, unsigned int *opentag_lens,
+              const char **closetags, unsigned int *closetag_lens,
+              grn_snip_mapping *mapping)
+{
+  grn_snip *res = NULL;
+  GRN_API_ENTER;
+  if ((res = grn_snip_open(ctx, flags, width, max_results,
+                           NULL, 0, NULL, 0, mapping))) {
+    grn_expr_snip_add_conditions(ctx, expr, res,
+                                 n_tags,
+                                 opentags, opentag_lens,
+                                 closetags, closetag_lens);
+  }
   GRN_API_RETURN(res);
 }
 
-------------- next part --------------
HTML����������������������������...
Download 



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