1/* -*- c-basic-offset: 2 -*- */
2/*
3 Copyright(C) 2014-2015 Brazil
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License version 2.1 as published by the Free Software Foundation.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public
15 License along with this library; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17*/
18
19#include "../grn_ctx_impl.h"
20
21#ifdef GRN_WITH_MRUBY
22#include <mruby.h>
23
24#include "mrb_operator.h"
25
26mrb_value
27grn_mrb_value_from_operator(mrb_state *mrb, grn_operator op)
28{
29 grn_ctx *ctx = (grn_ctx *)(mrb->ud);
30 grn_mrb_data *data = &(ctx->impl->mrb);
31 mrb_value mrb_op_raw;
32 mrb_value mrb_op;
33
34 mrb_op_raw = mrb_fixnum_value(op);
35 mrb_op = mrb_funcall(mrb, mrb_obj_value(data->groonga.operator_class),
36 "find", 1, mrb_op_raw);
37 if (mrb_nil_p(mrb_op)) {
38 return mrb_op_raw;
39 } else {
40 return mrb_op;
41 }
42}
43
44grn_operator
45grn_mrb_value_to_operator(mrb_state *mrb, mrb_value mrb_op)
46{
47 if (!mrb_fixnum_p(mrb_op)) {
48 mrb_op = mrb_funcall(mrb, mrb_op, "value", 0);
49 }
50
51 return mrb_fixnum(mrb_op);
52}
53
54void
55grn_mrb_operator_init(grn_ctx *ctx)
56{
57 grn_mrb_data *data = &(ctx->impl->mrb);
58 mrb_state *mrb = data->state;
59 struct RClass *module = ctx->impl->mrb.module;
60 struct RClass *klass;
61 mrb_value klass_obj;
62
63 klass = mrb_class_get_under(mrb, module, "Operator");
64 data->groonga.operator_class = klass;
65
66 klass_obj = mrb_obj_value(klass);
67#define DEFINE_OPERATOR(name) \
68 mrb_funcall(mrb, klass_obj, "register", 1, \
69 mrb_funcall(mrb, klass_obj, "new", 2, \
70 mrb_str_new_lit(mrb, #name), \
71 mrb_fixnum_value(GRN_OP_ ## name)))
72
73 DEFINE_OPERATOR(PUSH);
74 DEFINE_OPERATOR(POP);
75 DEFINE_OPERATOR(NOP);
76 DEFINE_OPERATOR(CALL);
77 DEFINE_OPERATOR(INTERN);
78 DEFINE_OPERATOR(GET_REF);
79 DEFINE_OPERATOR(GET_VALUE);
80 DEFINE_OPERATOR(AND);
81 DEFINE_OPERATOR(AND_NOT);
82 DEFINE_OPERATOR(OR);
83 DEFINE_OPERATOR(ASSIGN);
84 DEFINE_OPERATOR(STAR_ASSIGN);
85 DEFINE_OPERATOR(SLASH_ASSIGN);
86 DEFINE_OPERATOR(MOD_ASSIGN);
87 DEFINE_OPERATOR(PLUS_ASSIGN);
88 DEFINE_OPERATOR(MINUS_ASSIGN);
89 DEFINE_OPERATOR(SHIFTL_ASSIGN);
90 DEFINE_OPERATOR(SHIFTR_ASSIGN);
91 DEFINE_OPERATOR(SHIFTRR_ASSIGN);
92 DEFINE_OPERATOR(AND_ASSIGN);
93 DEFINE_OPERATOR(XOR_ASSIGN);
94 DEFINE_OPERATOR(OR_ASSIGN);
95 DEFINE_OPERATOR(JUMP);
96 DEFINE_OPERATOR(CJUMP);
97 DEFINE_OPERATOR(COMMA);
98 DEFINE_OPERATOR(BITWISE_OR);
99 DEFINE_OPERATOR(BITWISE_XOR);
100 DEFINE_OPERATOR(BITWISE_AND);
101 DEFINE_OPERATOR(BITWISE_NOT);
102 DEFINE_OPERATOR(EQUAL);
103 DEFINE_OPERATOR(NOT_EQUAL);
104 DEFINE_OPERATOR(LESS);
105 DEFINE_OPERATOR(GREATER);
106 DEFINE_OPERATOR(LESS_EQUAL);
107 DEFINE_OPERATOR(GREATER_EQUAL);
108 DEFINE_OPERATOR(IN);
109 DEFINE_OPERATOR(MATCH);
110 DEFINE_OPERATOR(NEAR);
111 DEFINE_OPERATOR(NEAR2);
112 DEFINE_OPERATOR(SIMILAR);
113 DEFINE_OPERATOR(TERM_EXTRACT);
114 DEFINE_OPERATOR(SHIFTL);
115 DEFINE_OPERATOR(SHIFTR);
116 DEFINE_OPERATOR(SHIFTRR);
117 DEFINE_OPERATOR(PLUS);
118 DEFINE_OPERATOR(MINUS);
119 DEFINE_OPERATOR(STAR);
120 DEFINE_OPERATOR(SLASH);
121 DEFINE_OPERATOR(MOD);
122 DEFINE_OPERATOR(DELETE);
123 DEFINE_OPERATOR(INCR);
124 DEFINE_OPERATOR(DECR);
125 DEFINE_OPERATOR(INCR_POST);
126 DEFINE_OPERATOR(DECR_POST);
127 DEFINE_OPERATOR(NOT);
128 DEFINE_OPERATOR(ADJUST);
129 DEFINE_OPERATOR(EXACT);
130 DEFINE_OPERATOR(LCP);
131 DEFINE_OPERATOR(PARTIAL);
132 DEFINE_OPERATOR(UNSPLIT);
133 DEFINE_OPERATOR(PREFIX);
134 DEFINE_OPERATOR(SUFFIX);
135 DEFINE_OPERATOR(GEO_DISTANCE1);
136 DEFINE_OPERATOR(GEO_DISTANCE2);
137 DEFINE_OPERATOR(GEO_DISTANCE3);
138 DEFINE_OPERATOR(GEO_DISTANCE4);
139 DEFINE_OPERATOR(GEO_WITHINP5);
140 DEFINE_OPERATOR(GEO_WITHINP6);
141 DEFINE_OPERATOR(GEO_WITHINP8);
142 DEFINE_OPERATOR(OBJ_SEARCH);
143 DEFINE_OPERATOR(EXPR_GET_VAR);
144 DEFINE_OPERATOR(TABLE_CREATE);
145 DEFINE_OPERATOR(TABLE_SELECT);
146 DEFINE_OPERATOR(TABLE_SORT);
147 DEFINE_OPERATOR(TABLE_GROUP);
148 DEFINE_OPERATOR(JSON_PUT);
149 DEFINE_OPERATOR(GET_MEMBER);
150 DEFINE_OPERATOR(REGEXP);
151 DEFINE_OPERATOR(FUZZY);
152
153#undef DEFINE_OPERATOR
154}
155#endif
156