morit****@razil*****
morit****@razil*****
2009年 8月 10日 (月) 08:05:45 JST
森です。 提案ありがとうございます。 (1)のような機能を追加することを検討していたので、 その方向で進めようと思います。 >>> Kouhei Sutou さんは書きました: > 須藤です。 > > grn_expr_create_from_str()は文字列でg式が作れて便利ですが、 > それに加えてgrn_expr_append_op()などで付加的な条件も指定でき > るともっと便利です。 > > 例えば、一週間以内に登録された文書の中から「groonga」または > 「Senna」にマッチする文書を探したい場合、groonga/Sennaを探す > 部分は"groonga OR senna"と文字列で書くと便利ですが、一週間以 > 内という部分はTime.now - 60 * 60 * 24 * 7とプログラムで書け > ると便利です。(Rubyでごめんなさい) > > ということで、 > > (1) 既存のgrn_exprに文字列で条件を追加できるgrn_expr_parse() > (2) grn_expr_create_from_str()で作成したgrn_exprを別の > grn_exprの中で実行するGRN_OP_EXPR_EXEC > > のどちらかがあると、上記を実現できそうな気がしています。 > > とりあえず、(1)用のパッチをつけます。 > (grn_expr_create_from_str()と重複している部分が多いので、本 > 当は共通化したいところです。) > > -- > 須藤 功平 <kou****@clear*****> > 株式会社クリアコード (http://www.clear-code.com/) > > diff --git a/groonga.h b/groonga.h > index e1fbb48..a567ed6 100644 > --- a/groonga.h > +++ b/groonga.h > @@ -1808,6 +1808,9 @@ GRN_API grn_obj *grn_expr_create_from_str(grn_ctx *ctx, > const char *name, unsigned name_size, > const char *str, unsigned str_size, > grn_obj *table, grn_obj *default_column); > +GRN_API grn_rc grn_expr_parse(grn_ctx *ctx, grn_obj *expression, > + const char *str, unsigned str_size, > + grn_obj *table, grn_obj *default_column); > > GRN_API grn_table_sort_key *grn_table_sort_key_from_str(grn_ctx *ctx, > const char *str, unsigned str_size, > diff --git a/lib/db.c b/lib/db.c > index 02bc179..d16aa17 100644 > --- a/lib/db.c > +++ b/lib/db.c > @@ -7510,6 +7510,40 @@ exit : > return efsi.e; > } > > +grn_rc > +grn_expr_parse(grn_ctx *ctx, grn_obj *expression, > + const char *str, unsigned str_size, > + grn_obj *table, grn_obj *default_column) > +{ > + efs_info efsi; > + GRN_TEXT_INIT(&efsi.buf, 0); > + efsi.e = expression; > + efsi.str = str; > + efsi.v = grn_expr_get_var_by_offset(ctx, efsi.e, 0); > + efsi.cur = str; > + efsi.str_end = str + str_size; > + efsi.table = table; > + efsi.default_column = default_column; > + efsi.default_op = GRN_OP_AND; > + efsi.escalation_threshold = GROONGA_DEFAULT_QUERY_ESCALATION_THRESHOLD; > + efsi.escalation_decaystep = DEFAULT_DECAYSTEP; > + efsi.weight_offset = 0; > + efsi.opt.weight_vector = NULL; > + efsi.weight_set = NULL; > + get_pragma(ctx, &efsi); > + if (get_expr(ctx, &efsi, default_column, GRN_OP_MATCH)) { > + goto exit; > + } > + grn_expr_compile(ctx, efsi.e); > + efsi.opt.vector_size = DEFAULT_WEIGHT_VECTOR_SIZE; > + efsi.opt.func = efsi.weight_set ? section_weight_cb : NULL; > + efsi.opt.func_arg = efsi.weight_set; > + efsi.snip_conds = NULL; > +exit : > + GRN_OBJ_FIN(ctx, &efsi.buf); > + return ctx->rc; > +} > + > grn_table_sort_key * > grn_table_sort_key_from_str(grn_ctx *ctx, const char *str, unsigned str_size, > grn_obj *table, unsigned *nkeys) > > _______________________________________________ > groonga-dev mailing list > groon****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/groonga-dev > -- morita