void grn_rset_recinfo_update_calc_values(grn_ctx *ctx, grn_rset_recinfo *ri, grn_obj *table, grn_obj *value) { grn_table_group_flags flags; byte *values; grn_obj value_int64; grn_obj value_float; flags = DB_OBJ(table)->flags.group; values = (((byte *)ri->subrecs) + GRN_RSET_SUBRECS_SIZE(DB_OBJ(table)->subrec_size, DB_OBJ(table)->max_n_subrecs)); GRN_INT64_INIT(&value_int64, 0); GRN_FLOAT_INIT(&value_float, 0); if (flags & (GRN_TABLE_GROUP_CALC_MAX | GRN_TABLE_GROUP_CALC_MIN | GRN_TABLE_GROUP_CALC_SUM)) { grn_obj_cast(ctx, value, &value_int64, GRN_FALSE); } if (flags & GRN_TABLE_GROUP_CALC_AVG) { grn_obj_cast(ctx, value, &value_float, GRN_FALSE); } if (flags & GRN_TABLE_GROUP_CALC_MAX) { int64_t current_max = *((int64_t *)values); int64_t value_raw = GRN_INT64_VALUE(&value_int64); if (ri->n_subrecs == 1 || value_raw > current_max) { *((int64_t *)values) = value_raw; } values += GRN_RSET_MAX_SIZE; } if (flags & GRN_TABLE_GROUP_CALC_MIN) { int64_t current_min = *((int64_t *)values); int64_t value_raw = GRN_INT64_VALUE(&value_int64); if (ri->n_subrecs == 1 || value_raw < current_min) { *((int64_t *)values) = value_raw; } values += GRN_RSET_MIN_SIZE; } if (flags & GRN_TABLE_GROUP_CALC_SUM) { int64_t value_raw = GRN_INT64_VALUE(&value_int64); *((int64_t *)values) += value_raw; values += GRN_RSET_SUM_SIZE; } if (flags & GRN_TABLE_GROUP_CALC_AVG) { double current_average = *((double *)values); double value_raw = GRN_FLOAT_VALUE(&value_float); *((double *)values) += (value_raw - current_average) / ri->n_subrecs; values += GRN_RSET_AVG_SIZE; } GRN_OBJ_FIN(ctx, &value_float); GRN_OBJ_FIN(ctx, &value_int64); }
double * grn_rset_recinfo_get_avg_(grn_ctx *ctx, grn_rset_recinfo *ri, grn_obj *table) { grn_table_group_flags flags; byte *values; flags = DB_OBJ(table)->flags.group; if (!(flags & GRN_TABLE_GROUP_CALC_AVG)) { return NULL; } values = (((byte *)ri->subrecs) + GRN_RSET_SUBRECS_SIZE(DB_OBJ(table)->subrec_size, DB_OBJ(table)->max_n_subrecs)); if (flags & GRN_TABLE_GROUP_CALC_MAX) { values += GRN_RSET_MAX_SIZE; } if (flags & GRN_TABLE_GROUP_CALC_MIN) { values += GRN_RSET_MIN_SIZE; } if (flags & GRN_TABLE_GROUP_CALC_SUM) { values += GRN_RSET_SUM_SIZE; } return (double *)values; }
grn_obj * grn_type_create(grn_ctx *ctx, const char *name, unsigned int name_size, grn_obj_flags flags, unsigned int size) { grn_id id; struct _grn_type *res = NULL; grn_obj *db; if (!ctx || !ctx->impl || !(db = ctx->impl->db)) { ERR(GRN_INVALID_ARGUMENT, "db not initialized"); return NULL; } GRN_API_ENTER; if (grn_db_check_name(ctx, name, name_size)) { GRN_DB_CHECK_NAME_ERR("[type][create]", name, name_size); GRN_API_RETURN(NULL); } if (!GRN_DB_P(db)) { ERR(GRN_INVALID_ARGUMENT, "invalid db assigned"); GRN_API_RETURN(NULL); } id = grn_obj_register(ctx, db, name, name_size); if (id && (res = GRN_MALLOC(sizeof(grn_db_obj)))) { GRN_DB_OBJ_SET_TYPE(res, GRN_TYPE); res->obj.header.flags = flags; res->obj.header.domain = GRN_ID_NIL; GRN_TYPE_SIZE(&res->obj) = size; if (grn_db_obj_init(ctx, db, id, DB_OBJ(res))) { // grn_obj_delete(ctx, db, id); GRN_FREE(res); GRN_API_RETURN(NULL); } } GRN_API_RETURN((grn_obj *)res); }
int64_t * grn_rset_recinfo_get_max_(grn_ctx *ctx, grn_rset_recinfo *ri, grn_obj *table) { grn_table_group_flags flags; byte *values; flags = DB_OBJ(table)->flags.group; if (!(flags & GRN_TABLE_GROUP_CALC_MAX)) { return NULL; } values = (((byte *)ri->subrecs) + GRN_RSET_SUBRECS_SIZE(DB_OBJ(table)->subrec_size, DB_OBJ(table)->max_n_subrecs)); return (int64_t *)values; }
uint32_t grn_type_size(grn_ctx *ctx, grn_obj *type) { uint32_t size; GRN_API_ENTER; if (!type) { ERR(GRN_INVALID_ARGUMENT, "[type][size] type is NULL"); GRN_API_RETURN(0); } size = GRN_TYPE_SIZE(DB_OBJ(type)); GRN_API_RETURN(size); }
grn_snip * grn_snip_open(grn_ctx *ctx, int flags, unsigned int width, unsigned int max_results, const char *defaultopentag, unsigned int defaultopentag_len, const char *defaultclosetag, unsigned int defaultclosetag_len, grn_snip_mapping *mapping) { int copy_tag; grn_snip *ret = NULL; if (!(ret = GRN_MALLOC(sizeof(grn_snip)))) { GRN_LOG(ctx, GRN_LOG_ALERT, "grn_snip allocation failed on grn_snip_open"); return NULL; } if (max_results > MAX_SNIP_RESULT_COUNT || max_results == 0) { GRN_LOG(ctx, GRN_LOG_WARNING, "max_results is invalid on grn_snip_open"); GRN_FREE(ret); return NULL; } GRN_API_ENTER; ret->encoding = ctx->encoding; ret->flags = flags; ret->width = width; ret->max_results = max_results; ret->defaultopentag = NULL; ret->defaultclosetag = NULL; copy_tag = flags & GRN_SNIP_COPY_TAG; if (grn_snip_set_default_tag(ctx, &(ret->defaultopentag), &(ret->defaultopentag_len), defaultopentag, defaultopentag_len, copy_tag)) { GRN_FREE(ret); GRN_API_RETURN(NULL); } if (grn_snip_set_default_tag(ctx, &(ret->defaultclosetag), &(ret->defaultclosetag_len), defaultclosetag, defaultclosetag_len, copy_tag)) { if (copy_tag && ret->defaultopentag) { GRN_FREE((void *)ret->defaultopentag); } GRN_FREE(ret); GRN_API_RETURN(NULL); } ret->cond_len = 0; ret->mapping = mapping; ret->nstr = NULL; ret->tag_count = 0; ret->snip_count = 0; if (ret->flags & GRN_SNIP_NORMALIZE) { ret->normalizer = GRN_NORMALIZER_AUTO; } else { ret->normalizer = NULL; } GRN_DB_OBJ_SET_TYPE(ret, GRN_SNIP); { grn_obj *db; grn_id id; db = grn_ctx_db(ctx); id = grn_obj_register(ctx, db, NULL, 0); DB_OBJ(ret)->header.domain = GRN_ID_NIL; DB_OBJ(ret)->range = GRN_ID_NIL; grn_db_obj_init(ctx, db, id, DB_OBJ(ret)); } GRN_API_RETURN(ret); }
static void set_vector(grn_ctx *ctx, grn_obj *column, grn_id id, grn_obj *vector) { int n = GRN_UINT32_VALUE(vector); grn_obj buf, *v = vector + 1; grn_id range_id; grn_obj *range; range_id = DB_OBJ(column)->range; range = grn_ctx_at(ctx, range_id); if (grn_obj_is_table(ctx, range)) { GRN_RECORD_INIT(&buf, GRN_OBJ_VECTOR, range_id); while (n--) { grn_bool cast_failed = GRN_FALSE; grn_obj record, *element = v; if (range_id != element->header.domain) { GRN_RECORD_INIT(&record, 0, range_id); if (grn_obj_cast(ctx, element, &record, GRN_TRUE)) { cast_failed = GRN_TRUE; ERR_CAST(column, range, element); } element = &record; } if (!cast_failed) { GRN_UINT32_PUT(ctx, &buf, GRN_RECORD_VALUE(element)); } if (element == &record) { GRN_OBJ_FIN(ctx, element); } v = values_next(ctx, v); } } else { if (((struct _grn_type *)range)->obj.header.flags & GRN_OBJ_KEY_VAR_SIZE) { GRN_TEXT_INIT(&buf, GRN_OBJ_VECTOR); while (n--) { switch (v->header.domain) { case GRN_DB_TEXT : { grn_bool cast_failed = GRN_FALSE; grn_obj casted_element, *element = v; if (range_id != element->header.domain) { GRN_OBJ_INIT(&casted_element, GRN_BULK, 0, range_id); if (grn_obj_cast(ctx, element, &casted_element, GRN_TRUE)) { cast_failed = GRN_TRUE; ERR_CAST(column, range, element); } element = &casted_element; } if (!cast_failed) { grn_vector_add_element(ctx, &buf, GRN_TEXT_VALUE(element), GRN_TEXT_LEN(element), 0, element->header.domain); } if (element == &casted_element) { GRN_OBJ_FIN(ctx, element); } break; } case GRN_JSON_LOAD_OPEN_BRACE : add_weight_vector(ctx, column, v, &buf); n -= GRN_UINT32_VALUE(v); break; default : ERR(GRN_INVALID_ARGUMENT, "array must contain string or object"); break; } v = values_next(ctx, v); } } else { grn_id value_size = ((grn_db_obj *)range)->range; GRN_VALUE_FIX_SIZE_INIT(&buf, GRN_OBJ_VECTOR, range_id); while (n--) { grn_bool cast_failed = GRN_FALSE; grn_obj casted_element, *element = v; if (range_id != element->header.domain) { GRN_OBJ_INIT(&casted_element, GRN_BULK, 0, range_id); if (grn_obj_cast(ctx, element, &casted_element, GRN_TRUE)) { cast_failed = GRN_TRUE; ERR_CAST(column, range, element); } element = &casted_element; } if (!cast_failed) { grn_bulk_write(ctx, &buf, GRN_TEXT_VALUE(element), value_size); } if (element == &casted_element) { GRN_OBJ_FIN(ctx, element); } v = values_next(ctx, v); } } } grn_obj_set_value(ctx, column, id, &buf, GRN_OBJ_SET); GRN_OBJ_FIN(ctx, &buf); }
static void grn_text_atoj(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type, grn_obj *obj, grn_id id) { int vs; grn_obj buf; if (obj->header.type == GRN_ACCESSOR) { grn_accessor *a = (grn_accessor *)obj; GRN_TEXT_INIT(&buf, 0); for (;;) { buf.header.domain = grn_obj_get_range(ctx, obj); GRN_BULK_REWIND(&buf); switch (a->action) { case GRN_ACCESSOR_GET_ID : GRN_UINT32_PUT(ctx, &buf, id); buf.header.domain = GRN_DB_UINT32; break; case GRN_ACCESSOR_GET_KEY : grn_table_get_key2(ctx, a->obj, id, &buf); buf.header.domain = DB_OBJ(a->obj)->header.domain; break; case GRN_ACCESSOR_GET_VALUE : grn_obj_get_value(ctx, a->obj, id, &buf); buf.header.domain = GRN_DB_INT32; /* fix me */ break; case GRN_ACCESSOR_GET_SCORE : grn_obj_get_value(ctx, a->obj, id, &buf); { grn_rset_recinfo *ri = (grn_rset_recinfo *)grn_obj_get_value_(ctx, a->obj, id, &vs); GRN_INT32_PUT(ctx, &buf, ri->score); } buf.header.domain = GRN_DB_INT32; break; case GRN_ACCESSOR_GET_NSUBRECS : { grn_rset_recinfo *ri = (grn_rset_recinfo *)grn_obj_get_value_(ctx, a->obj, id, &vs); GRN_INT32_PUT(ctx, &buf, ri->n_subrecs); } buf.header.domain = GRN_DB_INT32; break; case GRN_ACCESSOR_GET_COLUMN_VALUE : if ((a->obj->header.flags & GRN_OBJ_COLUMN_TYPE_MASK) == GRN_OBJ_COLUMN_VECTOR) { if (a->next) { grn_id *idp; grn_obj_get_value(ctx, a->obj, id, &buf); idp = (grn_id *)GRN_BULK_HEAD(&buf); vs = GRN_BULK_VSIZE(&buf) / sizeof(grn_id); grn_output_array_open(ctx, outbuf, output_type, "COLUMN", vs); for (; vs--; idp++) { grn_text_atoj(ctx, outbuf, output_type, (grn_obj *)a->next, *idp); } grn_output_array_close(ctx, outbuf, output_type); } else { grn_text_atoj(ctx, outbuf, output_type, a->obj, id); } goto exit; } else { grn_obj_get_value(ctx, a->obj, id, &buf); } break; case GRN_ACCESSOR_GET_DB_OBJ : /* todo */ break; case GRN_ACCESSOR_LOOKUP : /* todo */ break; case GRN_ACCESSOR_FUNCALL : /* todo */ break; } if (a->next) { a = a->next; if (GRN_BULK_VSIZE(&buf) >= sizeof(grn_id)) { id = *((grn_id *)GRN_BULK_HEAD(&buf)); } else { id = GRN_ID_NIL; } } else { break; } } } else { switch (obj->header.type) { case GRN_COLUMN_FIX_SIZE : GRN_VALUE_FIX_SIZE_INIT(&buf, 0, DB_OBJ(obj)->range); break; case GRN_COLUMN_VAR_SIZE : if ((obj->header.flags & GRN_OBJ_COLUMN_TYPE_MASK) == GRN_OBJ_COLUMN_VECTOR) { grn_obj *range = grn_ctx_at(ctx, DB_OBJ(obj)->range); if (range->header.flags & GRN_OBJ_KEY_VAR_SIZE) { GRN_VALUE_VAR_SIZE_INIT(&buf, GRN_OBJ_VECTOR, DB_OBJ(obj)->range); } else { GRN_VALUE_FIX_SIZE_INIT(&buf, GRN_OBJ_VECTOR, DB_OBJ(obj)->range); } } else { GRN_VALUE_VAR_SIZE_INIT(&buf, 0, DB_OBJ(obj)->range); } break; case GRN_COLUMN_INDEX : GRN_UINT32_INIT(&buf, 0); break; default: GRN_TEXT_INIT(&buf, 0); break; } grn_obj_get_value(ctx, obj, id, &buf); } grn_output_obj(ctx, outbuf, output_type, &buf, NULL); exit : grn_obj_close(ctx, &buf); }