Changeset 26568

Show
Ignore:
Timestamp:
12/12/08 14:34:36 (4 years ago)
Author:
kazuho
Message:

impl. top n sort, still need to make topn_set an aggregate function

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • platform/mysql/top-n-sort/top-n-sort.c

    r26567 r26568  
    3232 
    3333typedef struct _topn_info { 
    34   size_t refcnt; 
    35   size_t count; 
     34  int refcnt; 
     35  int count; 
    3636  topn_item items[MAX_ITEMS]; 
    3737} topn_info; 
     
    113113long long topn_set(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) 
    114114{ 
    115   // TODO 
     115  int max_items = (int)*(long long*)args->args[0]; 
     116  long long id = *(long long*)args->args[1], 
     117    value = *(long long*)args->args[2]; 
     118  topn_info *info = initid->ptr; 
     119  int keep; 
     120   
     121  for (keep = info->count - 1; keep >= 0; keep--) { 
     122    if (info->items[keep].value < value 
     123        || (info->items[keep].value == value && info->items[keep].id < id)) { 
     124      break; 
     125    } 
     126  } 
     127  if (i == max_items - 1) { 
     128    return 0; // cannot add 
     129  } 
     130  if (info->count < max_items) { 
     131    info->count++; 
     132  } 
     133  for (i = cnt - 2; i > keep; i--) { 
     134    memcpy(info->items + i + 1, info->items + i, sizeof(info->items[0])); 
     135  } 
     136  info->items[keep + 1].id = id; 
     137  info->items[keep + 1].value = value; 
    116138  return 0; 
    117139} 
     
    141163{ 
    142164  topn_info *info = initid->ptr; 
    143   size_t idx = (size_t)*(long long*)args->args[0]; 
     165  int idx = (int)*(long long*)args->args[0]; 
    144166   
    145   return idx < info->count ? info->items[idx].id : 0; 
     167  return 0 <= idx && idx < info->count ? info->items[idx].id : 0; 
    146168}