Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LIMIT и OFFSET #99

Merged
merged 7 commits into from
Jan 12, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
* <a href="#entity-read">Чтение и поиск объектов</a>
* <a href="#entity-complex-find">Поиск сущностей со сложными отборами</a>
* <a href="#entity-sort">Сортировка результатов</a>
* <a href="#entity-limit">Пропуск и смещение</a>
* <a href="#entity-delete">Удаление сущностей</a>
* <a href="#entity-active-record">Активная запись</a>
* <a href="#entity-repository">Работа через ХранилищеСущностей</a>
Expand Down Expand Up @@ -285,6 +286,28 @@

```

<a id="#entity-limit">

### Пропуск и смещение

```bsl

// Привычный Выбрать Первые Х реализуется через ОпцииПоиска
ОпцииПоиска = Новый ОпцииПоиска()
.Первые(10);

ПервыеДесятьФизлиц = МенеджерСущностей.Получить(Тип("ФизическоеЛицо"), ОпцииПоиска);

// При желании можно использовать поиск со смещением, например, для реализации постраничной загрузки.
// Всегда указывайте правила сортировки для повторяемости результата.
ОпцииПоиска = Новый ОпцииПоиска()
.Первые(10)
.Смещение(50)
.СортироватьПо("Идентификатор", НаправлениеСортировки.ПоВозрастанию);

ШестойДесятокФизлиц = МенеджерСущностей.Получить(Тип("ФизическоеЛицо"), ОпцииПоиска);
```

<a id="entity-delete" />

## Удаление сущностей
Expand Down
50 changes: 50 additions & 0 deletions docs/ОпцииПоиска.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,3 +60,53 @@
Функция СортироватьПо(ИмяПоля, НаправлениеСортировки = Неопределено)
```

### ВыбираютсяПервые

```bsl
// Получить количество элементов, которые необходимо выбрать.
//
// Возвращаемое значение:
// Число - Количество элементов.
//
Функция ВыбираютсяПервые()
```

### Первые

```bsl
// Выбрать первые n элементов.
//
// Параметры:
// КоличествоЭлементов - Число - Количество элементов.
//
// Возвращаемое значение:
// ОпцииПоиска - Текущий объект.
//
Функция Первые(КоличествоЭлементов)
```

### ВыбираетсяСоСмещением

```bsl
// Получить количество элементов, которые необходимо пропустить.
//
// Возвращаемое значение:
// Число - Количество элементов.
//
Функция ВыбираетсяСоСмещением()
```

### Смещение

```bsl
// Сместить выборку на n элементов.
//
// Параметры:
// КоличествоЭлементов - Число - Количество элементов.
//
// Возвращаемое значение:
// ОпцииПоиска - Текущий объект.
//
Функция Смещение(КоличествоЭлементов)
```

Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,9 @@

ПередаваемыеОпцииПоиска.СортироватьПо(Колонка.ИмяКолонки, ЭлементПорядка.НаправлениеСортировки);
КонецЦикла;

ПередаваемыеОпцииПоиска.Смещение(ОпцииПоиска.ВыбираетсяСоСмещением());
ПередаваемыеОпцииПоиска.Первые(ОпцииПоиска.ВыбираютсяПервые());
Иначе
ВызватьИсключение "В метод получения данных передан неожиданный тип опций поиска: " + ТипЗнч(ОпцииПоиска);
КонецЕсли;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,14 @@
Если ЗначениеЗаполнено(СтрокаСортировки) Тогда
ТекстЗапроса = ТекстЗапроса + Символы.ПС + "ORDER BY " + СтрокаСортировки;
КонецЕсли;

Если ОпцииПоиска.ВыбираютсяПервые() <> Неопределено Тогда
ТекстЗапроса = ТекстЗапроса + Символы.ПС + "LIMIT " + ОпцииПоиска.ВыбираютсяПервые();
КонецЕсли;

Если ОпцииПоиска.ВыбираетсяСоСмещением() <> Неопределено Тогда
ТекстЗапроса = ТекстЗапроса + Символы.ПС + "OFFSET " + ОпцииПоиска.ВыбираетсяСоСмещением();
КонецЕсли;

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

Expand Down
8 changes: 8 additions & 0 deletions src/Классы/КоннекторInMemory.os
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,14 @@
ПроцессорКоллекций = ПроцессорКоллекций.Сортировать(СтрокаСортировка);
КонецЕсли;

Если ОпцииПоиска.ВыбираетсяСоСмещением() <> Неопределено Тогда
ПроцессорКоллекций = ПроцессорКоллекций.Пропустить(ОпцииПоиска.ВыбираетсяСоСмещением());
КонецЕсли;

Если ОпцииПоиска.ВыбираютсяПервые() <> Неопределено Тогда
ПроцессорКоллекций = ПроцессорКоллекций.Первые(ОпцииПоиска.ВыбираютсяПервые());
КонецЕсли;

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

Результат = Новый Массив();
Expand Down
8 changes: 8 additions & 0 deletions src/Классы/КоннекторJSON.os
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,14 @@
ПроцессорКоллекций = ПроцессорКоллекций.Сортировать(СтрокаСортировка);
КонецЕсли;

Если ОпцииПоиска.ВыбираетсяСоСмещением() <> Неопределено Тогда
ПроцессорКоллекций = ПроцессорКоллекций.Пропустить(ОпцииПоиска.ВыбираетсяСоСмещением());
КонецЕсли;

Если ОпцииПоиска.ВыбираютсяПервые() <> Неопределено Тогда
ПроцессорКоллекций = ПроцессорКоллекций.Первые(ОпцииПоиска.ВыбираютсяПервые());
КонецЕсли;

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

Для Каждого СтрокаДанныхТаблицы Из ДанныеТаблицы Цикл
Expand Down
52 changes: 52 additions & 0 deletions src/Классы/ОпцииПоиска.os
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
Перем Отборы;
Перем Сортировки;
Перем Первые;
Перем Смещение;

// Получить список отборов для выполнения поиска.
//
Expand Down Expand Up @@ -56,7 +58,57 @@

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

// Получить количество элементов, которые необходимо выбрать.
//
// Возвращаемое значение:
// Число - Количество элементов.
//
Функция ВыбираютсяПервые() Экспорт
Возврат Первые;
КонецФункции

// Выбрать первые n элементов.
//
// Параметры:
// КоличествоЭлементов - Число - Количество элементов.
//
// Возвращаемое значение:
// ОпцииПоиска - Текущий объект.
//
Функция Первые(КоличествоЭлементов) Экспорт

Первые = КоличествоЭлементов;

Возврат ЭтотОбъект;
КонецФункции

// Получить количество элементов, которые необходимо пропустить.
//
// Возвращаемое значение:
// Число - Количество элементов.
//
Функция ВыбираетсяСоСмещением() Экспорт
Возврат Смещение;
КонецФункции

// Сместить выборку на n элементов.
//
// Параметры:
// КоличествоЭлементов - Число - Количество элементов.
//
// Возвращаемое значение:
// ОпцииПоиска - Текущий объект.
//
Функция Смещение(КоличествоЭлементов) Экспорт

Смещение = КоличествоЭлементов;

Возврат ЭтотОбъект;

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

Процедура ПриСозданииОбъекта()
Отборы = Новый Массив();
Сортировки = Новый Массив();
Первые = Неопределено;
КонецПроцедуры
8 changes: 8 additions & 0 deletions tests/utils/Модули/ТестовыеУтилиты.os
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,11 @@
ТекстЗапроса = "DROP SCHEMA public CASCADE; CREATE SCHEMA public;";
Коннектор.ВыполнитьЗапрос(ТекстЗапроса);
КонецПроцедуры

Процедура СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, Идентификатор) Экспорт

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

КонецПроцедуры
55 changes: 55 additions & 0 deletions tests/КоннекторInMemory.os
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

#Использовать fs
#Использовать ".."
#Использовать "utils"

Перем Коннектор;
Перем СтрокаСоединения;
Expand Down Expand Up @@ -187,6 +188,60 @@

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

&Тест
Процедура ВыбратьПервые() Экспорт

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

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

// Когда
ОпцииПоиска = Новый ОпцииПоиска;
ОпцииПоиска.Первые(2);

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

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

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

&Тест
Процедура ВыбратьПервыеСоСмещением() Экспорт

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

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

// Когда
ОпцииПоиска = Новый ОпцииПоиска;
ОпцииПоиска
.Первые(2)
.Смещение(1)
.СортироватьПо("Целое", НаправлениеСортировки.Возр);

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

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

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

&Тест
Процедура УдалитьСтрокиВТаблице() Экспорт
МодельДанных = Новый МодельДанных();
Expand Down
55 changes: 55 additions & 0 deletions tests/КоннекторJSON.os
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

#Использовать fs
#Использовать ".."
#Использовать "utils"

Перем Коннектор;
Перем СтрокаСоединения;
Expand Down Expand Up @@ -189,6 +190,60 @@

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

&Тест
Процедура ВыбратьПервые() Экспорт

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

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

// Когда
ОпцииПоиска = Новый ОпцииПоиска;
ОпцииПоиска.Первые(2);

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

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

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

&Тест
Процедура ВыбратьПервыеСоСмещением() Экспорт

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

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

// Когда
ОпцииПоиска = Новый ОпцииПоиска;
ОпцииПоиска
.Первые(2)
.Смещение(1)
.СортироватьПо("Целое", НаправлениеСортировки.Возр);

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

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

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

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