null+****@clear*****
null+****@clear*****
2012年 3月 8日 (木) 18:52:18 JST
Kouhei Sutou 2012-03-08 18:52:18 +0900 (Thu, 08 Mar 2012)
New Revision: 4a92906a090246f6a17449a448934c889bede3b0
Log:
suggest: split codes for learning
Modified files:
plugins/suggest/suggest.c
Modified: plugins/suggest/suggest.c (+99 -91)
===================================================================
--- plugins/suggest/suggest.c 2012-03-08 18:18:23 +0900 (ef1e1fd)
+++ plugins/suggest/suggest.c 2012-03-08 18:52:18 +0900 (97f0e52)
@@ -531,105 +531,113 @@ command_suggest(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_dat
return NULL;
}
-static grn_obj *
-func_suggest_preparer(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
+static int
+learn(grn_ctx *ctx, grn_obj **args)
{
int r = 0;
- grn_obj *obj;
- if (nargs == 6) {
- grn_obj v1, pre_events;
- grn_id post_event = GRN_RECORD_VALUE(args[0]);
- grn_id post_type = GRN_RECORD_VALUE(args[1]);
- grn_id post_item = GRN_RECORD_VALUE(args[2]);
- grn_id seq = GRN_RECORD_VALUE(args[3]);
- int64_t post_time = GRN_TIME_VALUE(args[4]);
- grn_obj *pairs = args[5];
- if (post_event && post_item && seq) {
- grn_obj *items = grn_ctx_at(ctx, GRN_OBJ_GET_DOMAIN(args[2]));
- grn_obj *items_freq = grn_obj_column(ctx, items, CONST_STR_LEN("freq"));
- grn_obj *items_freq2 = grn_obj_column(ctx, items, CONST_STR_LEN("freq2"));
- grn_obj *items_last = grn_obj_column(ctx, items, CONST_STR_LEN("last"));
- grn_obj *seqs = grn_ctx_at(ctx, GRN_OBJ_GET_DOMAIN(args[3]));
- grn_obj *seqs_events = grn_obj_column(ctx, seqs, CONST_STR_LEN("events"));
- grn_obj *events = grn_ctx_at(ctx, grn_obj_get_range(ctx, seqs_events));
- grn_obj *events_type = grn_obj_column(ctx, events, CONST_STR_LEN("type"));
- grn_obj *events_time = grn_obj_column(ctx, events, CONST_STR_LEN("time"));
- grn_obj *events_item = grn_obj_column(ctx, events, CONST_STR_LEN("item"));
- grn_obj *pairs_pre = grn_obj_column(ctx, pairs, CONST_STR_LEN("pre"));
- grn_obj *pairs_post = grn_obj_column(ctx, pairs, CONST_STR_LEN("post"));
- grn_obj *pairs_freq0 = grn_obj_column(ctx, pairs, CONST_STR_LEN("freq0"));
- grn_obj *pairs_freq1 = grn_obj_column(ctx, pairs, CONST_STR_LEN("freq1"));
- grn_obj *pairs_freq2 = grn_obj_column(ctx, pairs, CONST_STR_LEN("freq2"));
- GRN_UINT32_INIT(&v1, 0);
- GRN_UINT32_SET(ctx, &v1, 1);
- GRN_RECORD_INIT(&pre_events, 0, grn_obj_id(ctx, events));
- grn_obj_set_value(ctx, items_freq, post_item, &v1, GRN_OBJ_INCR);
- grn_obj_set_value(ctx, items_last, post_item, args[4], GRN_OBJ_SET);
- if (post_type) {
- int added;
- grn_id pid, tid, *ep, *es;
- grn_obj pre_type, pre_time, pre_item;
- uint64_t key, key_ = ((uint64_t)post_item) << 32;
- grn_obj_set_value(ctx, items_freq2, post_item, &v1, GRN_OBJ_INCR);
- grn_obj_get_value(ctx, seqs_events, seq, &pre_events);
- ep = (grn_id *)GRN_BULK_CURR(&pre_events);
- es = (grn_id *)GRN_BULK_HEAD(&pre_events);
- GRN_RECORD_INIT(&pre_type, 0, grn_obj_get_range(ctx, events_type));
- GRN_TIME_INIT(&pre_time, 0);
- GRN_RECORD_INIT(&pre_item, 0, grn_obj_get_range(ctx, events_item));
- while (es < ep--) {
- GRN_BULK_REWIND(&pre_type);
- GRN_BULK_REWIND(&pre_time);
- GRN_BULK_REWIND(&pre_item);
- grn_obj_get_value(ctx, events_type, *ep, &pre_type);
- grn_obj_get_value(ctx, events_time, *ep, &pre_time);
- grn_obj_get_value(ctx, events_item, *ep, &pre_item);
- if (GRN_TIME_VALUE(&pre_time) + 60 * GRN_TIME_USEC_PER_SEC < post_time) {
- r = (int)((post_time - GRN_TIME_VALUE(&pre_time))/GRN_TIME_USEC_PER_SEC);
- break;
- }
- key = key_ + GRN_RECORD_VALUE(&pre_item);
- pid = grn_table_add(ctx, pairs, &key, sizeof(uint64_t), &added);
- if (added) {
- grn_obj_set_value(ctx, pairs_pre, pid, &pre_item, GRN_OBJ_SET);
- grn_obj_set_value(ctx, pairs_post, pid, args[2], GRN_OBJ_SET);
- }
- if (GRN_RECORD_VALUE(&pre_type)) {
- grn_obj_set_value(ctx, pairs_freq1, pid, &v1, GRN_OBJ_INCR);
- break;
- } else {
- grn_obj_set_value(ctx, pairs_freq0, pid, &v1, GRN_OBJ_INCR);
- }
+ grn_obj v1, pre_events;
+ grn_id post_event = GRN_RECORD_VALUE(args[0]);
+ grn_id post_type = GRN_RECORD_VALUE(args[1]);
+ grn_id post_item = GRN_RECORD_VALUE(args[2]);
+ grn_id seq = GRN_RECORD_VALUE(args[3]);
+ int64_t post_time = GRN_TIME_VALUE(args[4]);
+ grn_obj *pairs = args[5];
+ if (post_event && post_item && seq) {
+ grn_obj *items = grn_ctx_at(ctx, GRN_OBJ_GET_DOMAIN(args[2]));
+ grn_obj *items_freq = grn_obj_column(ctx, items, CONST_STR_LEN("freq"));
+ grn_obj *items_freq2 = grn_obj_column(ctx, items, CONST_STR_LEN("freq2"));
+ grn_obj *items_last = grn_obj_column(ctx, items, CONST_STR_LEN("last"));
+ grn_obj *seqs = grn_ctx_at(ctx, GRN_OBJ_GET_DOMAIN(args[3]));
+ grn_obj *seqs_events = grn_obj_column(ctx, seqs, CONST_STR_LEN("events"));
+ grn_obj *events = grn_ctx_at(ctx, grn_obj_get_range(ctx, seqs_events));
+ grn_obj *events_type = grn_obj_column(ctx, events, CONST_STR_LEN("type"));
+ grn_obj *events_time = grn_obj_column(ctx, events, CONST_STR_LEN("time"));
+ grn_obj *events_item = grn_obj_column(ctx, events, CONST_STR_LEN("item"));
+ grn_obj *pairs_pre = grn_obj_column(ctx, pairs, CONST_STR_LEN("pre"));
+ grn_obj *pairs_post = grn_obj_column(ctx, pairs, CONST_STR_LEN("post"));
+ grn_obj *pairs_freq0 = grn_obj_column(ctx, pairs, CONST_STR_LEN("freq0"));
+ grn_obj *pairs_freq1 = grn_obj_column(ctx, pairs, CONST_STR_LEN("freq1"));
+ grn_obj *pairs_freq2 = grn_obj_column(ctx, pairs, CONST_STR_LEN("freq2"));
+ GRN_UINT32_INIT(&v1, 0);
+ GRN_UINT32_SET(ctx, &v1, 1);
+ GRN_RECORD_INIT(&pre_events, 0, grn_obj_id(ctx, events));
+ grn_obj_set_value(ctx, items_freq, post_item, &v1, GRN_OBJ_INCR);
+ grn_obj_set_value(ctx, items_last, post_item, args[4], GRN_OBJ_SET);
+ if (post_type) {
+ int added;
+ grn_id pid, tid, *ep, *es;
+ grn_obj pre_type, pre_time, pre_item;
+ uint64_t key, key_ = ((uint64_t)post_item) << 32;
+ grn_obj_set_value(ctx, items_freq2, post_item, &v1, GRN_OBJ_INCR);
+ grn_obj_get_value(ctx, seqs_events, seq, &pre_events);
+ ep = (grn_id *)GRN_BULK_CURR(&pre_events);
+ es = (grn_id *)GRN_BULK_HEAD(&pre_events);
+ GRN_RECORD_INIT(&pre_type, 0, grn_obj_get_range(ctx, events_type));
+ GRN_TIME_INIT(&pre_time, 0);
+ GRN_RECORD_INIT(&pre_item, 0, grn_obj_get_range(ctx, events_item));
+ while (es < ep--) {
+ GRN_BULK_REWIND(&pre_type);
+ GRN_BULK_REWIND(&pre_time);
+ GRN_BULK_REWIND(&pre_item);
+ grn_obj_get_value(ctx, events_type, *ep, &pre_type);
+ grn_obj_get_value(ctx, events_time, *ep, &pre_time);
+ grn_obj_get_value(ctx, events_item, *ep, &pre_item);
+ if (GRN_TIME_VALUE(&pre_time) + 60 * GRN_TIME_USEC_PER_SEC < post_time) {
+ r = (int)((post_time - GRN_TIME_VALUE(&pre_time))/GRN_TIME_USEC_PER_SEC);
+ break;
}
- {
- char keybuf[GRN_TABLE_MAX_KEY_SIZE];
- int keylen = grn_table_get_key(ctx, items, post_item,
- keybuf, GRN_TABLE_MAX_KEY_SIZE);
- grn_token *token = grn_token_open(ctx, items, keybuf, keylen, 1);
- if (token) {
- while ((tid = grn_token_next(ctx, token)) && tid != post_item) {
- key = key_ + tid;
- pid = grn_table_add(ctx, pairs, &key, sizeof(uint64_t), &added);
- if (added) {
- GRN_RECORD_SET(ctx, &pre_item, tid);
- grn_obj_set_value(ctx, pairs_pre, pid, &pre_item, GRN_OBJ_SET);
- grn_obj_set_value(ctx, pairs_post, pid, args[2], GRN_OBJ_SET);
- }
- grn_obj_set_value(ctx, pairs_freq2, pid, &v1, GRN_OBJ_INCR);
+ key = key_ + GRN_RECORD_VALUE(&pre_item);
+ pid = grn_table_add(ctx, pairs, &key, sizeof(uint64_t), &added);
+ if (added) {
+ grn_obj_set_value(ctx, pairs_pre, pid, &pre_item, GRN_OBJ_SET);
+ grn_obj_set_value(ctx, pairs_post, pid, args[2], GRN_OBJ_SET);
+ }
+ if (GRN_RECORD_VALUE(&pre_type)) {
+ grn_obj_set_value(ctx, pairs_freq1, pid, &v1, GRN_OBJ_INCR);
+ break;
+ } else {
+ grn_obj_set_value(ctx, pairs_freq0, pid, &v1, GRN_OBJ_INCR);
+ }
+ }
+ {
+ char keybuf[GRN_TABLE_MAX_KEY_SIZE];
+ int keylen = grn_table_get_key(ctx, items, post_item,
+ keybuf, GRN_TABLE_MAX_KEY_SIZE);
+ grn_token *token = grn_token_open(ctx, items, keybuf, keylen, 1);
+ if (token) {
+ while ((tid = grn_token_next(ctx, token)) && tid != post_item) {
+ key = key_ + tid;
+ pid = grn_table_add(ctx, pairs, &key, sizeof(uint64_t), &added);
+ if (added) {
+ GRN_RECORD_SET(ctx, &pre_item, tid);
+ grn_obj_set_value(ctx, pairs_pre, pid, &pre_item, GRN_OBJ_SET);
+ grn_obj_set_value(ctx, pairs_post, pid, args[2], GRN_OBJ_SET);
}
- grn_token_close(ctx, token);
+ grn_obj_set_value(ctx, pairs_freq2, pid, &v1, GRN_OBJ_INCR);
}
+ grn_token_close(ctx, token);
}
- GRN_OBJ_FIN(ctx, &pre_type);
- GRN_OBJ_FIN(ctx, &pre_time);
- GRN_OBJ_FIN(ctx, &pre_item);
- GRN_BULK_REWIND(&pre_events);
}
- GRN_RECORD_SET(ctx, &pre_events, post_event);
- grn_obj_set_value(ctx, seqs_events, seq, &pre_events, GRN_OBJ_APPEND);
- GRN_OBJ_FIN(ctx, &pre_events);
- GRN_OBJ_FIN(ctx, &v1);
+ GRN_OBJ_FIN(ctx, &pre_type);
+ GRN_OBJ_FIN(ctx, &pre_time);
+ GRN_OBJ_FIN(ctx, &pre_item);
+ GRN_BULK_REWIND(&pre_events);
}
+ GRN_RECORD_SET(ctx, &pre_events, post_event);
+ grn_obj_set_value(ctx, seqs_events, seq, &pre_events, GRN_OBJ_APPEND);
+ GRN_OBJ_FIN(ctx, &pre_events);
+ GRN_OBJ_FIN(ctx, &v1);
+ }
+ return r;
+}
+
+static grn_obj *
+func_suggest_preparer(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
+{
+ int r = 0;
+ grn_obj *obj;
+ if (nargs == 6) {
+ r = learn(ctx, args);
}
if ((obj = GRN_PROC_ALLOC(GRN_DB_UINT32, 0))) { GRN_UINT32_SET(ctx, obj, r); }
return obj;