TT#82605 TT#84326 refactor for more perf with fee precedence checks

index advice turn out to be mandatory here.

Change-Id: I2ea3c42818059a3973682e54a96b9a86c9b55fe1
(cherry picked from commit ab5cfdd3c5)
changes/25/41225/1
Rene Krenn 5 years ago
parent cf093a9a45
commit cb4cf054c6

@ -0,0 +1,136 @@
SET sql_log_bin=0;
use billing;
delimiter ;;
drop function get_billing_fee_id;;
create function get_billing_fee_id(
_billing_profile_id int(11),
_type enum('call','sms'),
_direction enum('in','out'),
_source varchar(511),
_destination varchar(511),
_match_mode enum('regex_longest_pattern', 'regex_longest_match', 'prefix', 'exact_destination')
) returns int(11)
deterministic reads sql data
begin
declare _destination_prefix,_source_prefix varchar(511);
declare _i, _j int(3);
declare _fee_id int(11);
if _fee_id is null and (_match_mode is null or _match_mode = "exact_destination")
and (select exists (select 1 from billing.billing_fees_history use index (bfh_srcdestdir_idx) where
billing_profile_id = _billing_profile_id
and type = _type
and match_mode = "exact_destination"
and direction = _direction
and bf_id is not null)) then
set _fee_id = (select id from billing.billing_fees_history where
billing_profile_id = _billing_profile_id
and type = _type
and match_mode = "exact_destination"
and direction = _direction
and bf_id is not null
and destination = _destination
limit 1);
end if;
if _fee_id is null and (_match_mode is null or _match_mode = "prefix")
and (select exists (select 1 from billing.billing_fees_history use index (bfh_srcdestdir_idx) where
billing_profile_id = _billing_profile_id
and type = _type
and match_mode = "prefix"
and direction = _direction
and bf_id is not null)) then
set _j = length(_destination);
destination_loop: loop
if _j < 0 or _fee_id is not null then
leave destination_loop;
end if;
set _destination_prefix = substr(coalesce(_destination,""),1,_j);
if (select exists (select 1 from billing.billing_fees_history where
billing_profile_id = _billing_profile_id
and type = _type
and match_mode = "prefix"
and direction = _direction
and bf_id is not null
and destination = _destination_prefix)) then
set _i = length(_source);
source_loop: loop
if _i < 0 or _fee_id is not null then
leave source_loop;
end if;
set _source_prefix = substr(coalesce(_source,""),1,_i);
set _fee_id = (select id from billing.billing_fees_history where
billing_profile_id = _billing_profile_id
and type = _type
and match_mode = "prefix"
and direction = _direction
and bf_id is not null
and source = _source_prefix
and destination = _destination_prefix
limit 1);
set _i = _i - 1;
end loop source_loop;
end if;
set _j = _j - 1;
end loop destination_loop;
end if;
if _fee_id is null and (_match_mode is null or _match_mode = "regex_longest_match")
and (select exists (select 1 from billing.billing_fees_history use index (bfh_srcdestdir_idx) where
billing_profile_id = _billing_profile_id
and type = _type
and match_mode = "regex_longest_match"
and direction = _direction
and bf_id is not null)) then
set _fee_id = (select id from billing.billing_fees_history where
billing_profile_id = _billing_profile_id
and type = _type
and match_mode = "regex_longest_match"
and direction = _direction
and bf_id is not null
and _source regexp(source)
and _destination regexp(destination)
order by
length(regexp_substr(_destination,destination)) desc,
length(regexp_substr(_source,source)) desc limit 1);
end if;
if _fee_id is null and (_match_mode is null or _match_mode = "regex_longest_pattern")
and (select exists (select 1 from billing.billing_fees_history use index (bfh_srcdestdir_idx) where
billing_profile_id = _billing_profile_id
and type = _type
and match_mode = "regex_longest_pattern"
and direction = _direction
and bf_id is not null)) then
set _fee_id = (select id from billing.billing_fees_history where
billing_profile_id = _billing_profile_id
and type = _type
and match_mode = "regex_longest_pattern"
and direction = _direction
and bf_id is not null
and _source regexp(source)
and _destination regexp(destination)
order by
length(destination) desc,
length(source) desc limit 1);
end if;
return _fee_id;
end;;
delimiter ;
Loading…
Cancel
Save