67
Шаблонизация SQL еще один велосипед Алексей Романчук

Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

  • Upload
    devday

  • View
    530

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Шаблонизация SQLеще один велосипед

Алексей Романчук

Page 2: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Обо мне

Page 3: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

О чем будем говорить?

Page 4: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Для кого

• Разработчики

• Много SQL

• Динамический SQL

Page 5: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Для чего стараемся?

• Сложные выборки

• Отчеты

• Любые SQL запросы

Page 6: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Очень простой пример

Page 7: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Очень простой пример

Page 8: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Простой пример

Page 9: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Простой пример

Page 10: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Простой пример

Page 11: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Пример

Page 12: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Пример

Page 13: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Не такой простой пример

Page 14: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Не такой простой пример

Page 15: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Не такой простой пример

Page 16: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Не такой простой пример

Page 17: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Пример почти из жизни

Page 18: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Пример почти из жизни

Page 19: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Почувствуйте разницу

Page 20: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Недостатки inline подхода

Page 21: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Недостатки inline подхода

• Невозможность ограничить текст запроса

• Дублирование логики в запросах и в параметрах

• Часть свойств в тексте запроса, часть как явные параметры

• Сложность разработки и отладки SQL

Page 22: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Как происходит разработка SQL

• Получить SQL из кода

• Заменить «?» на значения

• Внести изменения в SQL редакторе

• Внедрить изменения в код или «оживить» написанный SQL целиком

Page 23: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Что делать?

Page 24: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Шаблонизация FTW

Page 25: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Шаблонизация FTW

Page 26: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Шаблонизация FTW

Page 27: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Стало ли проще?

Page 28: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Стало ли проще?

Page 29: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Что дает шаблонизация?

• Возможность ограничить текст запроса

• Текст первичен

• Многострочные запросы легко копировать

Page 30: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Какой должна быть разработка SQL

• Получить SQL из кода

• Заменить «?» на значения

• Внести изменения в SQL редакторе

• Внедрить изменения в код или «оживить» написанный SQL целиком

Page 31: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Наконец!

Page 32: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Требования к шаблонизатору

• Шаблон должен быть максимально валидным SQL

• Возможность «выключить» ненужный join

• Поддержка типизированных параметров

• Автоматическое включение joinов

Page 33: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Где хранить метаданные чтобы шаблон оставался валидным SQL?

Page 34: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

XDoclet

*.hbmJava source

javac .class

Page 35: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

И не только

• Javadoc

• Google Closure Compiler for JS

• Eclipse localization (//$NON-NLS-1$)

• UML Doclet

Page 36: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Шаблонизатор

SQL редакторШаблон

Движок Запрос

Parameters

Page 37: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Шаблонизатор в двух словах

• Элемент

• Дерево

Page 38: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Элемент

• Имя

• Тип

• Значение

/*id(int */1045/*)*//*cond(*/inner join orders o…/*)*/

Единственная языковая конструкция

Page 39: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Варианты синтаксиса элемента

• /*{name*/1045/*}*/

• /*<name type=“int”>*/1045/*</name>*/

• /*<name:int*/1045/*>*/

• /*name(int */1045/*)*/

Page 40: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Работа с элементом

• По умолчанию элемент «выключен»

• Явное задание значение и проверка типа

• Использование значения из шаблона

Page 41: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Простой пример

select c.id, c.name

from company c

where c.name ilike ‘2 gis’

Page 42: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Простой пример

select c.id, c.name

from company c

where c.name ilike /*name(*/‘2 gis%’/*)*/

Page 43: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Простой пример

Template t = new Template(“…”);

t.assignValue(“name”, “Sbertech%”);

Page 44: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Простой пример

select c.id, c.name

from company c

where c.name ilike ‘Sbertech%’

Page 45: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Дерево

• Шаблон – дерево текста и элементов (xml)

• По умолчанию элемент «выключен»

• Включение элемента включает элемент родителя

Page 46: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Дерево

/*filter(*/where name = /*name(*/’Jack’/*))*/

• Шаблон

–filter

• name

Page 47: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Пример с join

select distinct c.id, c.name

from company c

inner join comp_office co on co.comp_id = c.id

where c.name ilike '2 gis%’

and co.country ilike ‘russia%’

Page 48: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Пример с join

select distinct c.id, c.name

from company c

inner join comp_office co on co.comp_id = c.id

where c.name ilike /*name(*/'2 gis%’/*)*/

and co.country ilike /*country(*/ ‘russia%’/*)*/

Page 49: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Пример с join

select distinct c.id, c.name

from company c

inner join comp_office co on co.comp_id = c.id

where c.name ilike /*name(*/'2 gis%’/*)*/

/*office(*/and co.country ilike /*country(*/ ‘russia%’/*))*/

Page 50: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Пример с join

select distinct c.id, c.name

from company c

/*office(*/inner join comp_office co on co.comp_id = c.id/*)*/

where c.name ilike /*name(*/'2 gis%’/*)*/

/*office(*/and co.country ilike /*country(*/ ‘russia%’/*))*/

Page 51: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Пример с join

• Шаблон

– office (join)

– name

– office (where)

• country

Page 52: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Пример с join

Template t = new Template(“…”);

t.assignValue(“name”, “Sbertech%”);

Page 53: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Пример с join

select distinct c.id, c.name

from company c

where c.name ilike ‘Sbertech%’

Page 54: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Пример с join

Template t = new Template(“…”);

t.assignValue(“name”, “Sbertech%”);

t.assignValue(“country”, “Rus%”);

Page 55: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Пример с join

select distinct c.id, c.name

from company c

inner join comp_office co on co.comp_id = c.id

where c.name ilike ‘Sbertech%’

and co.country ilike ‘Rus%’

Page 56: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Реальный примерselect distinct c.id, c.name

from company c

inner join comp_office co on co.comp_id = c.id

inner join orders o on o.comp_id = c.id

where c.name ilike '2 gis%'

and co.country ilike 'russia%'

and co.city ilike 'novosibirsk%'

and co.street ilike 'marks%'

and o.date > currenttime - '6 month'::interval

limit 10 offset 5

Page 57: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Реальный примерselect distinct c.id, c.name

from company c

inner join comp_office co on co.comp_id = c.id

inner join orders o on o.comp_id = c.id

where c.name ilike /*name(*/'2 gis%’/*)*/

and co.country ilike /*country(*/'russia%' /*)*/

and co.city ilike /*city(*/'novosibirsk%’/*)*/

and co.street ilike /*street(*/'marks%'/*)*/

and o.date > currenttime - '6 month'::interval

limit /*limit(int*/10/*)*/ offset /*offset(int*/5/*)*/

Page 58: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Реальный примерselect distinct c.id, c.name

from company c

inner join comp_office co on co.comp_id = c.id

inner join orders o on o.comp_id = c.id

where c.name ilike /*name(*/'2 gis%’/*)*/

and co.country ilike /*country(*/'russia%' /*)*/

and co.city ilike /*city(*/'novosibirsk%’/*)*/

and co.street ilike /*street(*/'marks%'/*)*/

/*active(*/and o.date > currenttime - '6 month'::interval/*)*/

limit /*limit(int*/10/*)*/ offset /*offset(int*/5/*)*/

Page 59: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Реальный примерselect distinct c.id, c.name

from company c

inner join comp_office co on co.comp_id = c.id

/*active(*/inner join orders o on o.comp_id = c.id/*)*/

where c.name ilike /*name(*/'2 gis%’/*)*/

and co.country ilike /*country(*/'russia%' /*)*/

and co.city ilike /*city(*/'novosibirsk%’/*)*/

and co.street ilike /*street(*/'marks%'/*)*/

/*active(*/and o.date > currenttime - '6 month'::interval/*)*/

limit /*limit(int*/10/*)*/ offset /*offset(int*/5/*)*/

Page 60: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Реальный примерselect distinct c.id, c.name

from company c

/*office(*/inner join comp_office co on co.comp_id = c.id/*)*/

/*active(*/inner join orders o on o.comp_id = c.id/*)*/

where c.name ilike /*name(*/'2 gis%’/*)*/

/*office(*/and co.country ilike /*country(*/'russia%' /*)*/

and co.city ilike /*city(*/'novosibirsk%’/*)*/

and co.street ilike /*street(*/'marks%'/*))*/

/*active(*/and o.date > currenttime - '6 month'::interval/*)*/

limit /*limit(int*/10/*)*/ offset /*offset(int*/5/*)*/

Page 61: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Реальный пример

• Шаблон– office (join)– active (join)– name– office (where)

• country• city• street

– active (where)– limit и offset

Page 62: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Реальный пример

Template t = new Template(“…”);

t.assignValue(“name”, “2 gis”);

t.assignValue(“country”, “russia”);

t.assignValue(“city”, “novosibirsk”);

t.assignValue(“street”, “marksa”);

t.assignValue(“limit”, 10);

t.assignValue(“offset”, 5);

t.enable(“active”);

Page 63: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Что дает нам велосипед?

• Ограничение текста запроса

• Позволяет контролировать тип параметров

• Позволяет не удалять значения параметров

• Позволяет разрабатывать и использовать в программе один и тот же шаблон

Page 64: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Что дальше?

• POJO как конфигурация запроса

• Как получить PreparedStatement, а не текст?

• “Reflection” API и автотесты

• IDE plugins

Page 65: Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Вместо заключения

• Заимствуйте в смежных областях

• Сфокусируйтесь на узкой задаче

• Придумывайте простое решение

• DSL FTW