[Groonga-commit] groonga/groonga at c063f97 [master] grn_ts: support comparison operators in grn_ts_expr_evaluate()

Back to archive index

susumu.yata null+****@clear*****
Thu Sep 10 11:07:34 JST 2015


susumu.yata	2015-09-10 11:07:34 +0900 (Thu, 10 Sep 2015)

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

  Message:
    grn_ts: support comparison operators in grn_ts_expr_evaluate()
    
    GitHub: #386

  Modified files:
    lib/ts.c

  Modified: lib/ts.c (+77 -0)
===================================================================
--- lib/ts.c    2015-09-10 09:50:09 +0900 (b2bb3bc)
+++ lib/ts.c    2015-09-10 11:07:34 +0900 (de0a8bd)
@@ -2597,6 +2597,71 @@ grn_ts_op_not_equal_evaluate(grn_ctx *ctx, grn_ts_expr_op_node *node,
 #undef GRN_TS_OP_NOT_EQUAL_EVALUATE_VECTOR_CASE_BLOCK
 #undef GRN_TS_OP_NOT_EQUAL_EVALUATE_CASE_BLOCK
 
+
+#define GRN_TS_OP_CMP_EVALUATE_CASE_BLOCK(type, KIND, kind)\
+  case GRN_TS_ ## KIND: {\
+    grn_ts_ ## kind *buf_ptrs[] = {\
+      (grn_ts_ ## kind *)node->bufs[0].ptr,\
+      (grn_ts_ ## kind *)node->bufs[1].ptr\
+    };\
+    for (i = 0; i < n_in; i++) {\
+      out_ptr[i] = grn_ts_op_ ## type ## _ ## kind(buf_ptrs[0][i],\
+                                                   buf_ptrs[1][i]);\
+    }\
+    return GRN_SUCCESS;\
+  }
+#define GRN_TS_OP_CMP_EVALUATE(TYPE, type)\
+  size_t i;\
+  grn_rc rc;\
+  grn_ts_bool *out_ptr = (grn_ts_bool *)out;\
+  for (i = 0; i < 2; i++) {\
+    rc = grn_ts_expr_node_evaluate_to_buf(ctx, node->args[i], in, n_in,\
+                                          &node->bufs[i]);\
+    if (rc != GRN_SUCCESS) {\
+      return rc;\
+    }\
+  }\
+  switch (node->args[0]->data_kind) {\
+    GRN_TS_OP_CMP_EVALUATE_CASE_BLOCK(type, INT, int)\
+    GRN_TS_OP_CMP_EVALUATE_CASE_BLOCK(type, FLOAT, float)\
+    GRN_TS_OP_CMP_EVALUATE_CASE_BLOCK(type, TIME, time)\
+    GRN_TS_OP_CMP_EVALUATE_CASE_BLOCK(type, TEXT, text)\
+    default: {\
+      return GRN_INVALID_ARGUMENT;\
+    }\
+  }
+/* grn_ts_op_less_evaluate() evaluates an operator. */
+static grn_rc
+grn_ts_op_less_evaluate(grn_ctx *ctx, grn_ts_expr_op_node *node,
+                        const grn_ts_record *in, size_t n_in, void *out) {
+  GRN_TS_OP_CMP_EVALUATE(LESS, less)
+}
+
+/* grn_ts_op_less_equal_evaluate() evaluates an operator. */
+static grn_rc
+grn_ts_op_less_equal_evaluate(grn_ctx *ctx, grn_ts_expr_op_node *node,
+                              const grn_ts_record *in, size_t n_in,
+                              void *out) {
+  GRN_TS_OP_CMP_EVALUATE(LESS_EQUAL, less_equal)
+}
+
+/* grn_ts_op_greater_evaluate() evaluates an operator. */
+static grn_rc
+grn_ts_op_greater_evaluate(grn_ctx *ctx, grn_ts_expr_op_node *node,
+                           const grn_ts_record *in, size_t n_in, void *out) {
+  GRN_TS_OP_CMP_EVALUATE(GREATER, greater)
+}
+
+/* grn_ts_op_greater_equal_evaluate() evaluates an operator. */
+static grn_rc
+grn_ts_op_greater_equal_evaluate(grn_ctx *ctx, grn_ts_expr_op_node *node,
+                                 const grn_ts_record *in, size_t n_in,
+                                 void *out) {
+  GRN_TS_OP_CMP_EVALUATE(GREATER_EQUAL, greater_equal)
+}
+#undef GRN_TS_OP_CMP_EVALUATE
+#undef GRN_TS_OP_CMP_EVALUATE_CASE_BLOCK
+
 /* grn_ts_expr_op_node_evaluate() evaluates an operator. */
 static grn_rc
 grn_ts_expr_op_node_evaluate(grn_ctx *ctx, grn_ts_expr_op_node *node,
@@ -2618,6 +2683,18 @@ grn_ts_expr_op_node_evaluate(grn_ctx *ctx, grn_ts_expr_op_node *node,
     case GRN_TS_OP_NOT_EQUAL: {
       return grn_ts_op_not_equal_evaluate(ctx, node, in, n_in, out);
     }
+    case GRN_TS_OP_LESS: {
+      return grn_ts_op_less_evaluate(ctx, node, in, n_in, out);
+    }
+    case GRN_TS_OP_LESS_EQUAL: {
+      return grn_ts_op_less_equal_evaluate(ctx, node, in, n_in, out);
+    }
+    case GRN_TS_OP_GREATER: {
+      return grn_ts_op_greater_evaluate(ctx, node, in, n_in, out);
+    }
+    case GRN_TS_OP_GREATER_EQUAL: {
+      return grn_ts_op_greater_equal_evaluate(ctx, node, in, n_in, out);
+    }
     // TODO
     default: {
       return GRN_OPERATION_NOT_SUPPORTED;
-------------- next part --------------
HTML����������������������������...
Download 



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