[Groonga-commit] groonga/groonga at c56b683 [master] mrb: support appending to expression

Back to archive index

Kouhei Sutou null+****@clear*****
Wed Feb 4 18:29:59 JST 2015


Kouhei Sutou	2015-02-04 18:29:59 +0900 (Wed, 04 Feb 2015)

  New Revision: c56b68368c17571ec8b7b4b35b9437f3ca3e8372
  https://github.com/groonga/groonga/commit/c56b68368c17571ec8b7b4b35b9437f3ca3e8372

  Message:
    mrb: support appending to expression

  Modified files:
    lib/mrb/mrb_expr.c

  Modified: lib/mrb/mrb_expr.c (+138 -0)
===================================================================
--- lib/mrb/mrb_expr.c    2015-02-04 18:25:07 +0900 (d0e8f02)
+++ lib/mrb/mrb_expr.c    2015-02-04 18:29:59 +0900 (bb048bf)
@@ -478,6 +478,137 @@ mrb_grn_expression_parse(mrb_state *mrb, mrb_value self)
   return mrb_nil_value();
 }
 
+static mrb_value
+mrb_grn_expression_append_object(mrb_state *mrb, mrb_value self)
+{
+  grn_ctx *ctx = (grn_ctx *)mrb->ud;
+  grn_obj *expr;
+  mrb_value mrb_object;
+  grn_obj *object;
+  grn_operator op;
+  int n_args;
+
+  expr = DATA_PTR(self);
+  mrb_get_args(mrb, "oii", &mrb_object, &op, &n_args);
+
+  object = DATA_PTR(mrb_object);
+  grn_expr_append_obj(ctx, expr, object, op, n_args);
+  grn_mrb_ctx_check(mrb);
+
+  return mrb_nil_value();
+}
+
+static mrb_value
+mrb_grn_expression_append_constant(mrb_state *mrb, mrb_value self)
+{
+  grn_ctx *ctx = (grn_ctx *)mrb->ud;
+  grn_obj *expr;
+  mrb_value mrb_constant;
+  grn_operator op;
+  int n_args;
+
+  expr = DATA_PTR(self);
+  mrb_get_args(mrb, "oii", &mrb_constant, &op, &n_args);
+
+  switch (mrb_type(mrb_constant)) {
+  case MRB_TT_FALSE :
+    if (mrb_nil_p(mrb_constant)) {
+      grn_obj constant;
+      GRN_VOID_INIT(&constant);
+      grn_expr_append_const(ctx, expr, &constant, op, n_args);
+      GRN_OBJ_FIN(ctx, &constant);
+    } else {
+      grn_obj constant;
+      GRN_BOOL_INIT(&constant, 0);
+      GRN_BOOL_SET(ctx, &constant, GRN_FALSE);
+      grn_expr_append_const(ctx, expr, &constant, op, n_args);
+      GRN_OBJ_FIN(ctx, &constant);
+    }
+    break;
+  case MRB_TT_TRUE :
+    {
+      grn_obj constant;
+      GRN_BOOL_INIT(&constant, 0);
+      GRN_BOOL_SET(ctx, &constant, GRN_TRUE);
+      grn_expr_append_const(ctx, expr, &constant, op, n_args);
+      GRN_OBJ_FIN(ctx, &constant);
+    }
+    break;
+  case MRB_TT_FIXNUM :
+    grn_expr_append_const_int(ctx, expr, mrb_fixnum(mrb_constant), op, n_args);
+    break;
+  case MRB_TT_SYMBOL :
+    {
+      const char *value;
+      mrb_int value_length;
+
+      value = mrb_sym2name_len(mrb, mrb_symbol(mrb_constant), &value_length);
+      grn_expr_append_const_str(ctx, expr, value, value_length, op, n_args);
+    }
+    break;
+  case MRB_TT_FLOAT :
+    {
+      grn_obj constant;
+      GRN_FLOAT_INIT(&constant, 0);
+      GRN_FLOAT_SET(ctx, &constant, mrb_float(mrb_constant));
+      grn_expr_append_const(ctx, expr, &constant, op, n_args);
+      GRN_OBJ_FIN(ctx, &constant);
+    }
+    break;
+  case MRB_TT_STRING :
+    grn_expr_append_const_str(ctx, expr,
+                              RSTRING_PTR(mrb_constant),
+                              RSTRING_LEN(mrb_constant),
+                              op, n_args);
+    break;
+  default :
+    {
+      struct RClass *klass;
+
+      klass = mrb_class(mrb, mrb_constant);
+      if (klass == ctx->impl->mrb.builtin.time_class) {
+        grn_obj constant;
+        mrb_value mrb_sec;
+        mrb_value mrb_usec;
+
+        mrb_sec = mrb_funcall(mrb, mrb_constant, "to_i", 0);
+        mrb_usec = mrb_funcall(mrb, mrb_constant, "usec", 0);
+        GRN_TIME_INIT(&constant, 0);
+        GRN_TIME_SET(ctx, &constant,
+                     GRN_TIME_PACK(mrb_fixnum(mrb_sec), mrb_fixnum(mrb_usec)));
+        grn_expr_append_const(ctx, expr, &constant, op, n_args);
+        GRN_OBJ_FIN(ctx, &constant);
+      } else {
+        mrb_raisef(mrb, E_ARGUMENT_ERROR,
+                   "unsupported constant to append to expression: %S",
+                   mrb_constant);
+      }
+    }
+    break;
+  }
+
+  grn_mrb_ctx_check(mrb);
+
+  return mrb_nil_value();
+}
+
+static mrb_value
+mrb_grn_expression_append_operator(mrb_state *mrb, mrb_value self)
+{
+  grn_ctx *ctx = (grn_ctx *)mrb->ud;
+  grn_obj *expr;
+  grn_operator op;
+  int n_args;
+
+  expr = DATA_PTR(self);
+  mrb_get_args(mrb, "ii", &op, &n_args);
+
+  grn_expr_append_op(ctx, expr, op, n_args);
+  grn_mrb_ctx_check(mrb);
+
+  return mrb_nil_value();
+}
+
 void
 grn_mrb_expr_init(grn_ctx *ctx)
 {
@@ -556,6 +687,13 @@ grn_mrb_expr_init(grn_ctx *ctx)
   mrb_define_method(mrb, klass, "parse",
                     mrb_grn_expression_parse, MRB_ARGS_ARG(1, 1));
 
+  mrb_define_method(mrb, klass, "append_object",
+                    mrb_grn_expression_append_object, MRB_ARGS_REQ(2));
+  mrb_define_method(mrb, klass, "append_constant",
+                    mrb_grn_expression_append_constant, MRB_ARGS_REQ(3));
+  mrb_define_method(mrb, klass, "append_operator",
+                    mrb_grn_expression_append_operator, MRB_ARGS_REQ(2));
+
   grn_mrb_load(ctx, "expression.rb");
   grn_mrb_load(ctx, "scan_info.rb");
   grn_mrb_load(ctx, "scan_info_data.rb");
-------------- next part --------------
HTML����������������������������...
Download 



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