Запросы классов
Лебедюк Эдуард
• Базовые запросы классов
• Кастомные запросы классов
План
Базовые запросы классов
Абстракция над SELECT SQL
• Метод представления SELECT SQL запросов
• Обрабатываются оптимизатором и компилятором SQL
• В списке аргументов нужно перечислить список аргументов SQL запроса
• Caché Studio предоставляет мастер создания запросов классов
Что такое
Базовые запросы классов
• Абстракция SQL в COS коде
• Упрощение чтения int кода
• Упрощение работы с курсорами
• Уменьшение времени компиляции
• Документирование запросов
Преимущества по сравнению с SQL
Пример определения
Базовые запросы классов
Query ByName(name As %String = "") As %SQLQuery
(ROWSPEC="ID:%Integer,Name:%String,DOB:%Date,SSN:%String")
[ SqlProc ]
{
SELECT ID, Name, DOB, SSN
FROM Sample.Person
WHERE (Name %STARTSWITH :name)
ORDER BY Name
}
• %SQL.Statement
• SQL контекст
Как использовать?
Базовые запросы классов
Set statement=##class(%SQL.Statement).%New()
Set status=statement.%PrepareClassQuery("Sample.Person","ByName")
Set resultset=statement.%Execute("A")
While resultset.%Next() {
Write !, resultset.%Get("Name")
}
Call Sample.SP_Sample_By_Name('A')
Select * from Sample.SP_Sample_By_Name('A'')
Кастомные запросы классов
• Запрос, логику которого вы пишете сами
Что такое
Кастомные запросы классов
• Сложная логика
• Вы получаете доступ к данным через API, формат которого вас не устраивает
• Данные хранятся в глобалах, без классов
• Для доступа к данным необходима эскалация прав
• Для доступа к данным необходимо запросить внешнее API
• Для доступа к данным необходим доступ к файловой системе
• Необходимы какие-то дополнительные операции перед выполнением самого
запроса (установление соединения, проверка прав и т.д.)
Зачем
• queryName — похож на базовый запрос класса, предоставляет информацию
• queryNameExecute — конструктор запроса
• queryNameFetch — осуществляет получение следующего результата
• queryNameClose — деструктор запроса
Детали реализации и примеры - habrahabr.ru/company/intersystems/blog/270839
Как?
Кастомные запросы классов
• Обход глобала
– Данные хранятся в глобалах, без классов
– Нужно уменьшить количество обращений к глобалам
– Результаты должны/могут быть отсортированы по ключу глобала
• Статический SQL
– Упрощение чтения int кода
– Упрощение работы с курсорами
– Уменьшение времени компиляции
• Динамический SQL
– Актуально для случаев, когда кроме собственно запроса, который представим в виде
SQL, нужно производить какие-либо дополнительные действия
Варианты
Логика кастомного запроса
Пример
EnsLogViewer
• Просмотр логов Ensemble
• Добавили поддержку областей
• Работает на
– 2013.1
– 2014.1
– 2015.1
– 2015.2
https://github.com/intersystems-ru/EnsLogViewer
EnsLogViewer
Альтернативный подход
%SQL.CustomResultSet
• Несколько более высокая скорость работы
• Вся метаинформация берётся из определения класса, ROWSPEC не нужен
• Соответствие принципам ООП
Особенности
%SQL.CustomResultSet
Конец
habrahabr.ru/company/intersystems/blog/270839

Class queries

  • 1.
  • 2.
    • Базовые запросыклассов • Кастомные запросы классов План
  • 3.
  • 4.
    • Метод представленияSELECT SQL запросов • Обрабатываются оптимизатором и компилятором SQL • В списке аргументов нужно перечислить список аргументов SQL запроса • Caché Studio предоставляет мастер создания запросов классов Что такое Базовые запросы классов • Абстракция SQL в COS коде • Упрощение чтения int кода • Упрощение работы с курсорами • Уменьшение времени компиляции • Документирование запросов Преимущества по сравнению с SQL
  • 5.
    Пример определения Базовые запросыклассов Query ByName(name As %String = "") As %SQLQuery (ROWSPEC="ID:%Integer,Name:%String,DOB:%Date,SSN:%String") [ SqlProc ] { SELECT ID, Name, DOB, SSN FROM Sample.Person WHERE (Name %STARTSWITH :name) ORDER BY Name }
  • 6.
    • %SQL.Statement • SQLконтекст Как использовать? Базовые запросы классов Set statement=##class(%SQL.Statement).%New() Set status=statement.%PrepareClassQuery("Sample.Person","ByName") Set resultset=statement.%Execute("A") While resultset.%Next() { Write !, resultset.%Get("Name") } Call Sample.SP_Sample_By_Name('A') Select * from Sample.SP_Sample_By_Name('A'')
  • 7.
  • 8.
    • Запрос, логикукоторого вы пишете сами Что такое Кастомные запросы классов • Сложная логика • Вы получаете доступ к данным через API, формат которого вас не устраивает • Данные хранятся в глобалах, без классов • Для доступа к данным необходима эскалация прав • Для доступа к данным необходимо запросить внешнее API • Для доступа к данным необходим доступ к файловой системе • Необходимы какие-то дополнительные операции перед выполнением самого запроса (установление соединения, проверка прав и т.д.) Зачем
  • 9.
    • queryName —похож на базовый запрос класса, предоставляет информацию • queryNameExecute — конструктор запроса • queryNameFetch — осуществляет получение следующего результата • queryNameClose — деструктор запроса Детали реализации и примеры - habrahabr.ru/company/intersystems/blog/270839 Как? Кастомные запросы классов
  • 10.
    • Обход глобала –Данные хранятся в глобалах, без классов – Нужно уменьшить количество обращений к глобалам – Результаты должны/могут быть отсортированы по ключу глобала • Статический SQL – Упрощение чтения int кода – Упрощение работы с курсорами – Уменьшение времени компиляции • Динамический SQL – Актуально для случаев, когда кроме собственно запроса, который представим в виде SQL, нужно производить какие-либо дополнительные действия Варианты Логика кастомного запроса
  • 11.
  • 12.
    • Просмотр логовEnsemble • Добавили поддержку областей • Работает на – 2013.1 – 2014.1 – 2015.1 – 2015.2 https://github.com/intersystems-ru/EnsLogViewer EnsLogViewer
  • 13.
  • 14.
    • Несколько болеевысокая скорость работы • Вся метаинформация берётся из определения класса, ROWSPEC не нужен • Соответствие принципам ООП Особенности %SQL.CustomResultSet
  • 15.

Editor's Notes

  • #3 Запросы классов InterSystems Caché — это полезный инструмент, используемый для абстракции от непосредственно SQL запросов в COS коде. В самом простом случае это выглядит так: допустим вы используете один и тот же SQL запрос в нескольких местах, но с разными аргументами. Для того, чтобы не писать его каждый раз, вы можете обозначить текст запроса как запрос класса и в дальнейшем обращаться к этому запросу по его имени. А ещё есть кастомные запросы, в которых логику получения следующей строки результатов вы пишете сами. Под катом я расскажу о том, как этим всем можно пользоваться.