[Groonga-commit] groonga/groonga at 04da242 [master] Reduce copy & paste code

Back to archive index

Kouhei Sutou null+****@clear*****
Sun Aug 10 12:15:25 JST 2014


Kouhei Sutou	2014-08-10 12:15:25 +0900 (Sun, 10 Aug 2014)

  New Revision: 04da24292344c159760859709af8164c145383b9
  https://github.com/groonga/groonga/commit/04da24292344c159760859709af8164c145383b9

  Message:
    Reduce copy & paste code
    
    Use grn_expr_get_keywords() in grn_expr_snip_add_conditions().

  Modified files:
    lib/expr.c

  Modified: lib/expr.c (+31 -51)
===================================================================
--- lib/expr.c    2014-08-10 12:08:34 +0900 (be0cd3c)
+++ lib/expr.c    2014-08-10 12:15:25 +0900 (6801087)
@@ -6864,61 +6864,41 @@ grn_expr_snip_add_conditions(grn_ctx *ctx, grn_obj *expr, grn_obj *snip,
                              const char **opentags, unsigned int *opentag_lens,
                              const char **closetags, unsigned int *closetag_lens)
 {
-  int i, n;
-  scan_info **sis, *si;
+  grn_rc rc;
+  grn_obj keywords;
+
   GRN_API_ENTER;
-  if ((sis = scan_info_build(ctx, expr, &n, GRN_OP_OR, 0))) {
-    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--;
-        }
-      }
+
+  GRN_PTR_INIT(&keywords, GRN_OBJ_VECTOR, GRN_ID_NIL);
+  rc = grn_expr_get_keywords(ctx, expr, &keywords);
+  if (rc != GRN_SUCCESS) {
+    GRN_OBJ_FIN(ctx, &keywords);
+    GRN_API_RETURN(rc);
+  }
+
+  if (n_tags) {
+    int i;
+    for (i = 0;; i = (i + 1) % n_tags) {
+      grn_obj *keyword;
+      GRN_PTR_POP(&keywords, keyword);
+      if (!keyword) { break; }
+      grn_snip_add_cond(ctx, snip,
+                        GRN_TEXT_VALUE(keyword), GRN_TEXT_LEN(keyword),
+                        opentags[i], opentag_lens[i],
+                        closetags[i], closetag_lens[i]);
     }
-    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);
-      }
+  } else {
+    for (;;) {
+      grn_obj *keyword;
+      GRN_PTR_POP(&keywords, keyword);
+      if (!keyword) { break; }
+      grn_snip_add_cond(ctx, snip,
+                        GRN_TEXT_VALUE(keyword), GRN_TEXT_LEN(keyword),
+                        NULL, 0, NULL, 0);
     }
-    GRN_OBJ_FIN(ctx, &but_stack);
-    GRN_OBJ_FIN(ctx, &snip_stack);
-    for (i = n; i--;) { SI_FREE(sis[i]); }
-    GRN_FREE(sis);
   }
+  GRN_OBJ_FIN(ctx, &keywords);
+
   GRN_API_RETURN(GRN_SUCCESS);
 }
 
-------------- next part --------------
HTML����������������������������...
Download 



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