From c2e331596df46ed47e9e547522c3c7a7ed37ad36 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Sun, 12 Jan 2025 20:08:32 +0100 Subject: [PATCH 1/7] =?UTF-8?q?LIMIT=20=D0=B8=20OFFSET?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...265\320\272\321\202\320\276\321\200SQL.os" | 4 ++ ...20\272\321\202\320\276\321\200InMemory.os" | 8 +++ ...65\320\272\321\202\320\276\321\200JSON.os" | 8 +++ ...20\276\320\270\321\201\320\272\320\260.os" | 26 +++++++++ ...20\270\320\273\320\270\321\202\321\213.os" | 8 +++ ...20\272\321\202\320\276\321\200InMemory.os" | 52 +++++++++++++++++ ...65\320\272\321\202\320\276\321\200JSON.os" | 52 +++++++++++++++++ ...\272\321\202\320\276\321\200PostgreSQL.os" | 56 +++++++++++++++++-- ...\320\272\321\202\320\276\321\200SQLite.os" | 51 +++++++++++++++++ 9 files changed, 260 insertions(+), 5 deletions(-) diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\261\321\201\321\202\321\200\320\260\320\272\321\202\320\275\321\213\320\271\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200SQL.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\261\321\201\321\202\321\200\320\260\320\272\321\202\320\275\321\213\320\271\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200SQL.os" index 18448de..89a8228 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\261\321\201\321\202\321\200\320\260\320\272\321\202\320\275\321\213\320\271\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200SQL.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\261\321\201\321\202\321\200\320\260\320\272\321\202\320\275\321\213\320\271\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200SQL.os" @@ -109,6 +109,10 @@ Если ЗначениеЗаполнено(СтрокаСортировки) Тогда ТекстЗапроса = ТекстЗапроса + Символы.ПС + "ORDER BY " + СтрокаСортировки; КонецЕсли; + + Если ОпцииПоиска.ВыбираютсяПервые() <> Неопределено Тогда + ТекстЗапроса = ТекстЗапроса + Символы.ПС + "LIMIT " + ОпцииПоиска.ВыбираютсяПервые(); + КонецЕсли; Лог.Отладка("Поиск сущности в таблице %1:%2%3", ОбъектМодели.ИмяТаблицы(), Символы.ПС, ТекстЗапроса); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200InMemory.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200InMemory.os" index e530e8c..32474b1 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200InMemory.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200InMemory.os" @@ -276,6 +276,14 @@ ПроцессорКоллекций = ПроцессорКоллекций.Сортировать(СтрокаСортировка); КонецЕсли; + Если ОпцииПоиска.ВыбираетсяСоСмещением() <> Неопределено Тогда + ПроцессорКоллекций = ПроцессорКоллекций.Пропустить(ОпцииПоиска.ВыбираетсяСоСмещением()); + КонецЕсли; + + Если ОпцииПоиска.ВыбираютсяПервые() <> Неопределено Тогда + ПроцессорКоллекций = ПроцессорКоллекций.Первые(ОпцииПоиска.ВыбираютсяПервые()); + КонецЕсли; + ДанныеТаблицы = ПроцессорКоллекций.ВМассив(); Результат = Новый Массив(); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200JSON.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200JSON.os" index d4fae1b..e0b173c 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200JSON.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200JSON.os" @@ -254,6 +254,14 @@ ПроцессорКоллекций = ПроцессорКоллекций.Сортировать(СтрокаСортировка); КонецЕсли; + Если ОпцииПоиска.ВыбираетсяСоСмещением() <> Неопределено Тогда + ПроцессорКоллекций = ПроцессорКоллекций.Пропустить(ОпцииПоиска.ВыбираетсяСоСмещением()); + КонецЕсли; + + Если ОпцииПоиска.ВыбираютсяПервые() <> Неопределено Тогда + ПроцессорКоллекций = ПроцессорКоллекций.Первые(ОпцииПоиска.ВыбираютсяПервые()); + КонецЕсли; + ДанныеТаблицы = ПроцессорКоллекций.ВМассив(); Для Каждого СтрокаДанныхТаблицы Из ДанныеТаблицы Цикл diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\206\320\270\320\270\320\237\320\276\320\270\321\201\320\272\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\206\320\270\320\270\320\237\320\276\320\270\321\201\320\272\320\260.os" index d353e41..4e71e6a 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\206\320\270\320\270\320\237\320\276\320\270\321\201\320\272\320\260.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\206\320\270\320\270\320\237\320\276\320\270\321\201\320\272\320\260.os" @@ -1,5 +1,7 @@ Перем Отборы; Перем Сортировки; +Перем Первые; +Перем Смещение; // Получить список отборов для выполнения поиска. // @@ -56,7 +58,31 @@ КонецФункции +Функция ВыбираютсяПервые() Экспорт + Возврат Первые; +КонецФункции + +Функция Первые(КоличествоЭлементов) Экспорт + + Первые = КоличествоЭлементов; + + Возврат ЭтотОбъект; +КонецФункции + +Функция ВыбираетсяСоСмещением() Экспорт + Возврат Смещение; +КонецФункции + +Функция Смещение(КоличествоЭлементов) Экспорт + + Смещение = КоличествоЭлементов; + + Возврат ЭтотОбъект; + +КонецФункции + Процедура ПриСозданииОбъекта() Отборы = Новый Массив(); Сортировки = Новый Массив(); + Первые = Неопределено; КонецПроцедуры diff --git "a/tests/utils/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\243\321\202\320\270\320\273\320\270\321\202\321\213.os" "b/tests/utils/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\243\321\202\320\270\320\273\320\270\321\202\321\213.os" index ecef310..e137a77 100644 --- "a/tests/utils/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\243\321\202\320\270\320\273\320\270\321\202\321\213.os" +++ "b/tests/utils/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\243\321\202\320\270\320\273\320\270\321\202\321\213.os" @@ -11,3 +11,11 @@ ТекстЗапроса = "DROP SCHEMA public CASCADE; CREATE SCHEMA public;"; Коннектор.ВыполнитьЗапрос(ТекстЗапроса); КонецПроцедуры + +Процедура СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, Идентификатор) Экспорт + + Сущность = Новый СущностьСоВсемиТипамиКолонок; + Сущность.Целое = Идентификатор; + Коннектор.Сохранить(ОбъектМодели, Сущность); + +КонецПроцедуры diff --git "a/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200InMemory.os" "b/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200InMemory.os" index d317803..fc5b64a 100644 --- "a/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200InMemory.os" +++ "b/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200InMemory.os" @@ -5,6 +5,7 @@ #Использовать fs #Использовать ".." +#Использовать "utils" Перем Коннектор; Перем СтрокаСоединения; @@ -187,6 +188,57 @@ КонецПроцедуры +&Тест +Процедура ВыбратьПервые() Экспорт + + // Дано + МодельДанных = Новый МодельДанных(); + ОбъектМодели = МодельДанных.СоздатьОбъектМодели(Тип("СущностьСоВсемиТипамиКолонок")); + Коннектор.ИнициализироватьТаблицу(ОбъектМодели); + + ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 1); + ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 2); + ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 3); + + // Когда + ОпцииПоиска = Новый ОпцииПоиска; + ОпцииПоиска.Первые(2); + + НайденныеСтроки = Коннектор.НайтиСтрокиВТаблице(ОбъектМодели, ОпцииПоиска); + + // Тогда + Ожидаем.Что(НайденныеСтроки, "Все строки получены").ИмеетДлину(2); + Ожидаем.Что(НайденныеСтроки[0].Получить("Целое"), "Первая строка").Равно(1); + Ожидаем.Что(НайденныеСтроки[1].Получить("Целое"), "Вторая строка").Равно(2); + +КонецПроцедуры + +&Тест +Процедура ВыбратьПервыеСоСмещением() Экспорт + + // Дано + МодельДанных = Новый МодельДанных(); + ОбъектМодели = МодельДанных.СоздатьОбъектМодели(Тип("СущностьСоВсемиТипамиКолонок")); + Коннектор.ИнициализироватьТаблицу(ОбъектМодели); + + ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 1); + ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 2); + ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 3); + ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 4); + + // Когда + ОпцииПоиска = Новый ОпцииПоиска; + ОпцииПоиска.Первые(2).Смещение(1); + + НайденныеСтроки = Коннектор.НайтиСтрокиВТаблице(ОбъектМодели, ОпцииПоиска); + + // Тогда + Ожидаем.Что(НайденныеСтроки, "Все строки получены").ИмеетДлину(2); + Ожидаем.Что(НайденныеСтроки[0].Получить("Целое"), "Первая строка").Равно(2); + Ожидаем.Что(НайденныеСтроки[1].Получить("Целое"), "Вторая строка").Равно(3); + +КонецПроцедуры + &Тест Процедура УдалитьСтрокиВТаблице() Экспорт МодельДанных = Новый МодельДанных(); diff --git "a/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200JSON.os" "b/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200JSON.os" index 18e892f..ff652e7 100644 --- "a/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200JSON.os" +++ "b/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200JSON.os" @@ -5,6 +5,7 @@ #Использовать fs #Использовать ".." +#Использовать "utils" Перем Коннектор; Перем СтрокаСоединения; @@ -189,6 +190,57 @@ КонецПроцедуры +&Тест +Процедура ВыбратьПервые() Экспорт + + // Дано + МодельДанных = Новый МодельДанных(); + ОбъектМодели = МодельДанных.СоздатьОбъектМодели(Тип("СущностьСоВсемиТипамиКолонок")); + Коннектор.ИнициализироватьТаблицу(ОбъектМодели); + + ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 1); + ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 2); + ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 3); + + // Когда + ОпцииПоиска = Новый ОпцииПоиска; + ОпцииПоиска.Первые(2); + + НайденныеСтроки = Коннектор.НайтиСтрокиВТаблице(ОбъектМодели, ОпцииПоиска); + + // Тогда + Ожидаем.Что(НайденныеСтроки, "Все строки получены").ИмеетДлину(2); + Ожидаем.Что(НайденныеСтроки[0].Получить("Целое"), "Первая строка").Равно(1); + Ожидаем.Что(НайденныеСтроки[1].Получить("Целое"), "Вторая строка").Равно(2); + +КонецПроцедуры + +&Тест +Процедура ВыбратьПервыеСоСмещением() Экспорт + + // Дано + МодельДанных = Новый МодельДанных(); + ОбъектМодели = МодельДанных.СоздатьОбъектМодели(Тип("СущностьСоВсемиТипамиКолонок")); + Коннектор.ИнициализироватьТаблицу(ОбъектМодели); + + ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 1); + ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 2); + ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 3); + ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 4); + + // Когда + ОпцииПоиска = Новый ОпцииПоиска; + ОпцииПоиска.Первые(2).Смещение(1); + + НайденныеСтроки = Коннектор.НайтиСтрокиВТаблице(ОбъектМодели, ОпцииПоиска); + + // Тогда + Ожидаем.Что(НайденныеСтроки, "Все строки получены").ИмеетДлину(2); + Ожидаем.Что(НайденныеСтроки[0].Получить("Целое"), "Первая строка").Равно(2); + Ожидаем.Что(НайденныеСтроки[1].Получить("Целое"), "Вторая строка").Равно(3); + +КонецПроцедуры + &Тест Процедура УдалитьСтрокиВТаблице() Экспорт МодельДанных = Новый МодельДанных(); diff --git "a/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200PostgreSQL.os" "b/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200PostgreSQL.os" index a00874b..71d8f44 100644 --- "a/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200PostgreSQL.os" +++ "b/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200PostgreSQL.os" @@ -285,12 +285,7 @@ &Тест Процедура ПоискВПустомСписке() Экспорт - // Дано - МодельДанных = Новый МодельДанных(); - ОбъектМодели = МодельДанных.СоздатьОбъектМодели(Тип("СущностьСоВсемиТипамиКолонок")); - Коннектор.ИнициализироватьТаблицу(ОбъектМодели); - Сущность = Новый СущностьСоВсемиТипамиКолонок; Сущность.Целое = 1; Коннектор.Сохранить(ОбъектМодели, Сущность); @@ -357,6 +352,57 @@ КонецПроцедуры +&Тест +Процедура ВыбратьПервые() Экспорт + + // Дано + МодельДанных = Новый МодельДанных(); + ОбъектМодели = МодельДанных.СоздатьОбъектМодели(Тип("СущностьСоВсемиТипамиКолонок")); + Коннектор.ИнициализироватьТаблицу(ОбъектМодели); + + ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 1); + ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 2); + ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 3); + + // Когда + ОпцииПоиска = Новый ОпцииПоиска; + ОпцииПоиска.Первые(2); + + НайденныеСтроки = Коннектор.НайтиСтрокиВТаблице(ОбъектМодели, ОпцииПоиска); + + // Тогда + Ожидаем.Что(НайденныеСтроки, "Все строки получены").ИмеетДлину(2); + Ожидаем.Что(НайденныеСтроки[0].Получить("Целое"), "Первая строка").Равно(1); + Ожидаем.Что(НайденныеСтроки[1].Получить("Целое"), "Вторая строка").Равно(2); + +КонецПроцедуры + +&Тест +Процедура ВыбратьПервыеСоСмещением() Экспорт + + // Дано + МодельДанных = Новый МодельДанных(); + ОбъектМодели = МодельДанных.СоздатьОбъектМодели(Тип("СущностьСоВсемиТипамиКолонок")); + Коннектор.ИнициализироватьТаблицу(ОбъектМодели); + + ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 1); + ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 2); + ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 3); + ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 4); + + // Когда + ОпцииПоиска = Новый ОпцииПоиска; + ОпцииПоиска.Первые(2).Смещение(1); + + НайденныеСтроки = Коннектор.НайтиСтрокиВТаблице(ОбъектМодели, ОпцииПоиска); + + // Тогда + Ожидаем.Что(НайденныеСтроки, "Все строки получены").ИмеетДлину(2); + Ожидаем.Что(НайденныеСтроки[0].Получить("Целое"), "Первая строка").Равно(2); + Ожидаем.Что(НайденныеСтроки[1].Получить("Целое"), "Вторая строка").Равно(3); + +КонецПроцедуры + &Тест Процедура УдалениеСущности() Экспорт diff --git "a/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200SQLite.os" "b/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200SQLite.os" index 126f1de..caede47 100644 --- "a/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200SQLite.os" +++ "b/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200SQLite.os" @@ -321,6 +321,57 @@ КонецПроцедуры +&Тест +Процедура ВыбратьПервые() Экспорт + + // Дано + МодельДанных = Новый МодельДанных(); + ОбъектМодели = МодельДанных.СоздатьОбъектМодели(Тип("СущностьСоВсемиТипамиКолонок")); + Коннектор.ИнициализироватьТаблицу(ОбъектМодели); + + ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 1); + ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 2); + ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 3); + + // Когда + ОпцииПоиска = Новый ОпцииПоиска; + ОпцииПоиска.Первые(2); + + НайденныеСтроки = Коннектор.НайтиСтрокиВТаблице(ОбъектМодели, ОпцииПоиска); + + // Тогда + Ожидаем.Что(НайденныеСтроки, "Все строки получены").ИмеетДлину(2); + Ожидаем.Что(НайденныеСтроки[0].Получить("Целое"), "Первая строка").Равно(1); + Ожидаем.Что(НайденныеСтроки[1].Получить("Целое"), "Вторая строка").Равно(2); + +КонецПроцедуры + +&Тест +Процедура ВыбратьПервыеСоСмещением() Экспорт + + // Дано + МодельДанных = Новый МодельДанных(); + ОбъектМодели = МодельДанных.СоздатьОбъектМодели(Тип("СущностьСоВсемиТипамиКолонок")); + Коннектор.ИнициализироватьТаблицу(ОбъектМодели); + + ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 1); + ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 2); + ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 3); + ТестовыеУтилиты.СохранитьСущностьСоВсемиТипамиКолонок(Коннектор, ОбъектМодели, 4); + + // Когда + ОпцииПоиска = Новый ОпцииПоиска; + ОпцииПоиска.Первые(2).Смещение(1); + + НайденныеСтроки = Коннектор.НайтиСтрокиВТаблице(ОбъектМодели, ОпцииПоиска); + + // Тогда + Ожидаем.Что(НайденныеСтроки, "Все строки получены").ИмеетДлину(2); + Ожидаем.Что(НайденныеСтроки[0].Получить("Целое"), "Первая строка").Равно(2); + Ожидаем.Что(НайденныеСтроки[1].Получить("Целое"), "Вторая строка").Равно(3); + +КонецПроцедуры + &Тест Процедура СозданиеМинимальнойСущности() Экспорт МодельДанных = Новый МодельДанных(); From 00458fd0119eb0c4692bd50952c414d079ebdbdd Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Sun, 12 Jan 2025 20:12:17 +0100 Subject: [PATCH 2/7] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B1=D1=80=D0=BE=D1=81?= =?UTF-8?q?=20=D0=B4=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D1=8B=D1=85=20=D0=BE=D0=BF=D1=86=D0=B8=D0=B9=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=D0=B0=20=D0=B8=D0=B7=20=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=B5=D0=B4=D0=B6=D0=B5=D1=80=D0=B0=20=D0=B2=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D0=BD=D0=B5=D0=BA=D1=82=D0=BE=D1=80=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...320\272\321\202\320\276\321\200\320\260\320\274\320\270.os" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200\320\260\320\274\320\270.os" "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200\320\260\320\274\320\270.os" index 08f68b5..3da8d43 100644 --- "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200\320\260\320\274\320\270.os" +++ "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200\320\260\320\274\320\270.os" @@ -106,6 +106,9 @@ ПередаваемыеОпцииПоиска.СортироватьПо(Колонка.ИмяКолонки, ЭлементПорядка.НаправлениеСортировки); КонецЦикла; + + ПередаваемыеОпцииПоиска.Смещение(ОпцииПоиска.ВыбираетсяСоСмещением()); + ПередаваемыеОпцииПоиска.Первые(ОпцииПоиска.ВыбираютсяПервые()); Иначе ВызватьИсключение "В метод получения данных передан неожиданный тип опций поиска: " + ТипЗнч(ОпцииПоиска); КонецЕсли; From 717c5dd127601cd425212a37ebabaa49b7b6c669 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Sun, 12 Jan 2025 20:13:53 +0100 Subject: [PATCH 3/7] =?UTF-8?q?=D0=A1=D0=BE=D1=80=D1=82=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=BA=D0=B0=20=D0=B2=20=D1=82=D0=B5=D1=81=D1=82=D0=B5=20?= =?UTF-8?q?=D1=81=20=D0=BE=D1=84=D1=84=D1=81=D0=B5=D1=82=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\275\320\265\320\272\321\202\320\276\321\200InMemory.os" | 5 ++++- ...5\320\275\320\265\320\272\321\202\320\276\321\200JSON.os" | 5 ++++- ...275\320\265\320\272\321\202\320\276\321\200PostgreSQL.os" | 5 ++++- ...320\275\320\265\320\272\321\202\320\276\321\200SQLite.os" | 5 ++++- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git "a/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200InMemory.os" "b/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200InMemory.os" index fc5b64a..fd605f6 100644 --- "a/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200InMemory.os" +++ "b/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200InMemory.os" @@ -228,7 +228,10 @@ // Когда ОпцииПоиска = Новый ОпцииПоиска; - ОпцииПоиска.Первые(2).Смещение(1); + ОпцииПоиска + .Первые(2) + .Смещение(1) + .СортироватьПо("Целое", НаправлениеСортировки.Возр); НайденныеСтроки = Коннектор.НайтиСтрокиВТаблице(ОбъектМодели, ОпцииПоиска); diff --git "a/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200JSON.os" "b/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200JSON.os" index ff652e7..34872ad 100644 --- "a/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200JSON.os" +++ "b/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200JSON.os" @@ -230,7 +230,10 @@ // Когда ОпцииПоиска = Новый ОпцииПоиска; - ОпцииПоиска.Первые(2).Смещение(1); + ОпцииПоиска + .Первые(2) + .Смещение(1) + .СортироватьПо("Целое", НаправлениеСортировки.Возр); НайденныеСтроки = Коннектор.НайтиСтрокиВТаблице(ОбъектМодели, ОпцииПоиска); diff --git "a/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200PostgreSQL.os" "b/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200PostgreSQL.os" index 71d8f44..adb365f 100644 --- "a/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200PostgreSQL.os" +++ "b/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200PostgreSQL.os" @@ -392,7 +392,10 @@ // Когда ОпцииПоиска = Новый ОпцииПоиска; - ОпцииПоиска.Первые(2).Смещение(1); + ОпцииПоиска + .Первые(2) + .Смещение(1) + .СортироватьПо("Целое", НаправлениеСортировки.Возр); НайденныеСтроки = Коннектор.НайтиСтрокиВТаблице(ОбъектМодели, ОпцииПоиска); diff --git "a/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200SQLite.os" "b/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200SQLite.os" index caede47..1f3ad9c 100644 --- "a/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200SQLite.os" +++ "b/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200SQLite.os" @@ -361,7 +361,10 @@ // Когда ОпцииПоиска = Новый ОпцииПоиска; - ОпцииПоиска.Первые(2).Смещение(1); + ОпцииПоиска + .Первые(2) + .Смещение(1) + .СортироватьПо("Целое", НаправлениеСортировки.Возр); НайденныеСтроки = Коннектор.НайтиСтрокиВТаблице(ОбъектМодели, ОпцииПоиска); From 18e2744694c72467d9ef4fb4b1aeff0e7ccc3878 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Sun, 12 Jan 2025 20:17:14 +0100 Subject: [PATCH 4/7] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20OFFSET=20=D0=B4=D0=BB=D1=8F=20SQL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...275\320\275\320\265\320\272\321\202\320\276\321\200SQL.os" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\261\321\201\321\202\321\200\320\260\320\272\321\202\320\275\321\213\320\271\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200SQL.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\261\321\201\321\202\321\200\320\260\320\272\321\202\320\275\321\213\320\271\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200SQL.os" index 89a8228..f455112 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\261\321\201\321\202\321\200\320\260\320\272\321\202\320\275\321\213\320\271\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200SQL.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\261\321\201\321\202\321\200\320\260\320\272\321\202\320\275\321\213\320\271\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200SQL.os" @@ -113,6 +113,10 @@ Если ОпцииПоиска.ВыбираютсяПервые() <> Неопределено Тогда ТекстЗапроса = ТекстЗапроса + Символы.ПС + "LIMIT " + ОпцииПоиска.ВыбираютсяПервые(); КонецЕсли; + + Если ОпцииПоиска.ВыбираетсяСоСмещением() <> Неопределено Тогда + ТекстЗапроса = ТекстЗапроса + Символы.ПС + "OFFSET " + ОпцииПоиска.ВыбираетсяСоСмещением(); + КонецЕсли; Лог.Отладка("Поиск сущности в таблице %1:%2%3", ОбъектМодели.ИмяТаблицы(), Символы.ПС, ТекстЗапроса); From 3345177abe914715dec6c8b897efbf45ad685756 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Sun, 12 Jan 2025 20:27:35 +0100 Subject: [PATCH 5/7] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=20=20=D0=BD=D0=B0?= =?UTF-8?q?=20=D1=81=D0=BC=D0=B5=D1=89=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=87?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=B7=20=D0=BC=D0=B5=D0=BD=D0=B5=D0=B4=D0=B6?= =?UTF-8?q?=D0=B5=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\276\321\201\321\202\320\265\320\271.os" | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git "a/tests/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" "b/tests/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" index 9e79ef3..efa5e94 100644 --- "a/tests/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" +++ "b/tests/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\321\203\321\211\320\275\320\276\321\201\321\202\320\265\320\271.os" @@ -484,6 +484,42 @@ КонецПроцедуры +&Тест +Процедура ПоискСоСмещением() Экспорт + + // Дано + Сущность = Новый СущностьБезГенерируемогоИдентификатора; + Сущность.ВнутреннийИдентификатор = 1; + МенеджерСущностей.Сохранить(Сущность); + + Сущность = Новый СущностьБезГенерируемогоИдентификатора; + Сущность.ВнутреннийИдентификатор = 2; + МенеджерСущностей.Сохранить(Сущность); + + Сущность = Новый СущностьБезГенерируемогоИдентификатора; + Сущность.ВнутреннийИдентификатор = 3; + МенеджерСущностей.Сохранить(Сущность); + + Сущность = Новый СущностьБезГенерируемогоИдентификатора; + Сущность.ВнутреннийИдентификатор = 4; + МенеджерСущностей.Сохранить(Сущность); + + // Когда + ОпцииПоиска = Новый ОпцииПоиска(); + ОпцииПоиска + .Смещение(1) + .Первые(2) + .СортироватьПо("ВнутреннийИдентификатор", НаправлениеСортировки.Возр); + + НайденныеСущности = МенеджерСущностей.Получить(Тип("СущностьБезГенерируемогоИдентификатора"), ОпцииПоиска); + + // Тогда + Ожидаем.Что(НайденныеСущности, "Получены две сущности").ИмеетДлину(2); + Ожидаем.Что(НайденныеСущности[0].ВнутреннийИдентификатор, "Получена первая сущность").Равно(2); + Ожидаем.Что(НайденныеСущности[1].ВнутреннийИдентификатор, "Получена вторая сущность").Равно(3); + +КонецПроцедуры + &Тест Процедура ПолучитьСущность() Экспорт From f7322a69c2565d78cc745382e9681f506e52e28a Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Sun, 12 Jan 2025 21:43:45 +0100 Subject: [PATCH 6/7] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20rebase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...275\320\265\320\272\321\202\320\276\321\200PostgreSQL.os" | 5 +++++ 1 file changed, 5 insertions(+) diff --git "a/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200PostgreSQL.os" "b/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200PostgreSQL.os" index adb365f..f58a525 100644 --- "a/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200PostgreSQL.os" +++ "b/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200PostgreSQL.os" @@ -285,7 +285,12 @@ &Тест Процедура ПоискВПустомСписке() Экспорт + // Дано + МодельДанных = Новый МодельДанных(); + ОбъектМодели = МодельДанных.СоздатьОбъектМодели(Тип("СущностьСоВсемиТипамиКолонок")); + Коннектор.ИнициализироватьТаблицу(ОбъектМодели); + Сущность = Новый СущностьСоВсемиТипамиКолонок; Сущность.Целое = 1; Коннектор.Сохранить(ОбъектМодели, Сущность); From 261bb560eb9ea504f1f1842fd65c2cb787bf5683 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Sun, 12 Jan 2025 21:51:36 +0100 Subject: [PATCH 7/7] =?UTF-8?q?=D0=94=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B0=D1=86=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 23 +++++++++ ...20\276\320\270\321\201\320\272\320\260.md" | 50 +++++++++++++++++++ ...20\276\320\270\321\201\320\272\320\260.os" | 26 ++++++++++ 3 files changed, 99 insertions(+) diff --git a/README.md b/README.md index a391fa7..d5bbc57 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ * Чтение и поиск объектов * Поиск сущностей со сложными отборами * Сортировка результатов + * Пропуск и смещение * Удаление сущностей * Активная запись * Работа через ХранилищеСущностей @@ -285,6 +286,28 @@ ``` + + +### Пропуск и смещение + +```bsl + +// Привычный Выбрать Первые Х реализуется через ОпцииПоиска +ОпцииПоиска = Новый ОпцииПоиска() + .Первые(10); + +ПервыеДесятьФизлиц = МенеджерСущностей.Получить(Тип("ФизическоеЛицо"), ОпцииПоиска); + +// При желании можно использовать поиск со смещением, например, для реализации постраничной загрузки. +// Всегда указывайте правила сортировки для повторяемости результата. +ОпцииПоиска = Новый ОпцииПоиска() + .Первые(10) + .Смещение(50) + .СортироватьПо("Идентификатор", НаправлениеСортировки.ПоВозрастанию); + +ШестойДесятокФизлиц = МенеджерСущностей.Получить(Тип("ФизическоеЛицо"), ОпцииПоиска); +``` + ## Удаление сущностей diff --git "a/docs/\320\236\320\277\321\206\320\270\320\270\320\237\320\276\320\270\321\201\320\272\320\260.md" "b/docs/\320\236\320\277\321\206\320\270\320\270\320\237\320\276\320\270\321\201\320\272\320\260.md" index d4b13f5..262ee8f 100644 --- "a/docs/\320\236\320\277\321\206\320\270\320\270\320\237\320\276\320\270\321\201\320\272\320\260.md" +++ "b/docs/\320\236\320\277\321\206\320\270\320\270\320\237\320\276\320\270\321\201\320\272\320\260.md" @@ -60,3 +60,53 @@ Функция СортироватьПо(ИмяПоля, НаправлениеСортировки = Неопределено) ``` +### ВыбираютсяПервые + +```bsl +// Получить количество элементов, которые необходимо выбрать. +// +// Возвращаемое значение: +// Число - Количество элементов. +// +Функция ВыбираютсяПервые() +``` + +### Первые + +```bsl +// Выбрать первые n элементов. +// +// Параметры: +// КоличествоЭлементов - Число - Количество элементов. +// +// Возвращаемое значение: +// ОпцииПоиска - Текущий объект. +// +Функция Первые(КоличествоЭлементов) +``` + +### ВыбираетсяСоСмещением + +```bsl +// Получить количество элементов, которые необходимо пропустить. +// +// Возвращаемое значение: +// Число - Количество элементов. +// +Функция ВыбираетсяСоСмещением() +``` + +### Смещение + +```bsl +// Сместить выборку на n элементов. +// +// Параметры: +// КоличествоЭлементов - Число - Количество элементов. +// +// Возвращаемое значение: +// ОпцииПоиска - Текущий объект. +// +Функция Смещение(КоличествоЭлементов) +``` + diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\206\320\270\320\270\320\237\320\276\320\270\321\201\320\272\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\206\320\270\320\270\320\237\320\276\320\270\321\201\320\272\320\260.os" index 4e71e6a..edc9cae 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\206\320\270\320\270\320\237\320\276\320\270\321\201\320\272\320\260.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\321\206\320\270\320\270\320\237\320\276\320\270\321\201\320\272\320\260.os" @@ -58,10 +58,23 @@ КонецФункции +// Получить количество элементов, которые необходимо выбрать. +// +// Возвращаемое значение: +// Число - Количество элементов. +// Функция ВыбираютсяПервые() Экспорт Возврат Первые; КонецФункции +// Выбрать первые n элементов. +// +// Параметры: +// КоличествоЭлементов - Число - Количество элементов. +// +// Возвращаемое значение: +// ОпцииПоиска - Текущий объект. +// Функция Первые(КоличествоЭлементов) Экспорт Первые = КоличествоЭлементов; @@ -69,10 +82,23 @@ Возврат ЭтотОбъект; КонецФункции +// Получить количество элементов, которые необходимо пропустить. +// +// Возвращаемое значение: +// Число - Количество элементов. +// Функция ВыбираетсяСоСмещением() Экспорт Возврат Смещение; КонецФункции +// Сместить выборку на n элементов. +// +// Параметры: +// КоличествоЭлементов - Число - Количество элементов. +// +// Возвращаемое значение: +// ОпцииПоиска - Текущий объект. +// Функция Смещение(КоличествоЭлементов) Экспорт Смещение = КоличествоЭлементов;