#17 通过MAAT_SET_SCAN_LAST_REGION决定何时返回包含“非”分组的编译配置命中。

This commit is contained in:
zhengchao
2019-01-08 16:09:51 +06:00
parent 301dc793f2
commit 9c0a0786ab
4 changed files with 13 additions and 4 deletions

View File

@@ -155,8 +155,9 @@ int region_compile(_Maat_feather_t*feather,struct _INNER_scan_status_t *_mid,int
scan_ret=shortcut_avilable_cnt; scan_ret=shortcut_avilable_cnt;
alignment_int64_array_add(feather->orphan_group_saving, thread_num, 1); alignment_int64_array_add(feather->orphan_group_saving, thread_num, 1);
} }
else if(shortcut_avilable_cnt==0&&region_hit_num==1&&_mid->hit_group_cnt==1&&is_last_region==1) else if(0&&shortcut_avilable_cnt==0&&region_hit_num==1&&_mid->hit_group_cnt==1&&is_last_region==1)
{ {
//This shortcut is NO longger valid after bool macher support NOT-logic.
//short cut for last scan and combination rules //short cut for last scan and combination rules
//region_hit_num==1 : for current scan hitted rules, one and each other group may statisfy a compile rule. //region_hit_num==1 : for current scan hitted rules, one and each other group may statisfy a compile rule.
//_mid->hit_group_cnt==1: With pre scan hitted group rules, one group may staisfy a compile rule //_mid->hit_group_cnt==1: With pre scan hitted group rules, one group may staisfy a compile rule
@@ -179,7 +180,7 @@ int region_compile(_Maat_feather_t*feather,struct _INNER_scan_status_t *_mid,int
if(0==pthread_rwlock_tryrdlock(&(_mi_rule->rwlock))) if(0==pthread_rwlock_tryrdlock(&(_mi_rule->rwlock)))
{ {
if(_mi_rule->is_valid==1) if(_mi_rule->is_valid==1 && !(_mi_rule->not_group_cnt>0 && !is_last_region))
{ {
make_group_set(_mi_rule, &(rs_result[result_cnt].group_set), &has_not_flag); make_group_set(_mi_rule, &(rs_result[result_cnt].group_set), &has_not_flag);
r_in_c_cnt=pickup_hit_region_from_compile(&(rs_result[result_cnt].group_set), _mid->cur_hit_id, _mid->cur_hit_cnt, r_in_c_cnt=pickup_hit_region_from_compile(&(rs_result[result_cnt].group_set), _mid->cur_hit_id, _mid->cur_hit_cnt,

View File

@@ -1802,6 +1802,7 @@ int add_group_to_compile(struct Maat_compile_inner_t*a_compile_rule,struct Maat_
if(not_flag) if(not_flag)
{ {
a_compile_rule->not_flag[write_pos]=1; a_compile_rule->not_flag[write_pos]=1;
a_compile_rule->not_group_cnt++;
} }
else else
{ {
@@ -1853,7 +1854,11 @@ struct Maat_group_inner_t* del_group_from_compile(struct Maat_compile_inner_t*a_
{ {
group_rule->ref_cnt--; group_rule->ref_cnt--;
dynamic_array_write(a_compile_rule->groups,i,NULL); dynamic_array_write(a_compile_rule->groups,i,NULL);
if(a_compile_rule->not_flag[i]==1)
{
a_compile_rule->not_group_cnt--;
a_compile_rule->not_flag[i]=0; a_compile_rule->not_flag[i]=0;
}
a_compile_rule->group_cnt--; a_compile_rule->group_cnt--;
pthread_rwlock_unlock(&(a_compile_rule->rwlock)); pthread_rwlock_unlock(&(a_compile_rule->rwlock));
return group_rule; return group_rule;

View File

@@ -147,7 +147,8 @@ struct Maat_compile_inner_t
struct db_compile_rule_t *db_c_rule; struct db_compile_rule_t *db_c_rule;
dynamic_array_t *groups; //element is struct Maat_group_inner_t* dynamic_array_t *groups; //element is struct Maat_group_inner_t*
char not_flag[MAX_ITEMS_PER_BOOL_EXPR]; char not_flag[MAX_ITEMS_PER_BOOL_EXPR];
int is_valid; char not_group_cnt;
char is_valid;
int compile_id;//equal to db_c_rule->m_rule.config_id int compile_id;//equal to db_c_rule->m_rule.config_id
const struct Maat_table_desc* ref_table; const struct Maat_table_desc* ref_table;
int group_boundary; int group_boundary;

View File

@@ -303,12 +303,14 @@ TEST(Boolmatcher, NotFlagGroup)
table_id=Maat_table_register(g_feather,table_name); table_id=Maat_table_register(g_feather,table_name);
ASSERT_GT(table_id, 0); ASSERT_GT(table_id, 0);
Maat_set_scan_status(g_feather, &mid, MAAT_SET_SCAN_LAST_REGION, NULL, 0);
ret=Maat_full_scan_string(g_feather, table_id,CHARSET_GBK, string_should_hit, strlen(string_should_hit), ret=Maat_full_scan_string(g_feather, table_id,CHARSET_GBK, string_should_hit, strlen(string_should_hit),
result,found_pos, 4, &mid, 0); result,found_pos, 4, &mid, 0);
EXPECT_GE(ret, 1); EXPECT_GE(ret, 1);
Maat_clean_status(&mid); Maat_clean_status(&mid);
Maat_set_scan_status(g_feather, &mid, MAAT_SET_SCAN_LAST_REGION, NULL, 0);
ret=Maat_full_scan_string(g_feather, table_id,CHARSET_GBK, string_should_not_hit, strlen(string_should_not_hit), ret=Maat_full_scan_string(g_feather, table_id,CHARSET_GBK, string_should_not_hit, strlen(string_should_not_hit),
result,found_pos, 4, &mid, 0); result,found_pos, 4, &mid, 0);