Контракт времени выполнения
Для обеспечения самоописания SQL/MR-функций мы выбрали метафору контракта. Во время подготовки плана выполнения запроса оптимизатор запросов nCluster заполняет некоторые поля объекта контракт времени выполнения, такие как имена и типы столбцов входной таблицы, имена и значения разделов аргументов. Эта неполная информация затем во время подготовки плана передается подпрограмме инициализации SQL/MR-функции.
Конструктор должен завершить контракт, заполнив дополнительные поля, такие как схема результата, и затем вызвать метод complete(). От всех экземпляров SQL/MR функции требуется соблюдение этого контракта, так что в заполнении контракта должны участвовать только детерминированные входные данные.
При использовании традиционных UDF также имеется некоторая разновидность контракта: при инсталляции функции должны быть явно объявлены типы ее параметров и возвращаемого значения (в операции CREATE FUNCTION). Это делается конечным пользователем или администратором базы данных. В отличие от этого, SQL/MR функции не только являются самоописываемыми, но согласование контракта во время подготовки плана запроса позволяет функции динамически изменять свою схему, что добавляет существенную гибкость, позволяющую создавать функции, пригодные для повторного применения. Большее число примеров будет приведено в разд. 5.
Справочная информация. Поскольку согласование контракта и, следовательно, определение схемы результата происходит во время подготовки плана выполнения запроса, полезно предоставить создателю запроса средства обнаружения схемы результата вызова интересующей его SQL/MR-функции. Это обеспечивается за счет использования самоописываемой природы SQL/MR-функций, а также описанного выше свойства детерминированности согласования контракта. Подобно тому, как во многих инструментах командной строки имеется опция "help", разработчики SQL/MR-функций снабжаются справочной информацией через соответствующий API. Обеспечивается информация об обязательных и необязательных разделах аргумеентов, а также о схеме результата при заданной схеме входной таблицы.
Валидация разделов аргументов. SQL/MR автоматически гарантирует, что в запросе определяются разделы аргументов вызова функции, совместимые с ее реализацией: если некоторый раздел аргументов присутствует в вызове, но не используется в реализации, или если функция пытается обращаться к разделу аргументов, отсутствующему в вызове, то пользователю направляется сообщение об ошибке. Например, оба раздела аргументов, заданные в запросе с рис. 3, используются конструктором Sessionize на рис. 6. Чтобы допустить наличие необязательных разделов аргументов, контруктор функции SQL/MR может проверять наличие конкретных разделов аргументов.