Замена регулярных выражений на wildcards

Тема в разделе "WASM.A&O", создана пользователем Stiver, 6 апр 2005.

  1. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    Есть некоторое(довольно большое) количество данных в базе и есть простенькая программка(Web страница), которая осуществляет поиск в соответствии с заданными критериями и показывает результаты. Стоит задача разрешить пользователю использовать регулярные выражения (т.е. вводить например: ищи ИМЯ=(О|Ко)ля).



    Проблема состоит в том, что стандартный SQL регулярные выражения не поддерживает. А значит придется запрашивать из базы сначала все данные и проверять их вручную на соответствие критерию. С другой стороны SQL понимает wildcards: '_' - один, '%' - 0 или больше знаков.

    Поэтому есть идея выразить данное регулярное выражение (насколько возможно) с помощью wildcards, передать его SQL, и только потом (если потребуется) проверять вручную результаты. Которых уже будет значительно меньше. Например ИМЯ=(О|Ко)ля) преобразуется в (ИМЯ=Коля OR ИМЯ=Оля), здесь даже вручную дорабатывать не придется. Для + и * надо будет задавать максимальную глубину "раскрутки"

    (например глубина 3: ИМЯ=аа*б => (ИМЯ=а%б OR ИМЯ=аа%б OR ИМЯ=ааа%б)), но это уже детали.



    Чтобы не делать дурную работу вопрос: может кто-то уже писал что-то похожее или знает где взять(обязательно с исходниками)? Если нет, придется самому писать, ничего сложного но жалко времени. Ну и общие соображения конечно приветствуются, может есть более простое решение.
     
  2. bsl_zcs

    bsl_zcs New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2003
    Сообщения:
    17
    Адрес:
    Karaganda, Kazakhstan
    А база какая?



    Просто у многих серверов есть собственные способы обработки регулярных выражений - у кого-то родные, у кого-то подключаемые.
     
  3. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    bsl_zcs



    База mySQL и у нее действительно есть свои регулярные выражения. Беда в том, что я работаю с mySQL не напрямую, а через промежуточный слой Hibernate. Hibernate SQL(HQL) же поддерживает к сожалению только выражения из ANSI SQL 92, да и то не все.
     
  4. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Я поспрошал у народа - грят, должен like поддерживаться.
     
  5. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    Да, LIKE конечно поддерживает, то есть пример из первого поста будет на самом деле (ИМЯ LIKE 'а%б' OR ИМЯ LIKE 'аа%б' OR ИМЯ LIKE 'ааа%б') Сократил для наглядности, прошу прощения, если ввел в заблуждение. Но смысла это не меняет.
     
  6. bsl_zcs

    bsl_zcs New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2003
    Сообщения:
    17
    Адрес:
    Karaganda, Kazakhstan
  7. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    bsl_zcs





    Правильно, но если поменяется база данных(а так скорее всего и будет, на DB2 или SQL Server), то придется все эти queries писать заново. Смысл Hibernate как раз и состоит в том, чтобы быть как можно более независимым от конкретной базы данных. Я только что с большим трудом избавился от mySQL-евской concat() и вносить новую эависимость не очень хочется. Да и не даст мне никто ;)
     
  8. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Stiver



    Почему не меняет смысла ? Ведь можно же like "*аша" ("Наташа") ? Только для сайбэйзу нужно использовать вместо * что-то иное...