#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;
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
//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
@@ -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(_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);
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)
{
a_compile_rule->not_flag[write_pos]=1;
a_compile_rule->not_group_cnt++;
}
else
{
@@ -1853,7 +1854,11 @@ struct Maat_group_inner_t* del_group_from_compile(struct Maat_compile_inner_t*a_
{
group_rule->ref_cnt--;
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->group_cnt--;
pthread_rwlock_unlock(&(a_compile_rule->rwlock));
return group_rule;

View File

@@ -147,7 +147,8 @@ struct Maat_compile_inner_t
struct db_compile_rule_t *db_c_rule;
dynamic_array_t *groups; //element is struct Maat_group_inner_t*
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
const struct Maat_table_desc* ref_table;
int group_boundary;

View File

@@ -303,12 +303,14 @@ TEST(Boolmatcher, NotFlagGroup)
table_id=Maat_table_register(g_feather,table_name);
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),
result,found_pos, 4, &mid, 0);
EXPECT_GE(ret, 1);
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),
result,found_pos, 4, &mid, 0);