Skip to content

Commit

Permalink
Сортировка при получении сущностей
Browse files Browse the repository at this point in the history
  • Loading branch information
nixel2007 committed Aug 20, 2024
1 parent fa1ffd2 commit 51c1703
Show file tree
Hide file tree
Showing 11 changed files with 215 additions and 58 deletions.
1 change: 1 addition & 0 deletions lib.config
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
<class name="МодельДанных" file="src/Классы/МодельДанных.os"/>
<class name="ОбъектМодели" file="src/Классы/ОбъектМодели.os"/>
<class name="ЭлементОтбора" file="src/Классы/ЭлементОтбора.os"/>
<class name="ЭлементПорядка" file="src/Классы/ЭлементПорядка.os"/>
<class name="ХранилищеСущностей" file="src/Классы/ХранилищеСущностей.os"/>
<class name="КоннекторInMemory" file="src/Классы/КоннекторInMemory.os"/>
<module name="ТипыКолонок" file="src/Модули/ТипыКолонок.os"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,11 +74,12 @@
ПулСущностей.Вставить(ОбъектМодели.ПолучитьЗначениеИдентификатора(Сущность), Сущность);
КонецПроцедуры

Функция Получить(Коннектор, ОбъектМодели, ПулСущностей, Отбор = Неопределено) Экспорт
Функция Получить(Коннектор, ОбъектМодели, ПулСущностей, Отбор = Неопределено, Сортировка = Неопределено) Экспорт

Check failure on line 77 in src/internal/Модули/РаботаСКоннекторами.os

View check run for this annotation

sonar.openbsl.ru qa-bot / entity Sonarqube Results

src/internal/Модули/РаботаСКоннекторами.os#L77

Уменьшите когнитивную сложность "Получить" с 41 до 15

Check failure on line 77 in src/internal/Модули/РаботаСКоннекторами.os

View check run for this annotation

sonar.openbsl.ru qa-bot / entity Sonarqube Results

src/internal/Модули/РаботаСКоннекторами.os#L77

Уменьшите цикломатическую сложность "Получить" с 26 до 20
Колонки = ОбъектМодели.Колонки();
ПодчиненныеТаблицы = ОбъектМодели.ПодчиненныеТаблицы();

ПередаваемыйОтбор = Новый Массив;
ПередаваемаяСортировка = Новый Массив;

Если ТипЗнч(Отбор) = Тип("Соответствие") Тогда
// Переформируем ключи отбора из имен полей в имена колонок
Expand Down Expand Up @@ -118,10 +119,37 @@
Иначе
ВызватьИсключение "В метод получения данных передан неожиданный тип отбора: " + ТипЗнч(Отбор);
КонецЕсли;

Если ТипЗнч(Сортировка) = Тип("Массив") Тогда
Для Каждого ЭлементПорядка Из Сортировка Цикл
Колонка = Колонки.Найти(ЭлементПорядка.ПутьКДанным, "ИмяПоля");
Ожидаем.Что(
Колонка,
СтрШаблон("Не удалось найти данные о колонке по имени поля %1", ЭлементПорядка.ПутьКДанным)
).Не_().Равно(Неопределено);

Check notice on line 129 in src/internal/Модули/РаботаСКоннекторами.os

View check run for this annotation

sonar.openbsl.ru qa-bot / entity Sonarqube Results

src/internal/Модули/РаботаСКоннекторами.os#L129

Проверьте правильность переноса операндов, операторов и параметров

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

Check notice on line 140 in src/internal/Модули/РаботаСКоннекторами.os

View check run for this annotation

sonar.openbsl.ru qa-bot / entity Sonarqube Results

src/internal/Модули/РаботаСКоннекторами.os#L140

Проверьте правильность переноса операндов, операторов и параметров

ЭлементПорядка = Новый ЭлементПорядка(Колонка.ИмяКолонки, ЭлементПорядка.НаправлениеСортировки);
ПередаваемаяСортировка.Добавить(ЭлементПорядка);
ИначеЕсли Сортировка = Неопределено Тогда

Check warning on line 144 in src/internal/Модули/РаботаСКоннекторами.os

View check run for this annotation

sonar.openbsl.ru qa-bot / entity Sonarqube Results

src/internal/Модули/РаботаСКоннекторами.os#L144

Наполните блок кодом или удалите его
// no-op
Иначе
ВызватьИсключение "В метод получения данных передан неожиданный тип сортировки: " + ТипЗнч(Сортировка);
КонецЕсли;

НайденныеСущности = Новый Массив;

НайденныеСтроки = Коннектор.НайтиСтрокиВТаблице(ОбъектМодели, ПередаваемыйОтбор);
НайденныеСтроки = Коннектор.НайтиСтрокиВТаблице(ОбъектМодели, ПередаваемыйОтбор, ПередаваемаяСортировка);
Если НайденныеСтроки.Количество() = 0 Тогда
Возврат НайденныеСущности;
КонецЕсли;
Expand Down Expand Up @@ -172,7 +200,8 @@

МассивОтборов = Новый Массив;
МассивОтборов.Добавить(ЭлементОтбора);
ЗначениеКолонки = Коннектор.НайтиСтрокиВТаблице(ОбъектМоделиЭлементКоллекции, МассивОтборов);
МассивСортировки = Новый Массив;
ЗначениеКолонки = Коннектор.НайтиСтрокиВТаблице(ОбъектМоделиЭлементКоллекции, МассивОтборов, МассивСортировки);

ЗначениеКолонки = ОбработкаКоллекций.ПреобразоватьКоллекциюСтрокККоллекции(ЗначениеКолонки, ПодчиненнаяТаблица);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@
// Массив - Массив, элементами которого являются "Соответствия". Ключом элемента соответствия является имя колонки,
// значением элемента соответствия - значение колонки.
//
Функция НайтиСтрокиВТаблице(ОбъектМодели, Отбор = Неопределено) Экспорт
Функция НайтиСтрокиВТаблице(ОбъектМодели, Отбор = Неопределено, Сортировка = Неопределено) Экспорт

Check warning on line 94 in src/Классы/АбстрактныйКоннектор.os

View check run for this annotation

sonar.openbsl.ru qa-bot / entity Sonarqube Results

src/Классы/АбстрактныйКоннектор.os#L94

Уберите неиспользуемый параметр "ОбъектМодели"

Check warning on line 94 in src/Классы/АбстрактныйКоннектор.os

View check run for this annotation

sonar.openbsl.ru qa-bot / entity Sonarqube Results

src/Классы/АбстрактныйКоннектор.os#L94

Уберите неиспользуемый параметр "Отбор"

Check warning on line 94 in src/Классы/АбстрактныйКоннектор.os

View check run for this annotation

sonar.openbsl.ru qa-bot / entity Sonarqube Results

src/Классы/АбстрактныйКоннектор.os#L94

Уберите неиспользуемый параметр "Сортировка"

Check warning on line 94 in src/Классы/АбстрактныйКоннектор.os

View check run for this annotation

sonar.openbsl.ru qa-bot / entity Sonarqube Results

src/Классы/АбстрактныйКоннектор.os#L94

Необходимо добавить описание параметра "Сортировка"

МассивЗначений = Новый Массив;
Возврат МассивЗначений;
Expand Down
98 changes: 67 additions & 31 deletions src/Классы/АбстрактныйКоннекторSQL.os
Original file line number Diff line number Diff line change
Expand Up @@ -58,19 +58,8 @@
ОбъектМодели.ИмяТаблицы()
);

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

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

СтрокаУсловий = ПолучитьСтрокуУсловий(Запрос, Отбор);

Если ЗначениеЗаполнено(СтрокаУсловий) Тогда
ТекстЗапроса = ТекстЗапроса + Символы.ПС + "WHERE " + СтрокаУсловий;
КонецЕсли;
Expand All @@ -93,7 +82,7 @@
// Массив - Массив, элементами которого являются "Соответствия". Ключом элемента соответствия является имя колонки,
// значением элемента соответствия - значение колонки.
//
Функция НайтиСтрокиВТаблице(ОбъектМодели, Знач Отбор) Экспорт
Функция НайтиСтрокиВТаблице(ОбъектМодели, Знач Отбор = Неопределено, Знач Сортировка = Неопределено) Экспорт

Check warning on line 85 in src/Классы/АбстрактныйКоннекторSQL.os

View check run for this annotation

sonar.openbsl.ru qa-bot / entity Sonarqube Results

src/Классы/АбстрактныйКоннекторSQL.os#L85

Необходимо добавить описание параметра "Сортировка"

НайденныеСтроки = Новый Массив;
Колонки = ОбъектМодели.Колонки();
Expand All @@ -105,26 +94,17 @@
ОбъектМодели.ИмяТаблицы()
);

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

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

Если ЗначениеЗаполнено(СтрокаУсловий) Тогда
ТекстЗапроса = ТекстЗапроса + Символы.ПС + "WHERE " + СтрокаУсловий;
КонецЕсли;

СтрокаСортировки = ПолучитьСтрокуСортировки(Сортировка);

Если ЗначениеЗаполнено(СтрокаСортировки) Тогда
ТекстЗапроса = ТекстЗапроса + Символы.ПС + "ORDER BY " + СтрокаСортировки;
КонецЕсли;

Лог.Отладка("Поиск сущности в таблице %1:%2%3", ОбъектМодели.ИмяТаблицы(), Символы.ПС, ТекстЗапроса);

Expand Down Expand Up @@ -256,4 +236,60 @@

Запрос.ВыполнитьКоманду();

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

Функция ПолучитьСтрокуУсловий(Запрос, Отбор) Экспорт

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

Если Отбор = Неопределено Тогда
Возврат СтрокаУсловий;
КонецЕсли;

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

Check notice on line 260 in src/Классы/АбстрактныйКоннекторSQL.os

View check run for this annotation

sonar.openbsl.ru qa-bot / entity Sonarqube Results

src/Классы/АбстрактныйКоннекторSQL.os#L260

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

Возврат СтрокаУсловий;

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

Функция ПолучитьСтрокуСортировки(Сортировка)

СтрокаСортировки = "";

Если Сортировка = Неопределено Тогда
Возврат СтрокаСортировки;
КонецЕсли;

Для сч = 0 По Сортировка.ВГраница() Цикл
ЭлементСортировки = Сортировка[сч];

Если ЗначениеЗаполнено(СтрокаСортировки) Тогда
СтрокаСортировки = СтрокаСортировки + ", " + Символы.ПС + Символы.Таб;
КонецЕсли;

ИмяКолонки = ЭлементСортировки.ПутьКДанным;
Направление = ?(ЭлементСортировки.НаправлениеСортировки = НаправлениеСортировки.Возр, "ASC", "DESC");

СтрокаСортировки = СтрокаСортировки + СтрШаблон(
"%1 %2",
ИмяКолонки,
Направление
);

Check notice on line 290 in src/Классы/АбстрактныйКоннекторSQL.os

View check run for this annotation

sonar.openbsl.ru qa-bot / entity Sonarqube Results

src/Классы/АбстрактныйКоннекторSQL.os#L290

Проверьте правильность переноса операндов, операторов и параметров
КонецЦикла;

Возврат СтрокаСортировки;

КонецФункции
52 changes: 36 additions & 16 deletions src/Классы/КоннекторInMemory.os
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@
// Массив - Массив, элементами которого являются "Соответствия". Ключом элемента соответствия является имя колонки,
// значением элемента соответствия - значение колонки.
//
Функция НайтиСтрокиВТаблице(ОбъектМодели, Отбор = Неопределено) Экспорт
Функция НайтиСтрокиВТаблице(ОбъектМодели, Отбор = Неопределено, Сортировка = Неопределено) Экспорт

Check failure on line 190 in src/Классы/КоннекторInMemory.os

View check run for this annotation

sonar.openbsl.ru qa-bot / entity Sonarqube Results

src/Классы/КоннекторInMemory.os#L190

Уменьшите когнитивную сложность "НайтиСтрокиВТаблице" с 18 до 15

Check warning on line 190 in src/Классы/КоннекторInMemory.os

View check run for this annotation

sonar.openbsl.ru qa-bot / entity Sonarqube Results

src/Классы/КоннекторInMemory.os#L190

Необходимо добавить описание параметра "Сортировка"

ИмяТаблицы = ОбъектМодели.ИмяТаблицы();

Expand All @@ -201,24 +201,44 @@

Колонки = ОбъектМодели.Колонки();

Для Каждого ЭлементОтбора Из Отбор Цикл
Если Отбор <> Неопределено Тогда
Для Каждого ЭлементОтбора Из Отбор Цикл

НайденныеКолонки = Колонки.НайтиСтроки(Новый Структура("ИмяКолонки", ЭлементОтбора.ПутьКДанным));
НайденныеКолонки = Колонки.НайтиСтроки(Новый Структура("ИмяКолонки", ЭлементОтбора.ПутьКДанным));

Если НайденныеКолонки.Количество() = 0 Тогда
ИмяПоля = ЭлементОтбора.ПутьКДанным;
Иначе
ИмяПоля = НайденныеКолонки[0].ИмяПоля;
КонецЕсли;
Если НайденныеКолонки.Количество() = 0 Тогда
ИмяПоля = ЭлементОтбора.ПутьКДанным;
Иначе
ИмяПоля = НайденныеКолонки[0].ИмяПоля;
КонецЕсли;

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

Если Сортировка <> Неопределено Тогда
Для Каждого ЭлементПорядка Из Сортировка Цикл

НайденныеКолонки = Колонки.НайтиСтроки(Новый Структура("ИмяКолонки", ЭлементПорядка.ПутьКДанным));

Если НайденныеКолонки.Количество() = 0 Тогда
ИмяПоля = ЭлементПорядка.ПутьКДанным;
Иначе
ИмяПоля = НайденныеКолонки[0].ИмяПоля;
КонецЕсли;

// формирование текста лямбды для сравнения элементов по нескольким полям

Check notice on line 237 in src/Классы/КоннекторInMemory.os

View check run for this annotation

sonar.openbsl.ru qa-bot / entity Sonarqube Results

src/Классы/КоннекторInMemory.os#L237

Удалите лишние последовательные пустые строки


КонецЦикла;
КонецЕсли;

ДанныеТаблицы = ПроцессорКоллекций.ВМассив();

Expand Down
2 changes: 1 addition & 1 deletion src/Классы/КоннекторJSON.os
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@
// Массив - Массив, элементами которого являются "Соответствия". Ключом элемента соответствия является имя колонки,
// значением элемента соответствия - значение колонки.
//
Функция НайтиСтрокиВТаблице(ОбъектМодели, Знач Отбор) Экспорт
Функция НайтиСтрокиВТаблице(ОбъектМодели, Знач Отбор = Неопределено, Сортировка = Неопределено) Экспорт

Check warning on line 187 in src/Классы/КоннекторJSON.os

View check run for this annotation

sonar.openbsl.ru qa-bot / entity Sonarqube Results

src/Классы/КоннекторJSON.os#L187

Уберите неиспользуемый параметр "Сортировка"

Check warning on line 187 in src/Классы/КоннекторJSON.os

View check run for this annotation

sonar.openbsl.ru qa-bot / entity Sonarqube Results

src/Классы/КоннекторJSON.os#L187

Необходимо добавить описание параметра "Сортировка"

НайденныеСтроки = Новый Массив;

Expand Down
4 changes: 2 additions & 2 deletions src/Классы/КоннекторPostgreSQL.os
Original file line number Diff line number Diff line change
Expand Up @@ -238,9 +238,9 @@
// Массив - Массив, элементами которого являются "Соответствия". Ключом элемента соответствия является имя колонки,
// значением элемента соответствия - значение колонки.
//
Функция НайтиСтрокиВТаблице(ОбъектМодели, Знач Отбор) Экспорт
Функция НайтиСтрокиВТаблице(ОбъектМодели, Знач Отбор = Неопределено, Знач Сортировка = Неопределено) Экспорт

Check warning on line 241 in src/Классы/КоннекторPostgreSQL.os

View check run for this annotation

sonar.openbsl.ru qa-bot / entity Sonarqube Results

src/Классы/КоннекторPostgreSQL.os#L241

Необходимо добавить описание параметра "Сортировка"

Возврат КоннекторSQL.НайтиСтрокиВТаблице(ОбъектМодели, Отбор);
Возврат КоннекторSQL.НайтиСтрокиВТаблице(ОбъектМодели, Отбор, Сортировка);

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

Expand Down
4 changes: 2 additions & 2 deletions src/Классы/КоннекторSQLite.os
Original file line number Diff line number Diff line change
Expand Up @@ -187,9 +187,9 @@
// Массив - Массив, элементами которого являются "Соответствия". Ключом элемента соответствия является имя колонки,
// значением элемента соответствия - значение колонки.
//
Функция НайтиСтрокиВТаблице(ОбъектМодели, Знач Отбор) Экспорт
Функция НайтиСтрокиВТаблице(ОбъектМодели, Знач Отбор = Неопределено, Знач Сортировка = Неопределено) Экспорт

Check warning on line 190 in src/Классы/КоннекторSQLite.os

View check run for this annotation

sonar.openbsl.ru qa-bot / entity Sonarqube Results

src/Классы/КоннекторSQLite.os#L190

Необходимо добавить описание параметра "Сортировка"

Возврат КоннекторSQL.НайтиСтрокиВТаблице(ОбъектМодели, Отбор);
Возврат КоннекторSQL.НайтиСтрокиВТаблице(ОбъектМодели, Отбор, Сортировка);

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

Expand Down
Loading

0 comments on commit 51c1703

Please sign in to comment.