Skip to content

Commit

Permalink
Merge pull request #99 from nixel2007/feature/limit
Browse files Browse the repository at this point in the history
  • Loading branch information
nixel2007 authored Jan 12, 2025
2 parents 23c5be4 + 261bb56 commit bd1e627
Show file tree
Hide file tree
Showing 13 changed files with 415 additions and 1 deletion.
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

0 comments on commit bd1e627

Please sign in to comment.