Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Новый топик    Ответить
 Как используете Query в классах?  [new]
kolesov
Member

Откуда: Владивосток
Сообщений: 755
С наступающими!
Вот тут увидел про "Например теже Query в классах" и немного задумался.
Кто может поделиться, как используете и в чем фича?
А то я, может и к собственному стыду, писал их только под сложные запросы, где эти самые Query пишутся в четыре метода - но такие нужны три раза на всю систему. Иногда один ;)
А у вас?
11 фев 19, 17:10    [21806672]     Ответить | Цитировать Сообщить модератору
 Re: Как используете Query в классах?  [new]
DAiMor
Member

Откуда: Volzhsky -> Moscow -> CZ, Brno -> Moscow
Сообщений: 2633
Query можно писать вместо любых других запросов, любой сложности
но плюсы Query еще и в том что они могут быть не только SQL, а и программные.
Например в ZEN приложении удобно, когда все через Query. Вплоть для сгенерированных результатов.
У меня есть варианты, когда query должен вернуть список классов и он генерируется во время компиляции, и в runtime уже нет никаких вычислений, потому что уже нет необходимости (код меняется только у разработчика, и никогда на продакшене).

И так же большим плюсом идет, то что все query сразу становятся функциями, довольно быстро и легко их вызывать.
set rs = ##class(%File).FileSetFunc("/tmp")
while rs.%Next() {
  write rs.Name
}
11 фев 19, 17:36    [21806707]     Ответить | Цитировать Сообщить модератору
 Re: Как используете Query в классах?  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3798
Продолжим традицию поиска недостатков в разных способах выполнения запросов.
В данном случае недостаток в том, что запросов может быть миллион всяких разных, затрагивающих разные классы, зачастую похожих, но не одинаковых. Со временем вы можете захламить класс. Править их страшно, потому что где, откуда используются (я понимаю, можно поискать, но что даст список из десятков результатов - и что с этим делать?)

kolesov
где эти самые Query пишутся в четыре метода - но такие нужны три раза на всю систему. Иногда один ;)
Не всем так везет :-)
Хотя первый раз все равно самый страшный.

DAiMor
И так же большим плюсом идет, то что все query сразу становятся функциями, довольно быстро и легко их вызывать.
Прикольно, не знал.
Но вспомнил фишку, которые тоже, наверное, не все знают. Что классметоды после добавления признака sqlproc можно использовать в запросах как процедуру, возвращающую значение.
11 фев 19, 17:55    [21806732]     Ответить | Цитировать Сообщить модератору
 Re: Как используете Query в классах?  [new]
DAiMor
Member

Откуда: Volzhsky -> Moscow -> CZ, Brno -> Moscow
Сообщений: 2633
Блок А.Н.
В данном случае недостаток в том, что запросов может быть миллион всяких разных, затрагивающих разные классы, зачастую похожих, но не одинаковых. Со временем вы можете захламить класс. Править их страшно, потому что где, откуда используются (я понимаю, можно поискать, но что даст список из десятков результатов - и что с этим делать?)
Вообще то же справедливо для любых sql запросов, а в некоторых случаях начинается еще и дублирование. И часто запросы даже почти ничем не отличаются, и можно было бы сделать один вместо такого количества
11 фев 19, 18:20    [21806776]     Ответить | Цитировать Сообщить модератору
 Re: Как используете Query в классах?  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3798
DAiMor,

Если это ESQL запрос, то он не шарится, по сути используется внутри метода.
Если это динамический запрос, то он скорее всего создается в месте использования (т.е. в другом классе), а запросы как элемент класса именно что его в максимальной степени захламляют.

Да, захламить можно и методами по той же причине (захотелось - сделал новый метод), но методы при минимальной дисциплине получаются более атомарными, а запросы атомарными не сделаешь.

Кстати, запросы как элемент класса - это по своей сути динамические(кэшированные) или ESQL(прекомпилированные) запросы? Как они при изменении структуры класса работают? У меня ощущение, что они динамические.
11 фев 19, 18:54    [21806806]     Ответить | Цитировать Сообщить модератору
 Re: Как используете Query в классах?  [new]
Sheonn
Member

Откуда:
Сообщений: 32
Блок А.Н.,

Вроде эти запросы преобразуются в создание объекта SQLStatement
11 фев 19, 19:57    [21806833]     Ответить | Цитировать Сообщить модератору
 Re: Как используете Query в классах?  [new]
Ptn
Member

Откуда:
Сообщений: 5
DAiMor,

Хм... как то этот способ прошел мимо меня.
Правда предварительные тесты показали существенное замедление супротив обычного
		set rs = ##class(%ResultSet).%New("classname:queryname")
		set sc=rs.Execute(arg1,arg2,...)


Возможно дело в том что у нас принято все данные запроса сразу запихивать в многомерный qHandle от Execute метода, нужно будет еще покапаться.
13 фев 19, 19:06    [21808875]     Ответить | Цитировать Сообщить модератору
 Re: Как используете Query в классах?  [new]
DAiMor
Member

Откуда: Volzhsky -> Moscow -> CZ, Brno -> Moscow
Сообщений: 2633
Ptn
показали существенное замедление супротив обычного
Это вроде справедливо для старых версий, в новых вроде должно быть лучше.
13 фев 19, 21:41    [21808959]     Ответить | Цитировать Сообщить модератору
 Re: Как используете Query в классах?  [new]
alatalo
Member

Откуда: Хельсинки
Сообщений: 109
Блок А.Н.
Прикольно, не знал.
Но вспомнил фишку, которые тоже, наверное, не все знают. Что классметоды после добавления признака sqlproc можно использовать в запросах как процедуру, возвращающую значение.


Тут помнится был полезный список автогенерированных методов: https://community.intersystems.com/post/useful-auto-generated-methods
вчера, 11:20    [21817114]     Ответить | Цитировать Сообщить модератору
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Ответить