Обращение к Прологу через глобальный объект мы рассмотрим на сравнительном примере доступа к реляционным данным из макроса на Гедымине. Пусть данные находятся в двух таблицах: GD_CONTACT(ID, CITYKEY, NAME) и GD_PLACE(ID, NAME):
ID CITYKEY NAME ====================== 1 1 Company A 2 1 Company B 3 2 Company C ID NAME ====================== 1 Minsk 2 BeriozaДля извлечения cписка компаний по заданному наименованию города мы пишем SQL запрос, который выполняем через объект класса TIBSQL:
... Dim q Set q = Creator.GetObject(nil, "TIBSQL", "") Set q.Transaction = gdcBaseManager.ReadTransaction q.SQL.Text = _ "SELECT c.name " & _ "FROM gd_contact c JOIN gd_place p " & _ " ON p.id = c.citykey " & _ "WHERE p.name = 'Minsk' " q.ExecQuery While Not q.EOF ... q.Next WEnd ...Теперь изобразим тоже самое на Prolog.
Исходные данные в виде предикатов Prolog выглядят так:
gd_contact(1, 1, 'Company A'). gd_contact(2, 1, 'Company B'). gd_contact(3, 2, 'Company C'). gd_place(1, 'Minsk'). gd_place(2, 'Berioza').Правило связи компании с городом через ключи:
bycity(City, Name) :- gd_place(CityID, City), gd_contact(_, CityID, Name).Тогда запрос на извлечение всех минских компаний будет выглядеть следующим образом:
? bycity('Minsk', Name).Что мы видим из данного примера?
- Необходим класс для доступа к Прологу из макросов. Далее по тексту будем называть его PL. Экземпляр данного класса создается стандартным образом через глобальный объект Designer/Creator. Каждый экземпляр может иметь свое имя.
- PL должен иметь метод для формирования предикатов на основании заданной SQL выборки. Пример кода:
... Call PL.MakePredicates(_ "SELECT id, citykey, name FROM gd_contact", _ gdcBaseManager.ReadTransaction, _ "gd_contact", "name") ...
Последний параметр -- имя выборки, которое будет использоваться для формирования имени .pl файла в режиме отладки.Пусть это и не касается непосредственно сопряжения Пролога с Гедымином, но здесь стоит вспомнить об идее изоляции разработчика от работы с SQL запросами и инкапсуляции последних внутрь т.н. SQL объекта. SQL объект -- это заранее написанный, проверенный и оптимизированный SQL запрос, загружаемый на базу стандартным образом через настройки или пространства имен. Для выполнения, программист обращается к нужному SQL объекту по его РУИДу.
- PL должен иметь метод для формирования предикатов на основании бизнес-класса. На вход передается класс-подтип, подмножество, дополнительные условия выборки. Сразу следует договориться о стандартном механизме (способе) загрузки данных мастер-дитэйл (например, документ накладная с позициями).
... Call PL.MakePredicates2(_ "TgdcCompany", "", "ByID", Array(777777), "", _ gdcBaseManager.ReadTransaction, _ "gd_contact", "name") ...
- PL должен иметь метод для формирования предикатов на основании существующего набора данных (дата-сета).
- PL должен иметь метод для ручного формирования произвольных предикатов.
- PL должен иметь метод для вычисления цели. Результат вычисления может быть как одиночное значение, так и выборка. Для работы с последней предусмотрены методы итерации (EOF, First, Next) и методы для обращения к параметрам по имени.
- С помощью соответствующих методов результат вычисления может быть напрямую помещен в указанную таблицу в базе, клиент-датасет в оперативной памяти, или на его основе могут быть созданы новые бизнес-объекты в БД.
- Предикаты, которые создает разработчик, должны храниться в базе данных аналогично тому, как сейчас хранится код VBScript.
- В дереве Проводника Редактора скрипт-объектов следует добавить корневой раздел для кода на Прологе. Внутри раздела пролог-скрипты могут размещаться в папках.
- Минимальная единица для загрузки в объект PL -- один пролог-скрипт. Каждый скрипт имеет уникальное имя и РУИД. Загрузка осуществляется по РУИДу. Внутри скрипта могут встречаться директивы %#INCLUDE для загрузки других пролог-скриптов (аналогично директиве '#INCLUDE для VBScript).
- Стандартные библиотеки SWI-Prolog, которые в дистрибутиве занимают 8 Мб в 377 файлах, будут храниться в базе данных точно так же, как и обычные пролог-скрипты.
- Отладка:
- Для отладки на компьютере должен быть установлен полный вариант SWI-Prolog и, возможно, SWI-Prolog Editor.
- Местоположение SWI-Prolog и каталога для временных файлов задается в параметрах платформы.
- Режим отладки активизируется в параметрах редактора скрипт-объектов для списка конкретных экземпляров PL, заданных их именами. Если список пуст, то режим активируется для всех PL объектов.
- Когда активирован режим дебаггера предикаты записываются в текстовые файлы .pl программ во временном каталоге. При этом файлы формируются следующим образом:
- Для каждого пролог-скрипта отдельный файл.
- Результаты вызова MakePredicatesX помещаются в файлы в соответствии с заданными именами.
- При вызове метода вычисления цели в режиме дебаггера загружается SWI-Prolog или SWI-Prolog Editor. В среду выполнения/отладки подгружаются созданные временные файлы.
- Гедымин ждет завершения работы процесса SWI-Prolog.
- После окончания отладки проверяются файлы для выгруженных пролог-скриптов. Если обнаружены изменения Гедымин предлагает загрузить их в базу данных.