diff --git a/db_scripts/diff/15609_not_replicated.up b/db_scripts/diff/15609_not_replicated.up new file mode 100644 index 00000000..b4eaa3f0 --- /dev/null +++ b/db_scripts/diff/15609_not_replicated.up @@ -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 ; + +