Skip to content

Commit

Permalink
Merge pull request #97 from nixel2007/feature/filter-in
Browse files Browse the repository at this point in the history
  • Loading branch information
nixel2007 authored Jan 12, 2025
2 parents 1d45402 + b19fc7e commit 23c5be4
Show file tree
Hide file tree
Showing 10 changed files with 549 additions and 19 deletions.
20 changes: 20 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,26 @@
.Отбор("ДатаРождения", ВидСравнения.Меньше, Дата(2000, 1, 1));
ДетиДевяностых = МенеджерСущностей.Получить(Тип("ФизическоеЛицо"), ОпцииПоиска);
// Найдем всех физических лиц с именем Иван или Петр.
МассивИмен = Новый Массив;
МассивИмен.Добавить("Иван");
МассивИмен.Добавить("Петр");
ОпцииПоиска = Новый ОпцииПоиска()
.Отбор("Имя", ВидСравнения.В, МассивИмен);
ИваныИПетры = МенеджерСущностей.Получить(Тип("ФизическоеЛицо"), ОпцииПоиска);
// Найдем всех физических лиц НЕ с именем Иван или Петр.
МассивИмен = Новый Массив;
МассивИмен.Добавить("Иван");
МассивИмен.Добавить("Петр");
ОпцииПоиска = Новый ОпцииПоиска()
.Отбор("Имя", ВидСравнения.НеВ, МассивИмен);
ЛюдиСДругимиИменами = МенеджерСущностей.Получить(Тип("ФизическоеЛицо"), ОпцииПоиска);
```

<a id="entity-sort" />
Expand Down
2 changes: 2 additions & 0 deletions docs/ВидСравнения.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,5 @@
* Меньше
* МеньшеИлиРавно
* НеРавно
* В
* НеВ
49 changes: 40 additions & 9 deletions src/Классы/АбстрактныйКоннекторSQL.os
Original file line number Diff line number Diff line change
Expand Up @@ -246,19 +246,50 @@

СтрокаУсловий = "";

Для сч = 0 По Отбор.ВГраница() Цикл
ЭлементОтбора = Отбор[сч];
сч = 0;
Для Каждого ЭлементОтбора Из Отбор Цикл
ПредставлениеСчетчика = "п" + Формат(сч + 1, "ЧН=0; ЧГ=");
Если ЗначениеЗаполнено(СтрокаУсловий) Тогда
СтрокаУсловий = СтрокаУсловий + Символы.ПС + Символы.Таб + "AND ";
КонецЕсли;
СтрокаУсловий = СтрокаУсловий + СтрШаблон(
"%1 %2 @%3",
ЭлементОтбора.ПутьКДанным,
ЭлементОтбора.ВидСравнения,
ПредставлениеСчетчика
);
Запрос.УстановитьПараметр(ПредставлениеСчетчика, ЭлементОтбора.Значение);
Если ЭлементОтбора.ВидСравнения = ВидСравнения.В ИЛИ ЭлементОтбора.ВидСравнения = ВидСравнения.НеВ Тогда
ПараметрыВ = Новый Массив;
Для Каждого Элемент Из ЭлементОтбора.Значение Цикл
ПредставлениеСчетчика = "п" + Формат(сч + 1, "ЧН=0; ЧГ=");
ПараметрыВ.Добавить(ПредставлениеСчетчика);

Запрос.УстановитьПараметр(ПредставлениеСчетчика, Элемент);

сч = сч + 1;
КонецЦикла;

Если ПараметрыВ.Количество() = 0 Тогда
СтрокаУсловий = СтрокаУсловий + "FALSE";
Иначе

ПодстрокаНе = ?(ЭлементОтбора.ВидСравнения = ВидСравнения.НеВ, "NOT ", "");

СтрокаУсловий = СтрокаУсловий + СтрШаблон(
"%1 %2 IN (@%3)",
ЭлементОтбора.ПутьКДанным,
ПодстрокаНе,
СтрСоединить(ПараметрыВ, ", @")
);
КонецЕсли;

Иначе
СтрокаУсловий = СтрокаУсловий + СтрШаблон(
"%1 %2 @%3",
ЭлементОтбора.ПутьКДанным,
ЭлементОтбора.ВидСравнения,
ПредставлениеСчетчика
);

Запрос.УстановитьПараметр(ПредставлениеСчетчика, ЭлементОтбора.Значение);

КонецЕсли;

сч = сч + 1;
КонецЦикла;

Возврат СтрокаУсловий;
Expand Down
23 changes: 18 additions & 5 deletions src/Классы/КоннекторInMemory.os
Original file line number Diff line number Diff line change
Expand Up @@ -219,11 +219,24 @@
ИмяПоля = НайденныеКолонки[0].ИмяПоля;
КонецЕсли;

СтрокаУсловие = СтрШаблон(
"Элемент -> Элемент._Сущность.%1 %2 Значение",
ИмяПоля,
ЭлементОтбора.ВидСравнения
);
Если ЭлементОтбора.ВидСравнения = ВидСравнения.В Тогда
СтрокаУсловие = СтрШаблон(
"Элемент -> Значение.Найти(Элемент._Сущность.%1) <> Неопределено",
ЭлементОтбора.ПутьКДанным
);
ИначеЕсли ЭлементОтбора.ВидСравнения = ВидСравнения.НеВ Тогда
СтрокаУсловие = СтрШаблон(
"Элемент -> Значение.Найти(Элемент._Сущность.%1) = Неопределено",
ЭлементОтбора.ПутьКДанным
);
Иначе
СтрокаУсловие = СтрШаблон(
"Элемент -> Элемент._Сущность.%1 %2 Значение",
ИмяПоля,
ЭлементОтбора.ВидСравнения
);
КонецЕсли;

ДополнительныеПараметры = Новый Структура("Значение", ЭлементОтбора.Значение);
ПроцессорКоллекций = ПроцессорКоллекций.Фильтровать(СтрокаУсловие, ДополнительныеПараметры);
КонецЦикла;
Expand Down
22 changes: 17 additions & 5 deletions src/Классы/КоннекторJSON.os
Original file line number Diff line number Diff line change
Expand Up @@ -200,11 +200,23 @@
ПроцессорКоллекций = ПроцессорыКоллекций.ИзКоллекции(Таблица);

Для Каждого ЭлементОтбора Из ОпцииПоиска.Отборы() Цикл
СтрокаУсловие = СтрШаблон(
"Элемент -> Элемент.Значение.Получить(""%1"") %2 Значение",
ЭлементОтбора.ПутьКДанным,
ЭлементОтбора.ВидСравнения
);
Если ЭлементОтбора.ВидСравнения = ВидСравнения.В Тогда
СтрокаУсловие = СтрШаблон(
"Элемент -> Значение.Найти(Элемент.Значение.Получить(""%1"")) <> Неопределено",
ЭлементОтбора.ПутьКДанным
);
ИначеЕсли ЭлементОтбора.ВидСравнения = ВидСравнения.НеВ Тогда
СтрокаУсловие = СтрШаблон(
"Элемент -> Значение.Найти(Элемент.Значение.Получить(""%1"")) = Неопределено",
ЭлементОтбора.ПутьКДанным
);
Иначе
СтрокаУсловие = СтрШаблон(
"Элемент -> Элемент.Значение.Получить(""%1"") %2 Значение",
ЭлементОтбора.ПутьКДанным,
ЭлементОтбора.ВидСравнения
);
КонецЕсли;
ДополнительныеПараметры = Новый Структура("Значение", ЭлементОтбора.Значение);
ПроцессорКоллекций = ПроцессорКоллекций.Фильтровать(СтрокаУсловие, ДополнительныеПараметры);
КонецЦикла;
Expand Down
4 changes: 4 additions & 0 deletions src/Модули/ВидСравнения.os
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,14 @@
Перем Меньше Экспорт;
Перем МеньшеИлиРавно Экспорт;
Перем НеРавно Экспорт;
Перем В Экспорт;
Перем НеВ Экспорт;

Равно = "=";
Больше = ">";
БольшеИлиРавно = ">=";
Меньше = "<";
МеньшеИлиРавно = "<=";
НеРавно = "<>";
В = "IN";
НеВ = "NOT IN";
111 changes: 111 additions & 0 deletions tests/КоннекторInMemory.os
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,117 @@
Ожидаем.Что(ЗначенияКолонок.Получить("ДвоичныеДанные"), "ЗначенияКолонок.ДвоичныеДанные получено корректно").Равно(Сущность.ДвоичныеДанные);
КонецПроцедуры

&Тест
Процедура ПоискВСписке() Экспорт

// Дано
МодельДанных = Новый МодельДанных();
ОбъектМодели = МодельДанных.СоздатьОбъектМодели(Тип("СущностьСоВсемиТипамиКолонок"));
Коннектор.ИнициализироватьТаблицу(ОбъектМодели);

Сущность = Новый СущностьСоВсемиТипамиКолонок;
Сущность.Целое = 1;
Коннектор.Сохранить(ОбъектМодели, Сущность);

Сущность = Новый СущностьСоВсемиТипамиКолонок;
Сущность.Целое = 2;
Коннектор.Сохранить(ОбъектМодели, Сущность);

Сущность = Новый СущностьСоВсемиТипамиКолонок;
Сущность.Целое = 3;
Коннектор.Сохранить(ОбъектМодели, Сущность);

// Когда
МассивПоиска = Новый Массив;
МассивПоиска.Добавить(1);
МассивПоиска.Добавить(3);

ОпцииПоиска = Новый ОпцииПоиска();
ОпцииПоиска.Отбор("Целое", ВидСравнения.В, МассивПоиска);

НайденныеСтроки = Коннектор.НайтиСтрокиВТаблице(ОбъектМодели, ОпцииПоиска);

// Тогда
Ожидаем.Что(НайденныеСтроки, "Все строки получены").ИмеетДлину(2);
Ожидаем.Что(НайденныеСтроки[0].Получить("Целое"), "Строки найдены").Равно(1);
Ожидаем.Что(НайденныеСтроки[1].Получить("Целое"), "Строки найдены").Равно(3);

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

&Тест
Процедура ПоискНеВСписке() Экспорт

// Дано
МодельДанных = Новый МодельДанных();
ОбъектМодели = МодельДанных.СоздатьОбъектМодели(Тип("СущностьСоВсемиТипамиКолонок"));
Коннектор.ИнициализироватьТаблицу(ОбъектМодели);

Сущность = Новый СущностьСоВсемиТипамиКолонок;
Сущность.Целое = 1;
Коннектор.Сохранить(ОбъектМодели, Сущность);

Сущность = Новый СущностьСоВсемиТипамиКолонок;
Сущность.Целое = 2;
Коннектор.Сохранить(ОбъектМодели, Сущность);

Сущность = Новый СущностьСоВсемиТипамиКолонок;
Сущность.Целое = 3;
Коннектор.Сохранить(ОбъектМодели, Сущность);

Сущность = Новый СущностьСоВсемиТипамиКолонок;
Сущность.Целое = 4;
Коннектор.Сохранить(ОбъектМодели, Сущность);

// Когда
МассивПоиска = Новый Массив;
МассивПоиска.Добавить(1);
МассивПоиска.Добавить(3);

ОпцииПоиска = Новый ОпцииПоиска();
ОпцииПоиска.Отбор("Целое", ВидСравнения.НеВ, МассивПоиска);

НайденныеСтроки = Коннектор.НайтиСтрокиВТаблице(ОбъектМодели, ОпцииПоиска);

// Тогда
Ожидаем.Что(НайденныеСтроки, "Все строки получены").ИмеетДлину(2);
Ожидаем.Что(НайденныеСтроки[0].Получить("Целое"), "Строки найдены").Равно(2);
Ожидаем.Что(НайденныеСтроки[1].Получить("Целое"), "Строки найдены").Равно(4);

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

&Тест
Процедура ПоискВПустомСписке() Экспорт

// Дано
МодельДанных = Новый МодельДанных();
ОбъектМодели = МодельДанных.СоздатьОбъектМодели(Тип("СущностьСоВсемиТипамиКолонок"));
Коннектор.ИнициализироватьТаблицу(ОбъектМодели);

Сущность = Новый СущностьСоВсемиТипамиКолонок;
Сущность.Целое = 1;
Коннектор.Сохранить(ОбъектМодели, Сущность);

Сущность = Новый СущностьСоВсемиТипамиКолонок;
Сущность.Целое = 2;
Коннектор.Сохранить(ОбъектМодели, Сущность);

Сущность = Новый СущностьСоВсемиТипамиКолонок;
Сущность.Целое = 3;
Коннектор.Сохранить(ОбъектМодели, Сущность);

// Когда
МассивПоиска = Новый Массив;

ОпцииПоиска = Новый ОпцииПоиска();
ОпцииПоиска.Отбор("Целое", ВидСравнения.В, МассивПоиска);

НайденныеСтроки = Коннектор.НайтиСтрокиВТаблице(ОбъектМодели, ОпцииПоиска);

// Тогда
Ожидаем.Что(НайденныеСтроки, "Строки не найдены").ИмеетДлину(0);

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

&Тест
Процедура УдалитьСтрокиВТаблице() Экспорт
МодельДанных = Новый МодельДанных();
Expand Down
Loading

0 comments on commit 23c5be4

Please sign in to comment.