13 февр. 2011 г.

Замена парсера SQL

Существующий парсер SQL называется TsqlParser и используется внутри класса TatSQLSetup из модуля at_sql_setup.pas. TatSQLSetup отвечает за формирование запросов SELECT, UPDATE, INSERT внутри бизнес-объекта. На момент написания кода бизнес-объекта в Delphi, разработчик не знает какие поля будут позже добавлены настройщиком системы. Поэтому он пишет например так:
SELECT 
  * 
FROM 
  gd_contact z JOIN gd_people p 
    ON p.contactkey = z.id
Напоминаем, что главная таблица бизнес-объекта у нас всегда имеет алиас z.

Во время выполнения программы, после создания экземпляра бизнес-объекта, в процессе его открытия (не забываем, что БО является набором данных, т.н. датасетом), происходит последовательная разборка запроса, добавление списка пользовательских полей (для ссылок добавляются джоины на справочники), и обратная сборка запроса. Информация о пользовательских полях и их типах берется из глобального объекта atDatabase.

То ли существующий парсер работает достаточно медленно, то ли все дело в обращении к объекту atDatabase (точных замеров не производилось), после формирования запроса он кэшируется и создаваемые позже объекты такого же типа используют уже готовый текст запроса из кэша.

Собственно, задание:
  1. В классе TatSQLSetup заменить старый парсер на новый.
  2. Откомпилированную грамматику Firebird SQL подлинковать к экзешнику ввиде двоичного ресурса.
  3. Проверить быстродействие нового парсера и, возможно, отказаться от кэширования сформированного текста запроса.
  4. Код, использующий новый парсер, отделить от существующего условной компиляцией под символом NEW_SQL_PARSER.

1 комментарий:

Александр комментирует...

Первоначальный парсинг начального запроса достаточно быстрый, там медленное соединение по внешним ключам по left join таблиц.

Отправить комментарий