summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchenzizhan <[email protected]>2024-07-02 15:53:22 +0800
committerchenzizhan <[email protected]>2024-07-02 15:53:22 +0800
commitb6435b478b6162b0a0d394c08d1c31704266fb47 (patch)
treea1326c53e1ee262304987b2168c8cc3b7233c1c1
parentd59c49638d324597b78793edc2169c151bb943a4 (diff)
new list api
-rw-r--r--src/fieldstat.c8
-rw-r--r--src/tags/heavy_keeper.c30
-rw-r--r--src/tags/heavy_keeper.h4
-rw-r--r--src/tags/tag_map.c18
-rw-r--r--src/tags/tag_map.h2
5 files changed, 35 insertions, 27 deletions
diff --git a/src/fieldstat.c b/src/fieldstat.c
index e5cf868..0b84501 100644
--- a/src/fieldstat.c
+++ b/src/fieldstat.c
@@ -1397,10 +1397,14 @@ void fieldstat_get_cells_used_by_cube(const struct fieldstat *instance, int cube
size_t n_cell_tmp = 0;
switch (cube->sampling_mode) {
case SAMPLING_MODE_COMPREHENSIVE:
- tag_map_list(cube->cells.comprehensive, (void ***)&cell_datas, &n_cell_tmp);
+ n_cell_tmp = tag_map_get_count(cube->cells.comprehensive);
+ cell_datas = (struct cell **)malloc(sizeof(struct cell *) * n_cell_tmp);
+ tag_map_list(cube->cells.comprehensive, (void **)cell_datas, n_cell_tmp);
break;
case SAMPLING_MODE_TOPK:
- heavy_keeper_list(cube->cells.topk, (void ***)&cell_datas, &n_cell_tmp);
+ n_cell_tmp = heavy_keeper_get_count(cube->cells.topk);
+ cell_datas = (struct cell **)malloc(sizeof(struct cell *) * n_cell_tmp);
+ heavy_keeper_list(cube->cells.topk, (void **)cell_datas, n_cell_tmp);
break;
default:
assert(0);
diff --git a/src/tags/heavy_keeper.c b/src/tags/heavy_keeper.c
index 1fd09b8..03cf7f5 100644
--- a/src/tags/heavy_keeper.c
+++ b/src/tags/heavy_keeper.c
@@ -346,8 +346,7 @@ int sorted_set_insert(struct sorted_set *ss, const char *key, size_t key_len, un
if (tmp_mincnt != INVALID_COUNT && cnt <= tmp_mincnt) { // even if all cells in sorted set are dying, the sorted set can still be a full one, in which case, the min count is invalid.
return 0;
}
- int ret = sorted_set_pop(ss);
- assert(ret != -1);
+ sorted_set_pop(ss);
}
sorted_set_insert_to_available_heap(ss, key, key_len, cnt, ss->new_fn(args));
return 1;
@@ -679,22 +678,27 @@ int heavy_keeper_get_count(const struct heavy_keeper *hk) {
return sorted_set_cardinality(hk->top_K_heap);
}
-void heavy_keeper_list(const struct heavy_keeper *hk, void ***exdatas, size_t *n_exdatas) {
- *n_exdatas = sorted_set_cardinality(hk->top_K_heap);
- if (*n_exdatas == 0) {
- *exdatas = NULL;
- return;
+size_t heavy_keeper_list(const struct heavy_keeper *hk, void **exdatas, size_t n_exdatas) {
+ size_t actual_len = sorted_set_cardinality(hk->top_K_heap);
+ if (actual_len == 0) {
+ return 0;
}
- void **exdatas_ret = (void **)malloc(sizeof(void *) * (*n_exdatas));
- *exdatas = exdatas_ret;
-
- char **keys_dummy = (char **)malloc(sizeof(char *) * (*n_exdatas));
- size_t *key_lens_dummy = (size_t *)malloc(sizeof(size_t) * (*n_exdatas));
- sorted_set_dump(hk->top_K_heap, keys_dummy, key_lens_dummy, exdatas_ret);
+ char **keys_dummy = (char **)malloc(sizeof(char *) * actual_len);
+ size_t *key_lens_dummy = (size_t *)malloc(sizeof(size_t) * actual_len);
+ if (n_exdatas < actual_len) {
+ void **exdatas_ret = (void **)malloc(sizeof(void *) * actual_len);
+ sorted_set_dump(hk->top_K_heap, keys_dummy, key_lens_dummy, exdatas_ret);
+ memcpy(exdatas, exdatas_ret, sizeof(void *) * n_exdatas);
+ free(exdatas_ret);
+ } else {
+ sorted_set_dump(hk->top_K_heap, keys_dummy, key_lens_dummy, exdatas);
+ }
free(keys_dummy);
free(key_lens_dummy);
+
+ return actual_len < n_exdatas ? actual_len : n_exdatas;
}
static void heavy_keeper_merge_sketch(struct heavy_keeper *dest, const struct heavy_keeper *src) {
diff --git a/src/tags/heavy_keeper.h b/src/tags/heavy_keeper.h
index 6660c97..0ed2709 100644
--- a/src/tags/heavy_keeper.h
+++ b/src/tags/heavy_keeper.h
@@ -33,8 +33,8 @@ void *heavy_keeper_get0_exdata(const struct heavy_keeper *hk, const char *key, s
// get the number of cells in the heavy keeper
int heavy_keeper_get_count(const struct heavy_keeper *hk);
-// size_t heavy_keeper_list(const struct heavy_keeper *hk, void **exdatas, size_t n_exdatas); //use list: void **exdatas, heavy_keeper_list(&exdatas); void *exdata = exdatas[i]; // TODO: 用户申请exdata 数组
-void heavy_keeper_list(const struct heavy_keeper *hk, void ***exdatas, size_t *n_exdatas);
+size_t heavy_keeper_list(const struct heavy_keeper *hk, void **exdatas, size_t n_exdatas);
+// void heavy_keeper_list(const struct heavy_keeper *hk, void ***exdatas, size_t *n_exdatas);
void heavy_keeper_merge(struct heavy_keeper *dest, const struct heavy_keeper *src);
diff --git a/src/tags/tag_map.c b/src/tags/tag_map.c
index 55a70a4..0c655fa 100644
--- a/src/tags/tag_map.c
+++ b/src/tags/tag_map.c
@@ -148,25 +148,25 @@ int tag_map_get_count(const struct tag_map *pthis) {
return pthis->current_cell_num;
}
-void tag_map_list(const struct tag_map *pthis, void ***exdatas, size_t *n_exdatas) {
- *n_exdatas = pthis->current_cell_num;
- if (*n_exdatas == 0) {
- *exdatas = NULL;
- return;
+size_t tag_map_list(const struct tag_map *pthis, void **exdatas, size_t n_exdatas) {
+ size_t actual_len = pthis->current_cell_num;
+ if (actual_len == 0) {
+ return 0;
}
- void **exdatas_ret = calloc(*n_exdatas, sizeof(void *));
- *exdatas = exdatas_ret;
-
struct tag_exdata_item *item, *tmp;
size_t i = 0;
HASH_ITER(hh, pthis->tag_id_map, item, tmp) {
if (item->dying) {
continue;
}
- exdatas_ret[i] = item->exdata;
+ if (i >= n_exdatas) {
+ break;
+ }
+ exdatas[i] = item->exdata;
i++;
}
+ return actual_len < n_exdatas ? actual_len : n_exdatas;
}
int tag_map_merge(struct tag_map *dest, struct tag_map *src) {
diff --git a/src/tags/tag_map.h b/src/tags/tag_map.h
index 2d8f44c..21c2716 100644
--- a/src/tags/tag_map.h
+++ b/src/tags/tag_map.h
@@ -24,7 +24,7 @@ int tag_map_add(struct tag_map *pthis, const char *key, size_t key_len, void *ar
// void *tag_map_get0_exdata(struct tag_map *pthis, const char *key, size_t key_len);
void *tag_map_get0_exdata(struct tag_map *pthis, const char *key, size_t key_len);
int tag_map_get_count(const struct tag_map *pthis);
-void tag_map_list(const struct tag_map *pthis, void ***exdatas, size_t *n_exdatas);
+size_t tag_map_list(const struct tag_map *pthis, void **exdatas, size_t n_exdatas);
#ifdef __cplusplus
}