Skip to content

Commit

Permalink
Сортировка по нескольким колонкам в менеджере и коннекторах
Browse files Browse the repository at this point in the history
  • Loading branch information
nixel2007 committed Aug 21, 2024
1 parent 92c75f6 commit 44522ed
Show file tree
Hide file tree
Showing 15 changed files with 739 additions and 373 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
647 changes: 338 additions & 309 deletions src/internal/Модули/РаботаСКоннекторами.os

Large diffs are not rendered by default.

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

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

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

КонецФункции
67 changes: 52 additions & 15 deletions src/Классы/КоннекторInMemory.os
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#Использовать "../internal"
#Использовать fluent

// Для хранения статуса соединения
Перем Открыт;
Expand Down Expand Up @@ -187,7 +188,7 @@
// Массив - Массив, элементами которого являются "Соответствия". Ключом элемента соответствия является имя колонки,
// значением элемента соответствия - значение колонки.
//
Функция НайтиСтрокиВТаблице(ОбъектМодели, Отбор = Неопределено) Экспорт
Функция НайтиСтрокиВТаблице(ОбъектМодели, Отбор = Неопределено, Сортировка = Неопределено) Экспорт

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

View check run for this annotation

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

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

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

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

View check run for this annotation

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

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

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

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

Expand All @@ -201,24 +202,60 @@

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

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

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

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

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

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

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

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

Check warning 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

Длина строки 128 превышает максимально допустимую 120

// формирование текста лямбды для сравнения элементов по нескольким полям
СтрокаСортировка = СтрокаСортировка + СтрШаблон(
"Сравнение = ПроцессорыКоллекцийСлужебный.СравнениеЗначений%1(Элемент1._Сущность.%2, Элемент2._Сущность.%2);
|Если Сравнение <> 0 Тогда
| Возврат Сравнение;
|КонецЕсли;
|
|",
ПорядокСортировки,
ИмяПоля
);

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

View check run for this annotation

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

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

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

КонецЦикла;

Если СтрокаСортировка <> "" Тогда
СтрокаСортировка = "(Элемент1, Элемент2) -> " + Символы.ПС + СтрокаСортировка + "Возврат Сравнение;";

ПроцессорКоллекций = ПроцессорКоллекций.Сортировать(СтрокаСортировка);
КонецЕсли;
КонецЕсли;

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

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

Check failure 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

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

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 All @@ -195,15 +195,52 @@

ПроцессорКоллекций = ПроцессорыКоллекций.ИзКоллекции(Таблица);

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

Если Сортировка <> Неопределено Тогда
Колонки = ОбъектМодели.Колонки();
СтрокаСортировка = "";
Для Каждого ЭлементПорядка Из Сортировка Цикл

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

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

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

View check run for this annotation

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

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

Длина строки 128 превышает максимально допустимую 120

// формирование текста лямбды для сравнения элементов по нескольким полям
СтрокаСортировка = СтрокаСортировка + СтрШаблон(
"Сравнение = ПроцессорыКоллекцийСлужебный.СравнениеЗначений%1(Элемент1.Значение.Получить(""%2""), Элемент2.Значение.Получить(""%2""));

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

View check run for this annotation

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

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

Длина строки 138 превышает максимально допустимую 120
|Если Сравнение <> 0 Тогда
| Возврат Сравнение;
|КонецЕсли;
|
|",
ПорядокСортировки,
ИмяПоля
);

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

View check run for this annotation

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

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

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

КонецЦикла;

Если СтрокаСортировка <> "" Тогда
СтрокаСортировка = "(Элемент1, Элемент2) -> " + Символы.ПС + СтрокаСортировка + "Возврат Сравнение;";

ПроцессорКоллекций = ПроцессорКоллекций.Сортировать(СтрокаСортировка);
КонецЕсли;
КонецЕсли;

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

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 44522ed

Please sign in to comment.