Skip to content

Commit

Permalink
feat: Поддержка предикатов Между* для запросов
Browse files Browse the repository at this point in the history
  • Loading branch information
alkoleft committed Sep 1, 2024
1 parent a4c8c0b commit c200a1e
Show file tree
Hide file tree
Showing 3 changed files with 122 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,14 @@
Шаблон = "%1 ПОДОБНО ""%%"" + &%2 + ""%%""";
ИначеЕсли Выражение = ВыраженияПредикатов.ВСписке Тогда
Шаблон = "%1 В (&%2)";
ИначеЕсли Выражение = ВыраженияПредикатов.МеждуВключаяГраницы Тогда
Шаблон = "%1 МЕЖДУ &%2 И &%3";
ИначеЕсли Выражение = ВыраженияПредикатов.МеждуИсключаяГраницы Тогда
Шаблон = "%1 > &%2 И %1 < &%3";
ИначеЕсли Выражение = ВыраженияПредикатов.МеждуВключаяНачалоГраницы Тогда
Шаблон = "%1 >= &%2 И %1 < &%3";
ИначеЕсли Выражение = ВыраженияПредикатов.МеждуВключаяОкончаниеГраницы Тогда
Шаблон = "%1 > &%2 И %1 <= &%3";
ИначеЕсли Выражение = ВыраженияПредикатов.Заполнено Тогда
// TODO Реализовать
ВызватьИсключение "Проверка заполненности пока не поддерживается";
Expand Down Expand Up @@ -379,19 +387,35 @@
Продолжить;
КонецЕсли;

ИмяПараметра = "Параметр_" + ЮТОбщий.ЧислоВСтроку(Запрос.Параметры.Количество() + 1);
ТипРеквизита = ТипыРеквизитов[Условие.ИмяРеквизита];
Шаблон = ШаблонУсловия(Условие, ВидыСравнения, ТипРеквизита);

ТекстУсловия = СтрШаблон(Шаблон, Условие.ИмяРеквизита, ИмяПараметра);
ТекстУсловия = УсловиеПоПредикату(Условие, Запрос, ВидыСравнения, ТипыРеквизитов);

Результат.Добавить(ТекстУсловия);
Запрос.Параметры.Вставить(ИмяПараметра, Условие.Значение);

КонецЦикла;

Возврат Результат;

КонецФункции

Функция УсловиеПоПредикату(Условие, Запрос, ВидыСравнения, ТипыРеквизитов)

ТипРеквизита = ТипыРеквизитов[Условие.ИмяРеквизита];
Шаблон = ШаблонУсловия(Условие, ВидыСравнения, ТипРеквизита);

ИмяПараметра = "Параметр_" + ЮТОбщий.ЧислоВСтроку(Запрос.Параметры.Количество() + 1);
Запрос.Параметры.Вставить(ИмяПараметра, Условие.Значение);

Если ЮТПредикатыСлужебныйКлиентСервер.ЭтоПредикатМежду(Условие) Тогда
ИмяПараметра2 = "Параметр_" + ЮТОбщий.ЧислоВСтроку(Запрос.Параметры.Количество() + 1);
Запрос.Параметры.Вставить(ИмяПараметра2, Условие.ОкончаниеИнтервала);

ТекстУсловия = СтрШаблон(Шаблон, Условие.ИмяРеквизита, ИмяПараметра, ИмяПараметра2);
Иначе
ТекстУсловия = СтрШаблон(Шаблон, Условие.ИмяРеквизита, ИмяПараметра);
КонецЕсли;

Возврат ТекстУсловия;

КонецФункции

#КонецОбласти
16 changes: 16 additions & 0 deletions exts/yaxunit/src/CommonModules/ЮТПредикаты/Module.bsl
Original file line number Diff line number Diff line change
Expand Up @@ -326,6 +326,22 @@

КонецФункции

// Добавляет условие, что проверяемое значение (или значение его свойства) входит в заданный интервал.
//
// Проверяемое значение может находится на границе интервала.
//
// Параметры:
// НачалоИнтервала - Произвольный - Левая граница интервала. Может иметь любой тип, позволяющий сравнивать значения
// ОкончаниеИнтервала - Произвольный - Правая граница. Может иметь любой тип, позволяющий сравнивать значения
//
// Возвращаемое значение:
// ОбщийМодуль - Этот модуль для замыкания
Функция Между(НачалоИнтервала, ОкончаниеИнтервала) Экспорт

Возврат МеждуВключаяГраницы(НачалоИнтервала, ОкончаниеИнтервала);

КонецФункции

// Добавляет условие, что проверяемое значение (или значение его свойства) входит в заданный интервал.
//
// Проверяемое значение может находится на границе интервала.
Expand Down
76 changes: 76 additions & 0 deletions tests/src/CommonModules/ОМ_ЮТЗапросы/Module.bsl
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
.ДобавитьТест("ЗначениеРеквизитаЗаписи")
.ДобавитьТест("ДвиженияДокумента")
.ДобавитьТест("Записи_Условие_ВСписке")
.ДобавитьТест("Записи_Условие_Между")
;

КонецПроцедуры
Expand Down Expand Up @@ -440,6 +441,81 @@

КонецПроцедуры

Процедура Записи_Условие_Между() Экспорт

День = 24*3600;

ИмяТаблицы = "РегистрСведений.КурсыВалют";
Валюта = ЮТест.Данные().СоздатьЭлемент("Справочник.Валюты");
Период = НачалоДня(ЮТест.Данные().СлучайнаяДата());
ПериодПосле = Период + День;
ПериодДо = Период - День;

ЮТест.Данные().КонструкторОбъекта(ИмяТаблицы)
.Установить("Валюта", Валюта)
.Установить("Период", ПериодДо).Установить("Курс", 5)
.ДобавитьЗапись()
.Установить("Период", Период).Установить("Курс", 10)
.ДобавитьЗапись()
.Установить("Период", ПериодПосле).Установить("Курс", 15)
.ДобавитьЗапись()
;

Результат = ЮТЗапросы.Записи(ИмяТаблицы, ЮТест.Предикат()
.Свойство("Валюта").Равно(Валюта))
;
ЮТест.ОжидаетЧто(Результат, "Проверка записей в регистре")
.ИмеетДлину(3)
;
// Между
Результат = ЮТЗапросы.Записи(ИмяТаблицы, ЮТест.Предикат()
.Свойство("Валюта").Равно(Валюта)
.Свойство("Период").Между(Период, ПериодПосле))
;
ЮТест.ОжидаетЧто(Результат, "Между")
.ИмеетДлину(2)
.Свойство("[0].Курс").Равно(10)
.Свойство("[1].Курс").Равно(15)
;
// МеждуИсключаяГраницы
Результат = ЮТЗапросы.Записи(ИмяТаблицы, ЮТест.Предикат()
.Свойство("Валюта").Равно(Валюта)
.Свойство("Период").МеждуИсключаяГраницы(Период, ПериодПосле))
;
ЮТест.ОжидаетЧто(Результат, "МеждуИсключаяГраницы")
.ИмеетДлину(0)
;
Результат = ЮТЗапросы.Записи(ИмяТаблицы, ЮТест.Предикат()
.Свойство("Валюта").Равно(Валюта)
.Свойство("Период").МеждуИсключаяГраницы(Период, ПериодПосле + 1))
;
ЮТест.ОжидаетЧто(Результат, "МеждуИсключаяГраницы со смещенной датой")
.ИмеетДлину(1)
.Свойство("[0].Курс").Равно(15)
;

// МеждуВключаяНачалоГраницы
Результат = ЮТЗапросы.Записи(ИмяТаблицы, ЮТест.Предикат()
.Свойство("Валюта").Равно(Валюта)
.Свойство("Период").МеждуВключаяНачалоГраницы(ПериодДо, Период))
;
ЮТест.ОжидаетЧто(Результат, "МеждуВключаяНачалоГраницы")
.ИмеетДлину(1)
.Свойство("[0].Курс").Равно(5)
;

// МеждуВключаяОкончаниеГраницы
Результат = ЮТЗапросы.Записи(ИмяТаблицы, ЮТест.Предикат()
.Свойство("Валюта").Равно(Валюта)
.Свойство("Период").МеждуВключаяОкончаниеГраницы(Период, ПериодПосле))
;
ЮТест.ОжидаетЧто(Результат, "МеждуВключаяОкончаниеГраницы")
.ИмеетДлину(1)
.Свойство("[0].Курс").Равно(15)
;

КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции
Expand Down

0 comments on commit c200a1e

Please sign in to comment.