forum.bitel.ru
http://forum.bitel.ru/

Нужна помощь со скриптом предобработки для NAS
http://forum.bitel.ru/viewtopic.php?f=6&t=9120
Страница 1 из 1

Автор:  Иван [ 04 апр 2014, 01:28 ]
Заголовок сообщения:  Нужна помощь со скриптом предобработки для NAS

У меня есть такая задача, делить звонки по услугам в зависимости от номера куда звонят.

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

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

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

Код:
Префикс  Тип
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? Какие нибудь хеши или что то в таком роде?

Автор:  Phricker [ 04 апр 2014, 01:29 ]
Заголовок сообщения:  Re: Нужна помощь со скриптом предобработки для NAS

REGEXP?

Автор:  Иван [ 04 апр 2014, 01:41 ]
Заголовок сообщения:  Re: Нужна помощь со скриптом предобработки для NAS

Если шуточно, то когда вы начинаете решать проблему регекспом то у вас две проблемы.

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

Автор:  skn [ 04 апр 2014, 03:20 ]
Заголовок сообщения:  Re: Нужна помощь со скриптом предобработки для NAS

с точки зрения производительности можно сделать так (если префиксы меняются редко)
if ( первая цифра равна 0 )
{
if ( вторая цифра = 0 )
{
и т.д.
}
else if ( вторая цифра = 1 )
{
}
...
}
else if ( первая цифра = 1 )
{
}
else if ( ...


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

Автор:  Иван [ 04 апр 2014, 12:10 ]
Заголовок сообщения:  Re: Нужна помощь со скриптом предобработки для NAS

А точно нет какого нить хеша или объекта в этой вашей яве, что б накидать туда префиксов и получать longest match?
90+ if-ов вгоняют меня в уныние.

Автор:  skn [ 04 апр 2014, 13:49 ]
Заголовок сообщения:  Re: Нужна помощь со скриптом предобработки для NAS

Иван писал(а):
А точно нет какого нить хеша или объекта в этой вашей яве, что б накидать туда префиксов и получать longest match?
90+ if-ов вгоняют меня в уныние.


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

Автор:  Иван [ 22 апр 2014, 16:30 ]
Заголовок сообщения:  Re: Нужна помощь со скриптом предобработки для NAS

Может кто нибудь сможет мне еще помочь.
Я на ява не пишу ничего, затруднения с этим.

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

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

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

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

Автор:  Phricker [ 22 апр 2014, 16:54 ]
Заголовок сообщения:  Re: Нужна помощь со скриптом предобработки для NAS

утилиты - sql редактор
Код:
UPDATE log_session_14_201404 SET sid = 123 WHERE to_number LIKE '83425%'

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

Автор:  Иван [ 22 апр 2014, 16:57 ]
Заголовок сообщения:  Re: Нужна помощь со скриптом предобработки для NAS

Phricker, спасибо но

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

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

Автор:  Phricker [ 22 апр 2014, 16:59 ]
Заголовок сообщения:  Re: Нужна помощь со скриптом предобработки для NAS

А покажите ваши IFы. Все не надо :) Но для примера дерево IFов штучки 3-4

Автор:  Иван [ 22 апр 2014, 17:05 ]
Заголовок сообщения:  Re: Нужна помощь со скриптом предобработки для NAS

Код:
        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 ]
Заголовок сообщения:  Re: Нужна помощь со скриптом предобработки для NAS

Код:
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.

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

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/