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