[BUGFIX]fix hit paths miss path if sub group(has super group) is referenced by compile
This commit is contained in:
@@ -66,7 +66,7 @@ int compile_runtime_match(struct compile_runtime *compile_rt, long long *compile
|
|||||||
size_t compile_runtime_get_hit_paths(struct compile_runtime *compile_rt,
|
size_t compile_runtime_get_hit_paths(struct compile_runtime *compile_rt,
|
||||||
struct maat_compile_state *compile_state,
|
struct maat_compile_state *compile_state,
|
||||||
struct maat_hit_path *hit_path_array,
|
struct maat_hit_path *hit_path_array,
|
||||||
size_t array_size, size_t hit_path_cnt);
|
size_t array_size, size_t n_internal_hit_path);
|
||||||
|
|
||||||
void *compile_runtime_get_ex_data(struct compile_runtime *compile_rt,
|
void *compile_runtime_get_ex_data(struct compile_runtime *compile_rt,
|
||||||
struct compile_schema *compile_schema,
|
struct compile_schema *compile_schema,
|
||||||
@@ -100,9 +100,10 @@ void maat_compile_state_update(int vtable_id, struct maat_item *hit_items,
|
|||||||
size_t n_hit_item, struct maat_state *state);
|
size_t n_hit_item, struct maat_state *state);
|
||||||
|
|
||||||
size_t maat_compile_state_get_internal_hit_paths(struct maat_compile_state *compile_state,
|
size_t maat_compile_state_get_internal_hit_paths(struct maat_compile_state *compile_state,
|
||||||
struct group2group_runtime *g2g_rt,
|
struct compile_runtime *compile_rt,
|
||||||
struct maat_hit_path *hit_path_array,
|
struct group2group_runtime *g2g_rt,
|
||||||
size_t array_size);
|
struct maat_hit_path *hit_path_array,
|
||||||
|
size_t array_size);
|
||||||
|
|
||||||
int maat_compile_state_has_NOT_clause(struct maat_compile_state *compile_state);
|
int maat_compile_state_has_NOT_clause(struct maat_compile_state *compile_state);
|
||||||
|
|
||||||
|
|||||||
@@ -40,6 +40,7 @@
|
|||||||
#include "maat_bool_plugin.h"
|
#include "maat_bool_plugin.h"
|
||||||
#include "maat_virtual.h"
|
#include "maat_virtual.h"
|
||||||
#include "maat_stat.h"
|
#include "maat_stat.h"
|
||||||
|
#include "uthash/utarray.h"
|
||||||
|
|
||||||
#define MODULE_MAAT_API module_name_str("maat.api")
|
#define MODULE_MAAT_API module_name_str("maat.api")
|
||||||
|
|
||||||
@@ -1804,19 +1805,20 @@ int maat_state_get_hit_paths(struct maat_state *state, struct maat_hit_path *pat
|
|||||||
compile_table_id = maat_instance->default_compile_table_id;
|
compile_table_id = maat_instance->default_compile_table_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *g2g_runtime = table_manager_get_runtime(maat_instance->tbl_mgr, maat_instance->g2g_table_id);
|
|
||||||
size_t internal_hit_path_cnt = maat_compile_state_get_internal_hit_paths(state->compile_state,
|
|
||||||
(struct group2group_runtime *)g2g_runtime,
|
|
||||||
paths, n_path);
|
|
||||||
|
|
||||||
void *compile_rt = table_manager_get_runtime(maat_instance->tbl_mgr, compile_table_id);
|
void *compile_rt = table_manager_get_runtime(maat_instance->tbl_mgr, compile_table_id);
|
||||||
if (NULL == compile_rt) {
|
if (NULL == compile_rt) {
|
||||||
return internal_hit_path_cnt;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *g2g_runtime = table_manager_get_runtime(maat_instance->tbl_mgr, maat_instance->g2g_table_id);
|
||||||
|
size_t internal_hit_path_cnt = maat_compile_state_get_internal_hit_paths(state->compile_state,
|
||||||
|
(struct compile_runtime *)compile_rt,
|
||||||
|
(struct group2group_runtime *)g2g_runtime,
|
||||||
|
paths, n_path);
|
||||||
|
|
||||||
return compile_runtime_get_hit_paths((struct compile_runtime *)compile_rt,
|
return compile_runtime_get_hit_paths((struct compile_runtime *)compile_rt,
|
||||||
state->compile_state, paths, n_path,
|
state->compile_state, paths, n_path,
|
||||||
internal_hit_path_cnt);
|
internal_hit_path_cnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
int maat_state_get_hit_objects(struct maat_state *state, struct maat_hit_object *objs, size_t n_obj)
|
int maat_state_get_hit_objects(struct maat_state *state, struct maat_hit_object *objs, size_t n_obj)
|
||||||
|
|||||||
@@ -93,6 +93,12 @@ struct compile_rule {
|
|||||||
char table_name[NAME_MAX];
|
char table_name[NAME_MAX];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct group_reference {
|
||||||
|
long long group_id;
|
||||||
|
size_t ref_by_compile_cnt;
|
||||||
|
UT_hash_handle hh;
|
||||||
|
};
|
||||||
|
|
||||||
/* compile_runtime and group2compile_runtime share compile_hash_map */
|
/* compile_runtime and group2compile_runtime share compile_hash_map */
|
||||||
struct compile_runtime {
|
struct compile_runtime {
|
||||||
struct bool_matcher *bm;
|
struct bool_matcher *bm;
|
||||||
@@ -101,6 +107,8 @@ struct compile_runtime {
|
|||||||
time_t version;
|
time_t version;
|
||||||
struct maat_clause *clause_by_literals_hash;
|
struct maat_clause *clause_by_literals_hash;
|
||||||
struct literal_clause *literal2clause_hash;
|
struct literal_clause *literal2clause_hash;
|
||||||
|
struct group_reference *group_ref_hash;
|
||||||
|
pthread_mutex_t mutex;
|
||||||
long long rule_num;
|
long long rule_num;
|
||||||
long long update_err_cnt;
|
long long update_err_cnt;
|
||||||
struct bool_expr_match *expr_match_buff;
|
struct bool_expr_match *expr_match_buff;
|
||||||
@@ -573,8 +581,11 @@ void *compile_runtime_new(void *compile_schema, size_t max_thread_num,
|
|||||||
compile_rt->version = time(NULL);
|
compile_rt->version = time(NULL);
|
||||||
compile_rt->cfg_hash_tbl = rcu_hash_new(rcu_maat_compile_free, NULL);
|
compile_rt->cfg_hash_tbl = rcu_hash_new(rcu_maat_compile_free, NULL);
|
||||||
compile_rt->clause_by_literals_hash = NULL;
|
compile_rt->clause_by_literals_hash = NULL;
|
||||||
|
compile_rt->literal2clause_hash = NULL;
|
||||||
|
compile_rt->group_ref_hash = NULL;
|
||||||
compile_rt->logger = logger;
|
compile_rt->logger = logger;
|
||||||
compile_rt->ref_garbage_bin = garbage_bin;
|
compile_rt->ref_garbage_bin = garbage_bin;
|
||||||
|
pthread_mutex_init(&(compile_rt->mutex), NULL);
|
||||||
|
|
||||||
return compile_rt;
|
return compile_rt;
|
||||||
}
|
}
|
||||||
@@ -591,7 +602,7 @@ static void maat_clause_hash_free(struct maat_clause *clause_hash)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void literal2clause_hash_free(struct literal_clause *hash)
|
static void literal2clause_hash_free(struct literal_clause *hash)
|
||||||
{
|
{
|
||||||
struct literal_clause *l2c_val = NULL, *tmp_l2c_val = NULL;
|
struct literal_clause *l2c_val = NULL, *tmp_l2c_val = NULL;
|
||||||
|
|
||||||
@@ -607,6 +618,17 @@ void literal2clause_hash_free(struct literal_clause *hash)
|
|||||||
assert(hash == NULL);
|
assert(hash == NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void group_reference_hash_free(struct group_reference *group_ref_hash)
|
||||||
|
{
|
||||||
|
struct group_reference *group_ref = NULL, *tmp_group_ref = NULL;
|
||||||
|
|
||||||
|
HASH_ITER(hh, group_ref_hash, group_ref, tmp_group_ref) {
|
||||||
|
HASH_DEL(group_ref_hash, group_ref);
|
||||||
|
FREE(group_ref);
|
||||||
|
}
|
||||||
|
assert(group_ref_hash == NULL);
|
||||||
|
}
|
||||||
|
|
||||||
void garbage_literal2clause_hash_free(void *l2c_hash, void *arg)
|
void garbage_literal2clause_hash_free(void *l2c_hash, void *arg)
|
||||||
{
|
{
|
||||||
literal2clause_hash_free((struct literal_clause *)l2c_hash);
|
literal2clause_hash_free((struct literal_clause *)l2c_hash);
|
||||||
@@ -640,6 +662,14 @@ void compile_runtime_free(void *compile_runtime)
|
|||||||
compile_rt->clause_by_literals_hash = NULL;
|
compile_rt->clause_by_literals_hash = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pthread_mutex_lock(&(compile_rt->mutex));
|
||||||
|
if (compile_rt->group_ref_hash != NULL) {
|
||||||
|
group_reference_hash_free(compile_rt->group_ref_hash);
|
||||||
|
compile_rt->group_ref_hash = NULL;
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&(compile_rt->mutex));
|
||||||
|
pthread_mutex_destroy(&(compile_rt->mutex));
|
||||||
|
|
||||||
if (compile_rt->expr_match_buff != NULL) {
|
if (compile_rt->expr_match_buff != NULL) {
|
||||||
FREE(compile_rt->expr_match_buff);
|
FREE(compile_rt->expr_match_buff);
|
||||||
}
|
}
|
||||||
@@ -1457,7 +1487,7 @@ static int maat_compile_hit_path_add(UT_array *hit_paths, long long item_id, lon
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int maat_compile_has_literal(struct maat_compile* compile,
|
static int maat_compile_has_literal(struct maat_compile *compile,
|
||||||
struct maat_literal_id *literal_id)
|
struct maat_literal_id *literal_id)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@@ -1503,7 +1533,6 @@ size_t compile_runtime_get_hit_paths(struct compile_runtime *compile_rt,
|
|||||||
size_t new_hit_path_cnt = 0;
|
size_t new_hit_path_cnt = 0;
|
||||||
struct maat_compile *compile = NULL;
|
struct maat_compile *compile = NULL;
|
||||||
struct maat_literal_id literal_id = {0, 0};
|
struct maat_literal_id literal_id = {0, 0};
|
||||||
struct maat_hit_path tmp_path;
|
|
||||||
struct bool_expr_match *expr_match = compile_rt->expr_match_buff + compile_state->thread_id * MAX_SCANNER_HIT_COMPILE_NUM;
|
struct bool_expr_match *expr_match = compile_rt->expr_match_buff + compile_state->thread_id * MAX_SCANNER_HIT_COMPILE_NUM;
|
||||||
assert(compile_state->thread_id >= 0);
|
assert(compile_state->thread_id >= 0);
|
||||||
|
|
||||||
@@ -1540,7 +1569,7 @@ size_t compile_runtime_get_hit_paths(struct compile_runtime *compile_rt,
|
|||||||
hit_path_array[j].compile_id = compile->compile_id;
|
hit_path_array[j].compile_id = compile->compile_id;
|
||||||
} else {
|
} else {
|
||||||
// means same literal_id hit more than one compile_id
|
// means same literal_id hit more than one compile_id
|
||||||
tmp_path = hit_path_array[j];
|
struct maat_hit_path tmp_path = hit_path_array[j];
|
||||||
tmp_path.compile_id = compile->compile_id;
|
tmp_path.compile_id = compile->compile_id;
|
||||||
if(maat_compile_is_hit_path_existed(hit_path_array, n_internal_hit_path + new_hit_path_cnt, &tmp_path)) {
|
if(maat_compile_is_hit_path_existed(hit_path_array, n_internal_hit_path + new_hit_path_cnt, &tmp_path)) {
|
||||||
hit_path_array[n_internal_hit_path + new_hit_path_cnt] = tmp_path;
|
hit_path_array[n_internal_hit_path + new_hit_path_cnt] = tmp_path;
|
||||||
@@ -1846,9 +1875,24 @@ int group2compile_runtime_update(void *g2c_runtime, void *g2c_schema,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct group_reference *group_ref = NULL;
|
||||||
if (0 == is_valid) {
|
if (0 == is_valid) {
|
||||||
//delete
|
//delete
|
||||||
ret = maat_remove_group_from_compile(compile_rt->cfg_hash_tbl, g2c_item, compile_rt->logger);
|
pthread_mutex_lock(&(compile_rt->mutex));
|
||||||
|
HASH_FIND(hh, compile_rt->group_ref_hash, (char *)&(g2c_item->group_id),
|
||||||
|
sizeof(long long), group_ref);
|
||||||
|
if (group_ref != NULL) {
|
||||||
|
if (0 == group_ref->ref_by_compile_cnt) {
|
||||||
|
HASH_DEL(compile_rt->group_ref_hash, group_ref);
|
||||||
|
FREE(group_ref);
|
||||||
|
} else {
|
||||||
|
group_ref->ref_by_compile_cnt--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&(compile_rt->mutex));
|
||||||
|
|
||||||
|
ret = maat_remove_group_from_compile(compile_rt->cfg_hash_tbl, g2c_item,
|
||||||
|
compile_rt->logger);
|
||||||
if (0 == ret) {
|
if (0 == ret) {
|
||||||
if (g2c_item->not_flag) {
|
if (g2c_item->not_flag) {
|
||||||
g2c_rt->not_flag_group--;
|
g2c_rt->not_flag_group--;
|
||||||
@@ -1859,6 +1903,18 @@ int group2compile_runtime_update(void *g2c_runtime, void *g2c_schema,
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//add
|
//add
|
||||||
|
pthread_mutex_lock(&(compile_rt->mutex));
|
||||||
|
HASH_FIND(hh, compile_rt->group_ref_hash, (char *)&(g2c_item->group_id),
|
||||||
|
sizeof(long long), group_ref);
|
||||||
|
if (NULL == group_ref) {
|
||||||
|
group_ref = ALLOC(struct group_reference, 1);
|
||||||
|
group_ref->group_id = g2c_item->group_id;
|
||||||
|
HASH_ADD_KEYPTR(hh, compile_rt->group_ref_hash, (char *)&(group_ref->group_id),
|
||||||
|
sizeof(long long), group_ref);
|
||||||
|
}
|
||||||
|
group_ref->ref_by_compile_cnt++;
|
||||||
|
pthread_mutex_unlock(&(compile_rt->mutex));
|
||||||
|
|
||||||
ret = maat_add_group_to_compile(compile_rt->cfg_hash_tbl, g2c_item, compile_rt->logger);
|
ret = maat_add_group_to_compile(compile_rt->cfg_hash_tbl, g2c_item, compile_rt->logger);
|
||||||
if (0 == ret) {
|
if (0 == ret) {
|
||||||
if (g2c_item->not_flag) {
|
if (g2c_item->not_flag) {
|
||||||
@@ -1874,6 +1930,20 @@ int group2compile_runtime_update(void *g2c_runtime, void *g2c_schema,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int group_referenced_by_compile(struct compile_runtime *compile_rt, long long group_id)
|
||||||
|
{
|
||||||
|
struct group_reference *group_ref = NULL;
|
||||||
|
pthread_mutex_lock(&(compile_rt->mutex));
|
||||||
|
HASH_FIND(hh, compile_rt->group_ref_hash, (char *)&group_id, sizeof(long long), group_ref);
|
||||||
|
if (group_ref != NULL) {
|
||||||
|
pthread_mutex_unlock(&(compile_rt->mutex));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&(compile_rt->mutex));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
long long group2compile_runtime_not_group_count(void *g2c_runtime)
|
long long group2compile_runtime_not_group_count(void *g2c_runtime)
|
||||||
{
|
{
|
||||||
if (NULL == g2c_runtime) {
|
if (NULL == g2c_runtime) {
|
||||||
@@ -2090,7 +2160,9 @@ void maat_compile_state_update(int vtable_id, struct maat_item *hit_items,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UT_icd ut_compile_group_id_icd = {sizeof(long long), NULL, NULL, NULL};
|
||||||
size_t maat_compile_state_get_internal_hit_paths(struct maat_compile_state *compile_state,
|
size_t maat_compile_state_get_internal_hit_paths(struct maat_compile_state *compile_state,
|
||||||
|
struct compile_runtime *compile_rt,
|
||||||
struct group2group_runtime *g2g_rt,
|
struct group2group_runtime *g2g_rt,
|
||||||
struct maat_hit_path *hit_path_array,
|
struct maat_hit_path *hit_path_array,
|
||||||
size_t array_size)
|
size_t array_size)
|
||||||
@@ -2104,46 +2176,54 @@ size_t maat_compile_state_get_internal_hit_paths(struct maat_compile_state *comp
|
|||||||
NOTE: maybe one item has been deleted, but it's item_id still exist in internal_hit_paths
|
NOTE: maybe one item has been deleted, but it's item_id still exist in internal_hit_paths
|
||||||
*/
|
*/
|
||||||
long long super_group_ids[MAX_SCANNER_HIT_GROUP_NUM];
|
long long super_group_ids[MAX_SCANNER_HIT_GROUP_NUM];
|
||||||
memset(super_group_ids, -1, sizeof(super_group_ids));
|
UT_array *valid_super_group_ids;
|
||||||
|
utarray_new(valid_super_group_ids, &ut_compile_group_id_icd);
|
||||||
|
|
||||||
size_t super_group_cnt = group2group_runtime_get_super_groups(g2g_rt, &(internal_path->group_id), 1,
|
size_t super_group_cnt = group2group_runtime_get_super_groups(g2g_rt, &(internal_path->group_id), 1,
|
||||||
super_group_ids, MAX_SCANNER_HIT_GROUP_NUM);
|
super_group_ids, MAX_SCANNER_HIT_GROUP_NUM);
|
||||||
if (0 == super_group_cnt) {
|
/* if super group is not referenced by compile, drop it */
|
||||||
/*
|
for (size_t idx = 0; idx < super_group_cnt; idx++) {
|
||||||
item->group_id has no top group, this group can only be referenced by compile
|
if (0 == group_referenced_by_compile(compile_rt, super_group_ids[idx])) {
|
||||||
------------------------------------------------------------------------------
|
continue;
|
||||||
for example:
|
}
|
||||||
compile1 -> group1 -> group2 -> item1
|
utarray_push_back(valid_super_group_ids, &super_group_ids[idx]);
|
||||||
group3 -> item2
|
|
||||||
|
|
||||||
group1 and group3 has no top group
|
|
||||||
group1 is referenced by compile1, group3 is not referenced by any compile
|
|
||||||
|
|
||||||
NOTE: Add the hit path as long as the item is hit
|
|
||||||
|
|
||||||
*/
|
|
||||||
super_group_cnt = 1; // add one hit path which top_group_ids[0] = -1
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
if internal_path->group_id can be referenced directly by compile,
|
||||||
|
so add it to hit_path which super_group_ids is -1
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
NOTE: Add the hit path as long as the item is hit
|
||||||
|
*/
|
||||||
|
if (0 == utarray_len(valid_super_group_ids)) {
|
||||||
|
long long super_group_id = -1;
|
||||||
|
utarray_push_back(valid_super_group_ids, &super_group_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
long long *p = NULL;
|
||||||
struct maat_hit_path tmp_path;
|
struct maat_hit_path tmp_path;
|
||||||
for (int j = 0; j < super_group_cnt && hit_path_cnt < array_size; j++) {
|
|
||||||
|
for (p = utarray_front(valid_super_group_ids); p != NULL && hit_path_cnt < array_size;
|
||||||
|
p = utarray_next(valid_super_group_ids, p)) {
|
||||||
memset(&tmp_path, 0, sizeof(tmp_path));
|
memset(&tmp_path, 0, sizeof(tmp_path));
|
||||||
tmp_path.Nth_scan = internal_path->Nth_scan;
|
tmp_path.Nth_scan = internal_path->Nth_scan;
|
||||||
tmp_path.item_id = internal_path->item_id;
|
tmp_path.item_id = internal_path->item_id;
|
||||||
tmp_path.sub_group_id = internal_path->group_id;
|
tmp_path.sub_group_id = internal_path->group_id;
|
||||||
tmp_path.top_group_id = super_group_ids[j];
|
tmp_path.top_group_id = *p;
|
||||||
tmp_path.vtable_id = internal_path->vtable_id;
|
tmp_path.vtable_id = internal_path->vtable_id;
|
||||||
tmp_path.compile_id = -1;
|
tmp_path.compile_id = -1;
|
||||||
|
|
||||||
/* check if internal_path is duplicated from hit_path_array[] element */
|
/* check if internal_path is duplicated from hit_path_array[] element */
|
||||||
if (hit_path_cnt > 0) {
|
if (hit_path_cnt > 0) {
|
||||||
if (maat_compile_is_hit_path_existed(hit_path_array, hit_path_cnt, &tmp_path)) {
|
if (maat_compile_is_hit_path_existed(hit_path_array, hit_path_cnt, &tmp_path)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hit_path_array[hit_path_cnt] = tmp_path;
|
hit_path_array[hit_path_cnt] = tmp_path;
|
||||||
hit_path_cnt++;
|
hit_path_cnt++;
|
||||||
}
|
}
|
||||||
|
utarray_free(valid_super_group_ids);
|
||||||
}
|
}
|
||||||
|
|
||||||
return hit_path_cnt;
|
return hit_path_cnt;
|
||||||
|
|||||||
@@ -1,90 +1,100 @@
|
|||||||
{
|
{
|
||||||
"add_items": [
|
"add_items": [
|
||||||
{
|
{
|
||||||
"group_id": 1,
|
"group_id": 8,
|
||||||
"super_group_id": 6,
|
"super_group_id": 5,
|
||||||
"is_exclude": 0
|
"is_exclude": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group_id": 2,
|
"group_id": 9,
|
||||||
"super_group_id": 9,
|
"super_group_id": 1,
|
||||||
"is_exclude": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"group_id": 4,
|
|
||||||
"super_group_id": 7,
|
|
||||||
"is_exclude": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"group_id": 4,
|
|
||||||
"super_group_id": 8,
|
|
||||||
"is_exclude": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"group_id": 5,
|
|
||||||
"super_group_id": 8,
|
|
||||||
"is_exclude": 0
|
"is_exclude": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group_id": 6,
|
"group_id": 6,
|
||||||
"super_group_id": 9,
|
"super_group_id": 1,
|
||||||
"is_exclude": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"group_id": 7,
|
|
||||||
"super_group_id": 9,
|
|
||||||
"is_exclude": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"group_id": 8,
|
|
||||||
"super_group_id": 10,
|
|
||||||
"is_exclude": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"group_id": 8,
|
|
||||||
"super_group_id": 13,
|
|
||||||
"is_exclude": 0
|
"is_exclude": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group_id": 11,
|
"group_id": 11,
|
||||||
"super_group_id": 12,
|
"super_group_id": 6,
|
||||||
"is_exclude": 0
|
"is_exclude": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group_id": 2,
|
"group_id": 11,
|
||||||
"super_group_id": 6,
|
"super_group_id": 7,
|
||||||
|
"is_exclude": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group_id": 12,
|
||||||
|
"super_group_id": 7,
|
||||||
|
"is_exclude": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group_id": 7,
|
||||||
|
"super_group_id": 2,
|
||||||
|
"is_exclude": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group_id": 7,
|
||||||
|
"super_group_id": 4,
|
||||||
|
"is_exclude": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group_id": 13,
|
||||||
|
"super_group_id": 3,
|
||||||
|
"is_exclude": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group_id": 9,
|
||||||
|
"super_group_id": 5,
|
||||||
"is_exclude": 1
|
"is_exclude": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group_id": 3,
|
"group_id": 5,
|
||||||
|
"super_group_id": 1,
|
||||||
|
"is_exclude": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group_id": 10,
|
||||||
|
"super_group_id":6,
|
||||||
|
"is_exclude": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group_id": 10,
|
||||||
"super_group_id": 7,
|
"super_group_id": 7,
|
||||||
"is_exclude": 1
|
"is_exclude": 1
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"group_id": 3,
|
|
||||||
"super_group_id": 8,
|
|
||||||
"is_exclude": 1
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"group_id": 7,
|
"group_id": 7,
|
||||||
"super_group_id": 10,
|
"super_group_id": 6,
|
||||||
"is_exclude": 1
|
"is_exclude": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group_id": 7,
|
"group_id": 6,
|
||||||
"super_group_id": 12,
|
"super_group_id": 2,
|
||||||
"is_exclude": 1
|
"is_exclude": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group_id": 11,
|
"group_id": 6,
|
||||||
"super_group_id": 13,
|
"super_group_id": 3,
|
||||||
|
"is_exclude": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group_id": 13,
|
||||||
|
"super_group_id": 4,
|
||||||
"is_exclude": 1
|
"is_exclude": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"del_items": [
|
"del_items": [
|
||||||
{
|
{
|
||||||
"group_id": 11,
|
"group_id": 7,
|
||||||
"super_group_id": 13,
|
"super_group_id": 6,
|
||||||
|
"is_exclude": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group_id": 13,
|
||||||
|
"super_group_id": 4,
|
||||||
"is_exclude": 1
|
"is_exclude": 1
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 202 KiB After Width: | Height: | Size: 200 KiB |
@@ -169,7 +169,6 @@ TEST_F(MaatGroupExclude, level_3_basic) {
|
|||||||
char table_line[1024];
|
char table_line[1024];
|
||||||
struct group2group_rule rules;
|
struct group2group_rule rules;
|
||||||
const char *table_name = "EXCLUDE_GROUP2GROUP";
|
const char *table_name = "EXCLUDE_GROUP2GROUP";
|
||||||
//struct log_handle *logger = MaatGroupExclude::logger;
|
|
||||||
|
|
||||||
int ret = parse_config_file("group_exclude_L3.conf", &rules);
|
int ret = parse_config_file("group_exclude_L3.conf", &rules);
|
||||||
EXPECT_EQ(ret, 0);
|
EXPECT_EQ(ret, 0);
|
||||||
@@ -184,13 +183,42 @@ TEST_F(MaatGroupExclude, level_3_basic) {
|
|||||||
|
|
||||||
group2group_runtime_commit(g2g_runtime, table_name, 1);
|
group2group_runtime_commit(g2g_runtime, table_name, 1);
|
||||||
|
|
||||||
long long hit_group_ids[2] = {11, 4};
|
long long hit_group_ids[2] = {11, 13};
|
||||||
long long super_group_ids[MAX_ITEM_NUM];
|
long long super_group_ids[MAX_ITEM_NUM];
|
||||||
size_t super_group_cnt = group2group_runtime_get_super_groups(g2g_runtime, hit_group_ids, 2,
|
size_t super_group_cnt = group2group_runtime_get_super_groups(g2g_runtime, hit_group_ids, 2,
|
||||||
super_group_ids, MAX_ITEM_NUM);
|
super_group_ids, MAX_ITEM_NUM);
|
||||||
for (size_t i = 0; i < super_group_cnt; i++) {
|
EXPECT_EQ(super_group_cnt, 2);
|
||||||
printf("super_group_ids[%zu]:%lld\n", i, super_group_ids[i]);
|
EXPECT_EQ(super_group_ids[0], 2);
|
||||||
}
|
EXPECT_EQ(super_group_ids[1], 7);
|
||||||
|
|
||||||
|
//delete group_id = 7, super_group_id = 6, is_exclude = 1
|
||||||
|
memset(table_line, 0, sizeof(table_line));
|
||||||
|
sprintf(table_line, "%lld\t%lld\t%d\t%d", rules.del_items[0].group_id,
|
||||||
|
rules.del_items[0].super_group_id, rules.del_items[0].is_exclude, 0);
|
||||||
|
group2group_runtime_update(g2g_runtime, g2g_schema, table_name, table_line, 4);
|
||||||
|
group2group_runtime_commit(g2g_runtime, table_name, 2);
|
||||||
|
|
||||||
|
super_group_cnt = group2group_runtime_get_super_groups(g2g_runtime, hit_group_ids, 2,
|
||||||
|
super_group_ids, MAX_ITEM_NUM);
|
||||||
|
EXPECT_EQ(super_group_cnt, 3);
|
||||||
|
EXPECT_EQ(super_group_ids[0], 1);
|
||||||
|
EXPECT_EQ(super_group_ids[1], 6);
|
||||||
|
EXPECT_EQ(super_group_ids[2], 7);
|
||||||
|
|
||||||
|
//delete group_id = 13, super_group_id = 4, is_exclude = 1
|
||||||
|
memset(table_line, 0, sizeof(table_line));
|
||||||
|
sprintf(table_line, "%lld\t%lld\t%d\t%d", rules.del_items[1].group_id,
|
||||||
|
rules.del_items[1].super_group_id, rules.del_items[1].is_exclude, 0);
|
||||||
|
group2group_runtime_update(g2g_runtime, g2g_schema, table_name, table_line, 4);
|
||||||
|
group2group_runtime_commit(g2g_runtime, table_name, 3);
|
||||||
|
|
||||||
|
super_group_cnt = group2group_runtime_get_super_groups(g2g_runtime, hit_group_ids, 2,
|
||||||
|
super_group_ids, MAX_ITEM_NUM);
|
||||||
|
EXPECT_EQ(super_group_cnt, 4);
|
||||||
|
EXPECT_EQ(super_group_ids[0], 1);
|
||||||
|
EXPECT_EQ(super_group_ids[1], 4);
|
||||||
|
EXPECT_EQ(super_group_ids[2], 6);
|
||||||
|
EXPECT_EQ(super_group_ids[3], 7);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char ** argv)
|
int main(int argc, char ** argv)
|
||||||
|
|||||||
@@ -5415,6 +5415,18 @@ TEST_F(MaatCmdTest, HitPath) {
|
|||||||
"time=2020-02-11", "Cookie", 0, 0, 0, 0); /*EXPR_TYPE_STRING MATCH_METHOD_SUB*/
|
"time=2020-02-11", "Cookie", 0, 0, 0, 0); /*EXPR_TYPE_STRING MATCH_METHOD_SUB*/
|
||||||
EXPECT_EQ(ret, 1);
|
EXPECT_EQ(ret, 1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
item1 -> group1 -> group11
|
||||||
|
\
|
||||||
|
\ -> compile1
|
||||||
|
/
|
||||||
|
item2 -> group2 -> group21 _/
|
||||||
|
*/
|
||||||
|
long long group11_id = maat_cmd_incrby(maat_instance, "SEQUENCE_GROUP", 1);
|
||||||
|
ret = group2group_table_set_line(maat_instance, g2g_table_name, MAAT_OP_ADD, group1_id,
|
||||||
|
group11_id, 0, 0);
|
||||||
|
EXPECT_EQ(ret, 1);
|
||||||
|
|
||||||
//item3 -> group3, group3 is not referenced by any compile.
|
//item3 -> group3, group3 is not referenced by any compile.
|
||||||
long long item3_id = maat_cmd_incrby(maat_instance, "SEQUENCE_REGION", 1);
|
long long item3_id = maat_cmd_incrby(maat_instance, "SEQUENCE_REGION", 1);
|
||||||
long long group3_id = maat_cmd_incrby(maat_instance, "SEQUENCE_GROUP", 1);
|
long long group3_id = maat_cmd_incrby(maat_instance, "SEQUENCE_GROUP", 1);
|
||||||
|
|||||||
Reference in New Issue
Block a user