BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 28 апр 2024, 18:46

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
СообщениеДобавлено: 04 апр 2014, 01:28 
Не в сети

Зарегистрирован: 26 ноя 2008, 01:56
Сообщения: 80
Карма: 0
У меня есть такая задача, делить звонки по услугам в зависимости от номера куда звонят.

Местная, сотовая, зоновая, междугородняя и тд связь.

Это нужно и для разных счетов и для начислений.

Таблица префиксов у меня большая. Выглядит так

Код:
Префикс  Тип
8343       Зон
83435   МСТ
89201   ЗОН
89         СОТ


Всего где то 90 записей.

У меня в скрипте предобработке такой код:

Код:

value = request.getStringAttribute(30);
if (value != null)
{
   if (value.indexOf("810") == 0 )       {
request.setOption( "service", 30 );
      }
   else if (value.indexOf("8") == 0 )       {
request.setOption( "service", 31 );
      }
...


Но, 90 if-ов, с учетом что самый длинный префикс должен выигрывать, мне кажется очень каким то большим костылем.

Про длинный префикс я вот что имею ввиду.

У меня есть в справочнике
Код:
8912071 ЗОН
89         СОТ


Звонок на 891207122 - зоновый , на 891297 - сотовый

Может есть какой то метод проще чем if? Какие нибудь хеши или что то в таком роде?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 апр 2014, 01:29 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
REGEXP?

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 апр 2014, 01:41 
Не в сети

Зарегистрирован: 26 ноя 2008, 01:56
Сообщения: 80
Карма: 0
Если шуточно, то когда вы начинаете решать проблему регекспом то у вас две проблемы.

А если всерьез, не понимаю, куда тут regexp
префиксы все в него засунуть?
(83425|83237|81213)
типа такого?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 апр 2014, 03:20 
Не в сети
Разработчик

Зарегистрирован: 07 апр 2007, 23:51
Сообщения: 4489
Откуда: Уфа, Россия
Карма: 186
с точки зрения производительности можно сделать так (если префиксы меняются редко)
if ( первая цифра равна 0 )
{
if ( вторая цифра = 0 )
{
и т.д.
}
else if ( вторая цифра = 1 )
{
}
...
}
else if ( первая цифра = 1 )
{
}
else if ( ...


другой вариант строить из префиксов дерево по такому же принципу (разбивать по цифрам) и писать обходчик этого дерева...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 апр 2014, 12:10 
Не в сети

Зарегистрирован: 26 ноя 2008, 01:56
Сообщения: 80
Карма: 0
А точно нет какого нить хеша или объекта в этой вашей яве, что б накидать туда префиксов и получать longest match?
90+ if-ов вгоняют меня в уныние.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 апр 2014, 13:49 
Не в сети
Разработчик

Зарегистрирован: 07 апр 2007, 23:51
Сообщения: 4489
Откуда: Уфа, Россия
Карма: 186
Иван писал(а):
А точно нет какого нить хеша или объекта в этой вашей яве, что б накидать туда префиксов и получать longest match?
90+ if-ов вгоняют меня в уныние.


мне про такие хеши(объекты) ничего не известно....


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 22 апр 2014, 16:30 
Не в сети

Зарегистрирован: 26 ноя 2008, 01:56
Сообщения: 80
Карма: 0
Может кто нибудь сможет мне еще помочь.
Я на ява не пишу ничего, затруднения с этим.

Вот написал я все эти стопицот тысяч if-ов.
Получается у меня половина проблемы снята, теперь услуги правильно назначаются для новых пакетов, но старые то все остались неправлиные, и пересчет им не помогает.

Получается мне нужно пройтись по log_session_14_201404
взять там to_number и назначить нужный sid, используя эту функцию.

Простая вроде б задача.
Видимо выполнять ее через "глобальные скрипты поведения".
Но не знаю с чего начать.
Как мне эти update выполнять.

Нет ли образцов такого кода?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 22 апр 2014, 16:54 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
утилиты - sql редактор
Код:
UPDATE log_session_14_201404 SET sid = 123 WHERE to_number LIKE '83425%'

сначала проверьте на тестовой базе все ли вас устраивает

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 22 апр 2014, 16:57 
Не в сети

Зарегистрирован: 26 ноя 2008, 01:56
Сообщения: 80
Карма: 0
Phricker, спасибо но

Там очень не простой like
Там есть java функция которая определяет sid в зависимости от to_number

И перевести ее в sql, ну я б может и смог. Но подозреваю это не последний раз там изменения и дублировать не хочется.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 22 апр 2014, 16:59 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
А покажите ваши IFы. Все не надо :) Но для примера дерево IFов штучки 3-4

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 22 апр 2014, 17:05 
Не в сети

Зарегистрирован: 26 ноя 2008, 01:56
Сообщения: 80
Карма: 0
Код:
        if (value.indexOf("0") == 0 ) {
            request.setOption( "service", 32 );
        }
        if (value.indexOf("1") == 0 ) {
            request.setOption( "service", 31 );
            if (value.length() == 3 ) {
                request.setOption( "service", 32 );
            }
        }
        if (value.indexOf("2") == 0 ) {
            request.setOption( "service", 32 );
        }
        if (value.indexOf("3") == 0 ) {
            request.setOption( "service", 32 );
        }
        if (value.indexOf("4") == 0 ) {
            request.setOption( "service", 32 );

            if (value.indexOf("4760") == 0 ) {
                request.setOption( "service", 31 );
               if (value.indexOf("47601") == 0 ) {
                  request.setOption( "service", 34 );
               }
            }
            if (value.indexOf("4761") == 0 ) {
                request.setOption( "service", 31 );
            }


Я понимаю, что их наверно можно в sql загнать, но смотрите что меня останавливает:

1. Я хочу иметь одно место где буду это править.
2. Та логика что сейчас может и усложняться, если сейчас нет какой то проверки, то она может появится, например еще какой то атрибут с радиус пакета (я довольно сильно подозреваю что это будет cisco-NAS-Port= ...) поэтому хочется остаться тут внутри java.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23 апр 2014, 14:22 
Не в сети

Зарегистрирован: 26 ноя 2008, 01:56
Сообщения: 80
Карма: 0
Код:
public void main( setup, con, conSlave ) {

    ps_upd = con.prepareStatement("update log_session_14_201404 set sid=? where id=?");

    query = "select id,to_number,sid from log_session_14_201404 order by id desc limit 20";
    ps = con.prepareStatement( query );
    rs = ps.executeQuery();

    while(rs.next()){
        int id=rs.getInt(1);
        String phone=rs.getString(2);
        int sid=rs.getInt(3);
        int real_sid=getSid(phone);
     
        if(sid!=real_sid) {
           ps_upd.setInt(1,real_sid);
           ps_upd.setInt(2,id);
           ps_upd.executeUpdate();
           print (phone + "=>" + real_sid + " was " + sid );
      }
    }
}


public int getSid(String value) {

        if (value.indexOf("0") == 0 ) {
            return  32;
        }
        if (value.indexOf("1") == 0 ) {

            if (value.length() == 3 ) {
                return  32;
            }
            return  31;
        }

...
...


где функция getSid содержит стопицот моих if.

Покритикуйте пожалуйста.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
POWERED_BY
Русская поддержка phpBB
[ Time : 0.563s | 42 Queries | GZIP : On ]