Skip to content

Commit bd1e627

Browse files
authored
Merge pull request #99 from nixel2007/feature/limit
2 parents 23c5be4 + 261bb56 commit bd1e627

13 files changed

+415
-1
lines changed

README.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
* <a href="#entity-read">Чтение и поиск объектов</a>
2828
* <a href="#entity-complex-find">Поиск сущностей со сложными отборами</a>
2929
* <a href="#entity-sort">Сортировка результатов</a>
30+
* <a href="#entity-limit">Пропуск и смещение</a>
3031
* <a href="#entity-delete">Удаление сущностей</a>
3132
* <a href="#entity-active-record">Активная запись</a>
3233
* <a href="#entity-repository">Работа через ХранилищеСущностей</a>
@@ -285,6 +286,28 @@
285286
286287
```
287288

289+
<a id="#entity-limit">
290+
291+
### Пропуск и смещение
292+
293+
```bsl
294+
295+
// Привычный Выбрать Первые Х реализуется через ОпцииПоиска
296+
ОпцииПоиска = Новый ОпцииПоиска()
297+
.Первые(10);
298+
299+
ПервыеДесятьФизлиц = МенеджерСущностей.Получить(Тип("ФизическоеЛицо"), ОпцииПоиска);
300+
301+
// При желании можно использовать поиск со смещением, например, для реализации постраничной загрузки.
302+
// Всегда указывайте правила сортировки для повторяемости результата.
303+
ОпцииПоиска = Новый ОпцииПоиска()
304+
.Первые(10)
305+
.Смещение(50)
306+
.СортироватьПо("Идентификатор", НаправлениеСортировки.ПоВозрастанию);
307+
308+
ШестойДесятокФизлиц = МенеджерСущностей.Получить(Тип("ФизическоеЛицо"), ОпцииПоиска);
309+
```
310+
288311
<a id="entity-delete" />
289312

290313
## Удаление сущностей

docs/ОпцииПоиска.md

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,53 @@
6060
Функция СортироватьПо(ИмяПоля, НаправлениеСортировки = Неопределено)
6161
```
6262

63+
### ВыбираютсяПервые
64+
65+
```bsl
66+
// Получить количество элементов, которые необходимо выбрать.
67+
//
68+
// Возвращаемое значение:
69+
// Число - Количество элементов.
70+
//
71+
Функция ВыбираютсяПервые()
72+
```
73+
74+
### Первые
75+
76+
```bsl
77+
// Выбрать первые n элементов.
78+
//
79+
// Параметры:
80+
// КоличествоЭлементов - Число - Количество элементов.
81+
//
82+
// Возвращаемое значение:
83+
// ОпцииПоиска - Текущий объект.
84+
//
85+
Функция Первые(КоличествоЭлементов)
86+
```
87+
88+
### ВыбираетсяСоСмещением
89+
90+
```bsl
91+
// Получить количество элементов, которые необходимо пропустить.
92+
//
93+
// Возвращаемое значение:
94+
// Число - Количество элементов.
95+
//
96+
Функция ВыбираетсяСоСмещением()
97+
```
98+
99+
### Смещение
100+
101+
```bsl
102+
// Сместить выборку на n элементов.
103+
//
104+
// Параметры:
105+
// КоличествоЭлементов - Число - Количество элементов.
106+
//
107+
// Возвращаемое значение:
108+
// ОпцииПоиска - Текущий объект.
109+
//
110+
Функция Смещение(КоличествоЭлементов)
111+
```
112+

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@
106106

107107
ПередаваемыеОпцииПоиска.СортироватьПо(Колонка.ИмяКолонки, ЭлементПорядка.НаправлениеСортировки);
108108
КонецЦикла;
109+
110+
ПередаваемыеОпцииПоиска.Смещение(ОпцииПоиска.ВыбираетсяСоСмещением());
111+
ПередаваемыеОпцииПоиска.Первые(ОпцииПоиска.ВыбираютсяПервые());
109112
Иначе
110113
ВызватьИсключение "В метод получения данных передан неожиданный тип опций поиска: " + ТипЗнч(ОпцииПоиска);
111114
КонецЕсли;

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,14 @@
109109
Если ЗначениеЗаполнено(СтрокаСортировки) Тогда
110110
ТекстЗапроса = ТекстЗапроса + Символы.ПС + "ORDER BY " + СтрокаСортировки;
111111
КонецЕсли;
112+
113+
Если ОпцииПоиска.ВыбираютсяПервые() <> Неопределено Тогда
114+
ТекстЗапроса = ТекстЗапроса + Символы.ПС + "LIMIT " + ОпцииПоиска.ВыбираютсяПервые();
115+
КонецЕсли;
116+
117+
Если ОпцииПоиска.ВыбираетсяСоСмещением() <> Неопределено Тогда
118+
ТекстЗапроса = ТекстЗапроса + Символы.ПС + "OFFSET " + ОпцииПоиска.ВыбираетсяСоСмещением();
119+
КонецЕсли;
112120

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

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,14 @@
276276
ПроцессорКоллекций = ПроцессорКоллекций.Сортировать(СтрокаСортировка);
277277
КонецЕсли;
278278

279+
Если ОпцииПоиска.ВыбираетсяСоСмещением() <> Неопределено Тогда
280+
ПроцессорКоллекций = ПроцессорКоллекций.Пропустить(ОпцииПоиска.ВыбираетсяСоСмещением());
281+
КонецЕсли;
282+
283+
Если ОпцииПоиска.ВыбираютсяПервые() <> Неопределено Тогда
284+
ПроцессорКоллекций = ПроцессорКоллекций.Первые(ОпцииПоиска.ВыбираютсяПервые());
285+
КонецЕсли;
286+
279287
ДанныеТаблицы = ПроцессорКоллекций.ВМассив();
280288

281289
Результат = Новый Массив();

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,14 @@
254254
ПроцессорКоллекций = ПроцессорКоллекций.Сортировать(СтрокаСортировка);
255255
КонецЕсли;
256256

257+
Если ОпцииПоиска.ВыбираетсяСоСмещением() <> Неопределено Тогда
258+
ПроцессорКоллекций = ПроцессорКоллекций.Пропустить(ОпцииПоиска.ВыбираетсяСоСмещением());
259+
КонецЕсли;
260+
261+
Если ОпцииПоиска.ВыбираютсяПервые() <> Неопределено Тогда
262+
ПроцессорКоллекций = ПроцессорКоллекций.Первые(ОпцииПоиска.ВыбираютсяПервые());
263+
КонецЕсли;
264+
257265
ДанныеТаблицы = ПроцессорКоллекций.ВМассив();
258266

259267
Для Каждого СтрокаДанныхТаблицы Из ДанныеТаблицы Цикл

src/Классы/ОпцииПоиска.os

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
Перем Отборы;
22
Перем Сортировки;
3+
Перем Первые;
4+
Перем Смещение;
35

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

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

61+
// Получить количество элементов, которые необходимо выбрать.
62+
//
63+
// Возвращаемое значение:
64+
// Число - Количество элементов.
65+
//
66+
Функция ВыбираютсяПервые() Экспорт
67+
Возврат Первые;
68+
КонецФункции
69+
70+
// Выбрать первые n элементов.
71+
//
72+
// Параметры:
73+
// КоличествоЭлементов - Число - Количество элементов.
74+
//
75+
// Возвращаемое значение:
76+
// ОпцииПоиска - Текущий объект.
77+
//
78+
Функция Первые(КоличествоЭлементов) Экспорт
79+
80+
Первые = КоличествоЭлементов;
81+
82+
Возврат ЭтотОбъект;
83+
КонецФункции
84+
85+
// Получить количество элементов, которые необходимо пропустить.
86+
//
87+
// Возвращаемое значение:
88+
// Число - Количество элементов.
89+
//
90+
Функция ВыбираетсяСоСмещением() Экспорт
91+
Возврат Смещение;
92+
КонецФункции
93+
94+
// Сместить выборку на n элементов.
95+
//
96+
// Параметры:
97+
// КоличествоЭлементов - Число - Количество элементов.
98+
//
99+
// Возвращаемое значение:
100+
// ОпцииПоиска - Текущий объект.
101+
//
102+
Функция Смещение(КоличествоЭлементов) Экспорт
103+
104+
Смещение = КоличествоЭлементов;
105+
106+
Возврат ЭтотОбъект;
107+
108+
КонецФункции
109+
59110
Процедура ПриСозданииОбъекта()
60111
Отборы = Новый Массив();
61112
Сортировки = Новый Массив();
113+
Первые = Неопределено;
62114
КонецПроцедуры

tests/utils/Модули/ТестовыеУтилиты.os

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,11 @@
1111
ТекстЗапроса = "DROP SCHEMA public CASCADE; CREATE SCHEMA public;";
1212
Коннектор.ВыполнитьЗапрос(ТекстЗапроса);
1313
КонецПроцедуры
14+
15+
Процедура СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, Идентификатор) Экспорт
16+
17+
Сущность = Новый СущностьСоВсемиТипамиКолонок;
18+
Сущность.Целое = Идентификатор;
19+
Коннектор.Сохранить(ОбъектМодели, Сущность);
20+
21+
КонецПроцедуры

tests/КоннекторInMemory.os

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
#Использовать fs
77
#Использовать ".."
8+
#Использовать "utils"
89

910
Перем Коннектор;
1011
Перем СтрокаСоединения;
@@ -187,6 +188,60 @@
187188

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

191+
&Тест
192+
Процедура ВыбратьПервые() Экспорт
193+
194+
// Дано
195+
МодельДанных = Новый МодельДанных();
196+
ОбъектМодели = МодельДанных.СоздатьОбъектМодели(Тип("СущностьСоВсемиТипамиКолонок"));
197+
Коннектор.ИнициализироватьТаблицу(ОбъектМодели);
198+
199+
ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 1);
200+
ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 2);
201+
ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 3);
202+
203+
// Когда
204+
ОпцииПоиска = Новый ОпцииПоиска;
205+
ОпцииПоиска.Первые(2);
206+
207+
НайденныеСтроки = Коннектор.НайтиСтрокиВТаблице(ОбъектМодели, ОпцииПоиска);
208+
209+
// Тогда
210+
Ожидаем.Что(НайденныеСтроки, "Все строки получены").ИмеетДлину(2);
211+
Ожидаем.Что(НайденныеСтроки[0].Получить("Целое"), "Первая строка").Равно(1);
212+
Ожидаем.Что(НайденныеСтроки[1].Получить("Целое"), "Вторая строка").Равно(2);
213+
214+
КонецПроцедуры
215+
216+
&Тест
217+
Процедура ВыбратьПервыеСоСмещением() Экспорт
218+
219+
// Дано
220+
МодельДанных = Новый МодельДанных();
221+
ОбъектМодели = МодельДанных.СоздатьОбъектМодели(Тип("СущностьСоВсемиТипамиКолонок"));
222+
Коннектор.ИнициализироватьТаблицу(ОбъектМодели);
223+
224+
ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 1);
225+
ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 2);
226+
ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 3);
227+
ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 4);
228+
229+
// Когда
230+
ОпцииПоиска = Новый ОпцииПоиска;
231+
ОпцииПоиска
232+
.Первые(2)
233+
.Смещение(1)
234+
.СортироватьПо("Целое", НаправлениеСортировки.Возр);
235+
236+
НайденныеСтроки = Коннектор.НайтиСтрокиВТаблице(ОбъектМодели, ОпцииПоиска);
237+
238+
// Тогда
239+
Ожидаем.Что(НайденныеСтроки, "Все строки получены").ИмеетДлину(2);
240+
Ожидаем.Что(НайденныеСтроки[0].Получить("Целое"), "Первая строка").Равно(2);
241+
Ожидаем.Что(НайденныеСтроки[1].Получить("Целое"), "Вторая строка").Равно(3);
242+
243+
КонецПроцедуры
244+
190245
&Тест
191246
Процедура УдалитьСтрокиВТаблице() Экспорт
192247
МодельДанных = Новый МодельДанных();

tests/КоннекторJSON.os

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
#Использовать fs
77
#Использовать ".."
8+
#Использовать "utils"
89

910
Перем Коннектор;
1011
Перем СтрокаСоединения;
@@ -189,6 +190,60 @@
189190

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

193+
&Тест
194+
Процедура ВыбратьПервые() Экспорт
195+
196+
// Дано
197+
МодельДанных = Новый МодельДанных();
198+
ОбъектМодели = МодельДанных.СоздатьОбъектМодели(Тип("СущностьСоВсемиТипамиКолонок"));
199+
Коннектор.ИнициализироватьТаблицу(ОбъектМодели);
200+
201+
ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 1);
202+
ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 2);
203+
ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 3);
204+
205+
// Когда
206+
ОпцииПоиска = Новый ОпцииПоиска;
207+
ОпцииПоиска.Первые(2);
208+
209+
НайденныеСтроки = Коннектор.НайтиСтрокиВТаблице(ОбъектМодели, ОпцииПоиска);
210+
211+
// Тогда
212+
Ожидаем.Что(НайденныеСтроки, "Все строки получены").ИмеетДлину(2);
213+
Ожидаем.Что(НайденныеСтроки[0].Получить("Целое"), "Первая строка").Равно(1);
214+
Ожидаем.Что(НайденныеСтроки[1].Получить("Целое"), "Вторая строка").Равно(2);
215+
216+
КонецПроцедуры
217+
218+
&Тест
219+
Процедура ВыбратьПервыеСоСмещением() Экспорт
220+
221+
// Дано
222+
МодельДанных = Новый МодельДанных();
223+
ОбъектМодели = МодельДанных.СоздатьОбъектМодели(Тип("СущностьСоВсемиТипамиКолонок"));
224+
Коннектор.ИнициализироватьТаблицу(ОбъектМодели);
225+
226+
ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 1);
227+
ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 2);
228+
ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 3);
229+
ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 4);
230+
231+
// Когда
232+
ОпцииПоиска = Новый ОпцииПоиска;
233+
ОпцииПоиска
234+
.Первые(2)
235+
.Смещение(1)
236+
.СортироватьПо("Целое", НаправлениеСортировки.Возр);
237+
238+
НайденныеСтроки = Коннектор.НайтиСтрокиВТаблице(ОбъектМодели, ОпцииПоиска);
239+
240+
// Тогда
241+
Ожидаем.Что(НайденныеСтроки, "Все строки получены").ИмеетДлину(2);
242+
Ожидаем.Что(НайденныеСтроки[0].Получить("Целое"), "Первая строка").Равно(2);
243+
Ожидаем.Что(НайденныеСтроки[1].Получить("Целое"), "Вторая строка").Равно(3);
244+
245+
КонецПроцедуры
246+
192247
&Тест
193248
Процедура УдалитьСтрокиВТаблице() Экспорт
194249
МодельДанных = Новый МодельДанных();

0 commit comments

Comments
 (0)