switch (op) { case GRN_OP_EQUAL :
func = grn_operator_exec_equal; break; case GRN_OP_NOT_EQUAL :
func = grn_operator_exec_not_equal; break; case GRN_OP_LESS :
func = grn_operator_exec_less; break; case GRN_OP_GREATER :
func = grn_operator_exec_greater; break; case GRN_OP_LESS_EQUAL :
func = grn_operator_exec_less_equal; break; case GRN_OP_GREATER_EQUAL :
func = grn_operator_exec_greater_equal; break; case GRN_OP_MATCH :
func = grn_operator_exec_match; break; case GRN_OP_PREFIX :
func = grn_operator_exec_prefix; break; case GRN_OP_REGEXP :
func = grn_operator_exec_regexp; break; default : break;
}
return func;
}
#define DO_EQ_SUB do {\ switch (y->header.domain) {\ case GRN_DB_INT8 :\
r = ((unsignedchar) x_ == (unsignedchar) GRN_INT8_VALUE(y)); \ break;\ case GRN_DB_UINT8 :\
r = (x_ == GRN_UINT8_VALUE(y));\ break;\ case GRN_DB_INT16 :\
r = ((int) x_ == (int) GRN_INT16_VALUE(y)); \ break;\ case GRN_DB_UINT16 :\
r = (x_ == GRN_UINT16_VALUE(y));\ break;\ case GRN_DB_INT32 :\
r = ((int) x_ == (int) GRN_INT32_VALUE(y)); \ break;\ case GRN_DB_UINT32 :\
r = ((uint) x_ == GRN_UINT32_VALUE(y)); \ break;\ case GRN_DB_INT64 :\
r = ((longlong) x_ == GRN_INT64_VALUE(y)); \ break;\ case GRN_DB_TIME :\
r = (GRN_TIME_PACK(x_,0) == GRN_INT64_VALUE(y));\ break;\ case GRN_DB_UINT64 :\
r = ((unsignedlonglong) x_ == GRN_UINT64_VALUE(y)); \ break;\ case GRN_DB_FLOAT :\
r = ((x_ <= GRN_FLOAT_VALUE(y)) && (x_ >= GRN_FLOAT_VALUE(y)));\ break;\ case GRN_DB_SHORT_TEXT :\ case GRN_DB_TEXT :\ case GRN_DB_LONG_TEXT :\
{\ constchar *p_ = GRN_TEXT_VALUE(y);\ int i_ = grn_atoi(p_, p_ + GRN_TEXT_LEN(y), NULL);\
r = ((int) x_ == i_); \
}\ break;\ default :\
r = GRN_FALSE;\ break;\
}\
} while (0)
#define DO_EQ(x,y,r) do {\ switch (x->header.domain) {\ case GRN_DB_VOID :\
r = GRN_FALSE;\ break;\ case GRN_DB_INT8 :\
{\
int8_t x_ = GRN_INT8_VALUE(x);\
DO_EQ_SUB;\
}\ break;\ case GRN_DB_UINT8 :\
{\
uint8_t x_ = GRN_UINT8_VALUE(x);\
DO_EQ_SUB;\
}\ break;\ case GRN_DB_INT16 :\
{\
int16_t x_ = GRN_INT16_VALUE(x);\
DO_EQ_SUB;\
}\ break;\ case GRN_DB_UINT16 :\
{\
uint16_t x_ = GRN_UINT16_VALUE(x);\
DO_EQ_SUB;\
}\ break;\ case GRN_DB_INT32 :\
{\
int32_t x_ = GRN_INT32_VALUE(x);\
DO_EQ_SUB;\
}\ break;\ case GRN_DB_UINT32 :\
{\
uint32_t x_ = GRN_UINT32_VALUE(x);\
DO_EQ_SUB;\
}\ break;\ case GRN_DB_INT64 :\
{\
int64_t x_ = GRN_INT64_VALUE(x);\
DO_EQ_SUB;\
}\ break;\ case GRN_DB_TIME :\
{\
int64_t x_ = GRN_INT64_VALUE(x);\ switch (y->header.domain) {\ case GRN_DB_INT32 :\
r = (x_ == GRN_TIME_PACK(GRN_INT32_VALUE(y), 0));\ break;\ case GRN_DB_UINT32 :\
r = (x_ == GRN_TIME_PACK(GRN_UINT32_VALUE(y), 0));\ break;\ case GRN_DB_INT64 :\ case GRN_DB_TIME :\
r = ((longlong) x_ == GRN_INT64_VALUE(y)); \ break;\ case GRN_DB_UINT64 :\
r = ((unsignedlonglong) x_ == GRN_UINT64_VALUE(y)); \ break;\ case GRN_DB_FLOAT :\
r = (x_ == GRN_TIME_PACK(GRN_FLOAT_VALUE(y), 0));\ break;\ case GRN_DB_SHORT_TEXT :\ case GRN_DB_TEXT :\ case GRN_DB_LONG_TEXT :\
{\
grn_obj time_value_;\
GRN_TIME_INIT(&time_value_, 0);\ if (grn_obj_cast(ctx, y, &time_value_, GRN_FALSE) == GRN_SUCCESS) {\
r = (x_ == GRN_TIME_VALUE(&time_value_));\
} else {\
r = GRN_FALSE;\
}\
GRN_OBJ_FIN(ctx, &time_value_);\
}\ break;\ default :\
r = GRN_FALSE;\ break;\
}\
}\ break;\ case GRN_DB_UINT64 :\
{\
uint64_t x_ = GRN_UINT64_VALUE(x);\
DO_EQ_SUB;\
}\ break;\ case GRN_DB_FLOAT :\
{\ double x_ = GRN_FLOAT_VALUE(x);\ switch (y->header.domain) {\ case GRN_DB_INT32 :\
r = ((x_ <= GRN_INT32_VALUE(y)) && (x_ >= GRN_INT32_VALUE(y)));\ break;\ case GRN_DB_UINT32 :\
r = ((x_ <= GRN_UINT32_VALUE(y)) && (x_ >= GRN_UINT32_VALUE(y)));\ break;\ case GRN_DB_INT64 :\ case GRN_DB_TIME :\
r = ((x_ <= GRN_INT64_VALUE(y)) && (x_ >= GRN_INT64_VALUE(y)));\ break;\ case GRN_DB_UINT64 :\
r = ((x_ <= GRN_UINT64_VALUE(y)) && (x_ >= GRN_UINT64_VALUE(y)));\ break;\ case GRN_DB_FLOAT :\
r = ((x_ <= GRN_FLOAT_VALUE(y)) && (x_ >= GRN_FLOAT_VALUE(y)));\ break;\ case GRN_DB_SHORT_TEXT :\ case GRN_DB_TEXT :\ case GRN_DB_LONG_TEXT :\
{\ constchar *p_ = GRN_TEXT_VALUE(y);\ int i_ = grn_atoi(p_, p_ + GRN_TEXT_LEN(y), NULL);\
r = (x_ <= i_ && x_ >= i_);\
}\ break;\ default :\
r = GRN_FALSE;\ break;\
}\
}\ break;\ case GRN_DB_SHORT_TEXT :\ case GRN_DB_TEXT :\ case GRN_DB_LONG_TEXT :\ if (GRN_DB_SHORT_TEXT <= y->header.domain && y->header.domain <= GRN_DB_LONG_TEXT) {\
uint32_t la = GRN_TEXT_LEN(x), lb = GRN_TEXT_LEN(y);\
r = (la == lb && !memcmp(GRN_TEXT_VALUE(x), GRN_TEXT_VALUE(y), lb));\
} else {\ constchar *q_ = GRN_TEXT_VALUE(x);\ int x_ = grn_atoi(q_, q_ + GRN_TEXT_LEN(x), NULL);\
DO_EQ_SUB;\
}\ break;\ default :\ if ((x->header.domain == y->header.domain)) {\
r = (GRN_BULK_VSIZE(x) == GRN_BULK_VSIZE(y) &&\
!(memcmp(GRN_BULK_HEAD(x), GRN_BULK_HEAD(y), GRN_BULK_VSIZE(x))));\
} else {\
grn_obj dest;\ if (x->header.domain < y->header.domain) {\
GRN_OBJ_INIT(&dest, GRN_BULK, 0, y->header.domain);\ if (!grn_obj_cast(ctx, x, &dest, GRN_FALSE)) {\
r = (GRN_BULK_VSIZE(&dest) == GRN_BULK_VSIZE(y) &&\
!memcmp(GRN_BULK_HEAD(&dest), GRN_BULK_HEAD(y), GRN_BULK_VSIZE(y))); \
} else {\
r = GRN_FALSE;\
}\
} else {\
GRN_OBJ_INIT(&dest, GRN_BULK, 0, x->header.domain);\ if (!grn_obj_cast(ctx, y, &dest, GRN_FALSE)) {\
r = (GRN_BULK_VSIZE(&dest) == GRN_BULK_VSIZE(x) &&\
!memcmp(GRN_BULK_HEAD(&dest), GRN_BULK_HEAD(x), GRN_BULK_VSIZE(x))); \
} else {\
r = GRN_FALSE;\
}\
}\
GRN_OBJ_FIN(ctx, &dest);\
}\ break;\
}\
} while (0)
grn_bool
grn_operator_exec_equal(grn_ctx *ctx, grn_obj *x, grn_obj *y)
{
grn_bool r = GRN_FALSE;
GRN_API_ENTER;
DO_EQ(x, y, r);
GRN_API_RETURN(r);
}
grn_bool
grn_operator_exec_not_equal(grn_ctx *ctx, grn_obj *x, grn_obj *y)
{
grn_bool r = GRN_FALSE;
GRN_API_ENTER;
DO_EQ(x, y, r);
GRN_API_RETURN(!r);
}
#define DO_COMPARE_SCALAR_SUB_NUMERIC(y,op) do {\ switch ((y)->header.domain) {\ case GRN_DB_BOOL :\
r = (x_ op (uint8_t)(GRN_BOOL_VALUE(y) ? 1 : 0));\ break;\ case GRN_DB_INT8 :\
r = ((signedchar) x_ op GRN_INT8_VALUE(y)); \ break;\ case GRN_DB_UINT8 :\
r = ((unsignedchar) x_ op GRN_UINT8_VALUE(y)); \ break;\ case GRN_DB_INT16 :\
r = ((short) x_ op GRN_INT16_VALUE(y)); \ break;\ case GRN_DB_UINT16 :\
r = ((unsignedshort) x_ op GRN_UINT16_VALUE(y)); \ break;\ case GRN_DB_INT32 :\
r = ((int) x_ op GRN_INT32_VALUE(y)); \ break;\ case GRN_DB_UINT32 :\
r = ((uint) x_ op GRN_UINT32_VALUE(y)); \ break;\ case GRN_DB_INT64 :\
r = ((longlong) x_ op GRN_INT64_VALUE(y)); \ break;\ case GRN_DB_TIME :\
r = (GRN_TIME_PACK(x_,0) op GRN_INT64_VALUE(y));\ break;\ case GRN_DB_UINT64 :\
r = ((unsignedlonglong) x_ op GRN_UINT64_VALUE(y)); \ break;\ case GRN_DB_FLOAT :\
r = (x_ op GRN_FLOAT_VALUE(y));\ break;\ default :\
r = GRN_FALSE;\ break;\
}\
} while (0)
#define DO_COMPARE_SCALAR_SUB_BUILTIN(op) do {\ switch (y->header.domain) {\ case GRN_DB_SHORT_TEXT :\ case GRN_DB_TEXT :\ case GRN_DB_LONG_TEXT :\
{\
grn_obj y_;\
GRN_OBJ_INIT(&y_, GRN_BULK, 0, x->header.domain);\ if (grn_obj_cast(ctx, y, &y_, GRN_FALSE)) {\
r = GRN_FALSE;\
} else {\
DO_COMPARE_SCALAR_SUB_NUMERIC(&y_, op);\
}\
GRN_OBJ_FIN(ctx, &y_);\
}\ break;\ default :\
DO_COMPARE_SCALAR_SUB_NUMERIC(y,op);\ break;\
}\
} while (0)
#define DO_COMPARE_SCALAR_SUB(op) do {\ if (y->header.domain >= GRN_N_RESERVED_TYPES) {\
grn_obj *y_table;\
y_table = grn_ctx_at(ctx, y->header.domain);\ switch (y_table->header.type) {\ case GRN_TABLE_HASH_KEY :\ case GRN_TABLE_PAT_KEY :\ case GRN_TABLE_DAT_KEY :\
{\
grn_obj y_key;\ int length;\
GRN_OBJ_INIT(&y_key, GRN_BULK, 0, y_table->header.domain);\
length = grn_table_get_key2(ctx, y_table, GRN_RECORD_VALUE(y), &y_key);\ if (length > 0) {\
grn_obj *y_original = y;\
y = &y_key;\
DO_COMPARE_SCALAR_SUB_BUILTIN(op);\
y = y_original;\
} else {\
r = GRN_FALSE;\
}\
GRN_OBJ_FIN(ctx, &y_key);\
}\ break;\ default :\
r = GRN_FALSE;\ break;\
}\
grn_obj_unlink(ctx, y_table);\
} else {\
DO_COMPARE_SCALAR_SUB_BUILTIN(op);\
}\
} while (0)
#define DO_COMPARE_SCALAR_BUILTIN(x,y,r,op) do {\ switch (x->header.domain) {\ case GRN_DB_BOOL :\
{\
uint8_t x_ = GRN_BOOL_VALUE(x) ? 1 : 0;\
DO_COMPARE_SCALAR_SUB(op);\
}\ break;\ case GRN_DB_INT8 :\
{\
int8_t x_ = GRN_INT8_VALUE(x);\
DO_COMPARE_SCALAR_SUB(op);\
}\ break;\ case GRN_DB_UINT8 :\
{\
uint8_t x_ = GRN_UINT8_VALUE(x);\
DO_COMPARE_SCALAR_SUB(op);\
}\ break;\ case GRN_DB_INT16 :\
{\
int16_t x_ = GRN_INT16_VALUE(x);\
DO_COMPARE_SCALAR_SUB(op);\
}\ break;\ case GRN_DB_UINT16 :\
{\
uint16_t x_ = GRN_UINT16_VALUE(x);\
DO_COMPARE_SCALAR_SUB(op);\
}\ break;\ case GRN_DB_INT32 :\
{\
int32_t x_ = GRN_INT32_VALUE(x);\
DO_COMPARE_SCALAR_SUB(op);\
}\ break;\ case GRN_DB_UINT32 :\
{\
uint32_t x_ = GRN_UINT32_VALUE(x);\
DO_COMPARE_SCALAR_SUB(op);\
}\ break;\ case GRN_DB_TIME :\
{\
int64_t x_ = GRN_INT64_VALUE(x);\ switch (y->header.domain) {\ case GRN_DB_INT32 :\
r = (x_ op GRN_TIME_PACK(GRN_INT32_VALUE(y), 0));\ break;\ case GRN_DB_UINT32 :\
r = (x_ op GRN_TIME_PACK(GRN_UINT32_VALUE(y), 0));\ break;\ case GRN_DB_INT64 :\ case GRN_DB_TIME :\
r = ((longlong) x_ op GRN_INT64_VALUE(y)); \ break;\ case GRN_DB_UINT64 :\
r = ((unsignedlonglong) x_ op GRN_UINT64_VALUE(y)); \ break;\ case GRN_DB_FLOAT :\
r = (x_ op GRN_TIME_PACK(GRN_FLOAT_VALUE(y), 0));\ break;\ case GRN_DB_SHORT_TEXT :\ case GRN_DB_TEXT :\ case GRN_DB_LONG_TEXT :\
{\
grn_obj time_value_;\
GRN_TIME_INIT(&time_value_, 0);\ if (grn_obj_cast(ctx, y, &time_value_, GRN_FALSE) == GRN_SUCCESS) {\
r = (x_ op GRN_TIME_VALUE(&time_value_));\
} else {\
r = GRN_FALSE;\
}\
GRN_OBJ_FIN(ctx, &time_value_);\
}\ break;\ default :\
r = GRN_FALSE;\ break;\
}\
}\ break;\ case GRN_DB_INT64 :\
{\
int64_t x_ = GRN_INT64_VALUE(x);\
DO_COMPARE_SCALAR_SUB(op);\
}\ break;\ case GRN_DB_UINT64 :\
{\
uint64_t x_ = GRN_UINT64_VALUE(x);\
DO_COMPARE_SCALAR_SUB(op);\
}\ break;\ case GRN_DB_FLOAT :\
{\ double x_ = GRN_FLOAT_VALUE(x);\
DO_COMPARE_SCALAR_SUB(op);\
}\ break;\ case GRN_DB_SHORT_TEXT :\ case GRN_DB_TEXT :\ case GRN_DB_LONG_TEXT :\ if (GRN_DB_SHORT_TEXT <= y->header.domain && y->header.domain <= GRN_DB_LONG_TEXT) {\ int r_;\
uint32_t la = GRN_TEXT_LEN(x), lb = GRN_TEXT_LEN(y);\ if (la > lb) {\ if (!(r_ = memcmp(GRN_TEXT_VALUE(x), GRN_TEXT_VALUE(y), lb))) {\
r_ = 1;\
}\
} else {\ if (!(r_ = memcmp(GRN_TEXT_VALUE(x), GRN_TEXT_VALUE(y), la))) {\
r_ = la == lb ? 0 : -1;\
}\
}\
r = (r_ op 0);\
} else {\ constchar *q_ = GRN_TEXT_VALUE(x);\ int x_ = grn_atoi(q_, q_ + GRN_TEXT_LEN(x), NULL);\
DO_COMPARE_SCALAR_SUB(op);\
}\ break;\ default :\
r = GRN_FALSE;\ break;\
}\
} while (0)
#define DO_COMPARE_SCALAR(x, y, r, op) do {\ if (x->header.domain >= GRN_N_RESERVED_TYPES) {\
grn_obj *x_table;\
x_table = grn_ctx_at(ctx, x->header.domain);\ switch (x_table->header.type) {\ case GRN_TABLE_HASH_KEY :\ case GRN_TABLE_PAT_KEY :\ case GRN_TABLE_DAT_KEY :\
{\
grn_obj x_key;\ int length;\
GRN_OBJ_INIT(&x_key, GRN_BULK, 0, x_table->header.domain);\
length = grn_table_get_key2(ctx, x_table, GRN_RECORD_VALUE(x), &x_key);\ if (length > 0) {\
grn_obj *x_original = x;\
x = &x_key;\
DO_COMPARE_SCALAR_BUILTIN((&x_key), y, r, op);\
x = x_original;\
} else {\
r = GRN_FALSE;\
}\
GRN_OBJ_FIN(ctx, &x_key);\
}\ break;\ default :\
r = GRN_FALSE;\ break;\
}\
grn_obj_unlink(ctx, x_table);\
} else {\
DO_COMPARE_SCALAR_BUILTIN(x, y, r, op);\
}\
} while (0)
#define DO_COMPARE(x, y, r, op) do {\ if (x->header.type == GRN_UVECTOR) {\
grn_obj element_buffer;\ unsignedint i, n;\ unsignedint element_size;\
GRN_VALUE_FIX_SIZE_INIT(&element_buffer, 0, x->header.domain);\
n = grn_uvector_size(ctx, x);\
element_size = grn_uvector_element_size(ctx, x);\ for (i = 0; i < n; i++) {\
grn_obj *element = &element_buffer;\
GRN_BULK_REWIND(element);\
grn_bulk_write(ctx, element,\
((uint8_t *)GRN_BULK_HEAD(x)) + (element_size * i),\
element_size);\
DO_COMPARE_SCALAR(element, y, r, op);\ if (r) {\ break;\
}\
}\
GRN_OBJ_FIN(ctx, &element_buffer);\
} else {\ if (GRN_BULK_VSIZE(x) == 0 || GRN_BULK_VSIZE(y) == 0) {\
r = GRN_FALSE;\
} else {\
DO_COMPARE_SCALAR(x, y, r, op);\
}\
}\
} while (0)
grn_bool
grn_operator_exec_less(grn_ctx *ctx, grn_obj *x, grn_obj *y)
{
grn_bool r = GRN_FALSE;
GRN_API_ENTER;
DO_COMPARE(x, y, r, <);
GRN_API_RETURN(r);
}
grn_bool
grn_operator_exec_greater(grn_ctx *ctx, grn_obj *x, grn_obj *y)
{
grn_bool r = GRN_FALSE;
GRN_API_ENTER;
DO_COMPARE(x, y, r, >);
GRN_API_RETURN(r);
}
grn_bool
grn_operator_exec_less_equal(grn_ctx *ctx, grn_obj *x, grn_obj *y)
{
grn_bool r = GRN_FALSE;
GRN_API_ENTER;
DO_COMPARE(x, y, r, <=);
GRN_API_RETURN(r);
}
grn_bool
grn_operator_exec_greater_equal(grn_ctx *ctx, grn_obj *x, grn_obj *y)
{
grn_bool r = GRN_FALSE;
GRN_API_ENTER;
DO_COMPARE(x, y, r, >=);
GRN_API_RETURN(r);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.