unfinished work
This commit is contained in:
@@ -20,6 +20,27 @@
|
||||
|
||||
#define MODULE_GROUP module_name_str("maat.group")
|
||||
|
||||
struct group2group_item {
|
||||
int group_id;
|
||||
int superior_group_id;
|
||||
};
|
||||
|
||||
struct group2group_schema {
|
||||
int group_id_column;
|
||||
int superior_group_id_column;
|
||||
int table_id;//ugly
|
||||
};
|
||||
|
||||
struct group2group_runtime {
|
||||
struct maat_group_topology *group_topo;
|
||||
|
||||
uint32_t rule_num;
|
||||
uint32_t updating_rule_num;
|
||||
|
||||
struct maat_garbage_bin *ref_garbage_bin;
|
||||
struct log_handle *logger;
|
||||
};
|
||||
|
||||
struct maat_group_topology {
|
||||
struct maat_group *hash_group_by_id; //key: group_id, value: struct maat_group *.
|
||||
struct maat_group *hash_group_by_vertex; //key: vetex_id, value: struct maat_group *. Multimap (Items with multiple keys).
|
||||
@@ -32,6 +53,116 @@ struct maat_group_topology {
|
||||
struct log_handle *logger;
|
||||
};
|
||||
|
||||
void *group2group_schema_new(cJSON *json, const char *table_name, struct log_handle *logger)
|
||||
{
|
||||
int read_cnt = 0;
|
||||
struct group2group_schema *g2g_schema = ALLOC(struct group2group_schema, 1);
|
||||
|
||||
cJSON *custom_item = NULL;
|
||||
cJSON *item = cJSON_GetObjectItem(json, "table_id");
|
||||
if (NULL == item || item->type != cJSON_Number) {
|
||||
goto error;
|
||||
}
|
||||
g2g_schema->table_id = item->valueint;
|
||||
|
||||
item = cJSON_GetObjectItem(json, "custom");
|
||||
if (item == NULL || item->type != cJSON_Object) {
|
||||
log_error(logger, MODULE_GROUP, "table %s has no custom column", table_name);
|
||||
goto error;
|
||||
}
|
||||
|
||||
custom_item = cJSON_GetObjectItem(item, "group_id");
|
||||
if (custom_item != NULL && custom_item->type == cJSON_Number) {
|
||||
g2g_schema->group_id_column = custom_item->valueint;
|
||||
read_cnt++;
|
||||
}
|
||||
|
||||
custom_item = cJSON_GetObjectItem(item, "superior_group_id");
|
||||
if (custom_item != NULL && custom_item->type == cJSON_Number) {
|
||||
g2g_schema->superior_group_id_column = custom_item->valueint;
|
||||
read_cnt++;
|
||||
}
|
||||
|
||||
if (read_cnt < 2) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
return g2g_schema;
|
||||
error:
|
||||
FREE(g2c_schema);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void group2group_schema_free(void *g2g_schema)
|
||||
{
|
||||
FREE(g2g_schema);
|
||||
}
|
||||
|
||||
struct group2group_runtime *
|
||||
group2group_runtime_new(void *ip_plus_schema, struct maat_garbage_bin *garbage_bin,
|
||||
struct log_handle *logger)
|
||||
{
|
||||
struct group2group_runtime *g2g_rt = ALLOC(struct group2group_runtime, 1);
|
||||
|
||||
g2g_rt->group_topo = maat_group_topology_new(logger);
|
||||
g2g_rt->ref_garbage_bin = garbage_bin;
|
||||
g2g_rt->logger = logger;
|
||||
|
||||
return g2g_rt;
|
||||
}
|
||||
|
||||
void group2group_runtime_free(void *g2g_runtime)
|
||||
{
|
||||
if (NULL == g2g_runtime) {
|
||||
return;
|
||||
}
|
||||
|
||||
struct group2group_runtime *g2g_rt = (struct group2group_runtime *)g2g_runtime;
|
||||
|
||||
if (g2g_rt->group_topo != NULL) {
|
||||
maat_group_topology_free(g2g_rt->group_topo);
|
||||
}
|
||||
|
||||
FREE(g2g_rt);
|
||||
}
|
||||
|
||||
struct group2group_item *
|
||||
group2group_item_new(const char *line, struct group2group_schema *g2g_schema,
|
||||
struct log_handle *logger)
|
||||
{
|
||||
size_t column_offset = 0;
|
||||
size_t column_len = 0;
|
||||
struct group2group_item *g2g_item = ALLOC(struct group2group_item, 1);
|
||||
|
||||
int ret = get_column_pos(line, g2g_schema->group_id_column, &column_offset, &column_len);
|
||||
if (ret < 0) {
|
||||
log_error(logger, MODULE_GROUP,
|
||||
"group2group table(table_id:%d) line:%s has no group_id",
|
||||
g2g_schema->table_id, line);
|
||||
goto error;
|
||||
}
|
||||
g2g_item->group_id = atoi(line + column_offset);
|
||||
|
||||
ret = get_column_pos(line, g2g_schema->superior_group_id_column, &column_offset, &column_len);
|
||||
if (ret < 0) {
|
||||
log_error(logger, MODULE_GROUP,
|
||||
"group2group table(table_id:%d) line:%s has no superior_group_id",
|
||||
g2g_schema->table_id, line);
|
||||
goto error;
|
||||
}
|
||||
g2g_item->superior_group_id = atoi(line + column_offset);
|
||||
|
||||
return g2g_item;
|
||||
error:
|
||||
FREE(g2g_item);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void group2group_item_free(struct group2group_item *g2g_item)
|
||||
{
|
||||
FREE(g2g_item);
|
||||
}
|
||||
|
||||
void group_vertex_free(struct maat_group *group)
|
||||
{
|
||||
free(group->top_group_ids);
|
||||
@@ -260,8 +391,7 @@ int maat_group_topology_build_top_groups(struct maat_group_topology *group_topo)
|
||||
//Orphan, Not reference by any one, free it.
|
||||
if (0 == group->ref_by_compile_cnt
|
||||
&& 0 == group->ref_by_superior_group_cnt
|
||||
&& 0 == group->ref_by_subordinate_group_cnt
|
||||
&& 0 == group->ref_by_item_cnt) {
|
||||
&& 0 == group->ref_by_subordinate_group_cnt) {
|
||||
|
||||
FREE(group->top_group_ids);
|
||||
maat_group_topology_remove_group(group_topo, group);
|
||||
@@ -269,8 +399,7 @@ int maat_group_topology_build_top_groups(struct maat_group_topology *group_topo)
|
||||
}
|
||||
|
||||
//A group is need to build top groups when it has items and referenced by superior groups or compiles.
|
||||
if (group->ref_by_item_cnt > 0 &&
|
||||
(group->ref_by_compile_cnt > 0 || group->ref_by_superior_group_cnt > 0)) {
|
||||
if (group->ref_by_compile_cnt > 0 || group->ref_by_superior_group_cnt > 0) {
|
||||
if (0 == group->ref_by_superior_group_cnt) {
|
||||
//fast path, group is only referenced by compile rules.
|
||||
top_group_cnt = 1;
|
||||
@@ -310,4 +439,74 @@ int maat_group_topology_build_top_groups(struct maat_group_topology *group_topo)
|
||||
igraph_vector_destroy(&group_topo->dfs_vids);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int group2group_runtime_update(void *g2g_runtime, void *g2g_schema, const char *line,
|
||||
int valid_column)
|
||||
{
|
||||
if (NULL == g2g_runtime || NULL == g2g_schema || NULL == line) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
int ret = -1;
|
||||
struct group2group_item *g2g_item = NULL;
|
||||
struct group2group_schema *schema = (struct group2group_schema *)g2g_schema;
|
||||
struct group2group_runtime *g2g_rt = (struct group2group_runtime *)g2g_runtime;
|
||||
int item_id = get_column_value(line, schema->table_id);
|
||||
int is_valid = get_column_value(line, valid_column);
|
||||
if (is_valid < 0) {
|
||||
return -1;
|
||||
} else if (0 == is_valid) {
|
||||
//delete
|
||||
ret = maat_group_topology_remove_group_from_group(g2g_rt->group_topo, g2g_item->group_id, g2g_item->superior_group_id);
|
||||
} else {
|
||||
//add
|
||||
g2g_item = group2group_item_new(line, schema, logger);
|
||||
}
|
||||
|
||||
if (1 == is_valid) {
|
||||
//add
|
||||
ret = maat_group_topology_add_group_to_group(g2g_rt->group_topo, g2g_item->group_id, g2g_item->superior_group_id);
|
||||
} else {
|
||||
//delete
|
||||
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int group2group_runtime_commit(void *g2g_runtime)
|
||||
{
|
||||
if (NULL == g2g_runtime) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct group2group_runtime *g2g_rt = (struct group2group_runtime *)g2g_runtime;
|
||||
int ret = maat_group_topology_build_top_groups(g2g_rt->group_topo);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int group2group_runtime_get_top_groups(struct group2group_runtime *g2g_rt, int *group_ids, size_t n_group_ids,
|
||||
int *top_group_ids)
|
||||
{
|
||||
if (NULL == table_rt || NULL == group_ids || 0 == n_group_ids ||
|
||||
table_rt->table_type != TABLE_TYPE_GROUP2GROUP) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
size_t top_group_index = 0;
|
||||
struct group2group_runtime *g2g_rt = &(table_rt->g2g_rt);
|
||||
for (size_t i = 0; i < n_group_ids; i++) {
|
||||
struct maat_group *group = maat_group_topology_find_group(g2g_rt->group_topo, group_ids[i]);
|
||||
if (!group) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (size_t j = 0; j < group->top_group_cnt; j++) {
|
||||
top_group_ids[top_group_index++] = group->top_group_ids[j];
|
||||
}
|
||||
}
|
||||
|
||||
return top_group_index;
|
||||
}
|
||||
Reference in New Issue
Block a user