From b1aa5b81cf7396897517000f44e7b2806a3629b5 Mon Sep 17 00:00:00 2001 From: Oleg Volchkov Date: Tue, 11 Feb 2025 12:10:47 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6?= =?UTF-8?q?=D0=B8=D0=B2=D0=B0=D0=B5=D0=BC=20=D0=B2=20=D1=83=D1=81=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=D0=B8=D1=8F=D1=85=20=D0=B4=D0=BB=D1=8F=20orm=20?= =?UTF-8?q?=D0=BC=D0=B0=D1=81=D1=81=D0=B8=D0=B2=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/sql/models/sql_table.p | 23 +++++++++++++++-------- lib/tests/unittest.p | 1 + ut/sql/sql_table/orm_test.p | 25 +++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/lib/sql/models/sql_table.p b/lib/sql/models/sql_table.p index fc9d534..719a7b5 100644 --- a/lib/sql/models/sql_table.p +++ b/lib/sql/models/sql_table.p @@ -682,7 +682,7 @@ pfClass ^if($aField is string){ $aField[$self._fields.[$aField]] } - $result[^self._builder.array[$aField;$aValues;$aOptions $.valueFunction[$self.fieldValue]]] + $result[^self._builder.array[$aField;$aValues;^hash::create[$aOptions] $.valueFunction[$self.fieldValue]]] @sqlFieldName[aFieldName] ^self.assert(^self._fields.contains[$aFieldName]){Неизвестное поле «${aFieldName}».} @@ -737,8 +737,8 @@ pfClass }(^self._plurals.contains[$match.1] || (^self._fields.contains[$match.1] && ($match.2 eq "in" || $match.2 eq "!in")) ){ -# $.[field [!]in][hash|table|values string] -# $.[plural [not]][hash|table|values string] +# $.[field [!]in][hash|table|array[hash or string value]|values string] +# $.[plural [not]][hash|table|array[hash or string value]|values string] $lRes.[^lRes._count[]][^self._condArrayField[$aConds;$match.1;^match.2.lower[];$v]] }($match.1 eq "OR" || $match.1 eq "AND" || $match.1 eq "NOT"){ # Рекурсивный вызов логического блока @@ -1188,8 +1188,8 @@ pfClass @array[aField;aValue;aOptions] ## Строит массив значений -## aValue[table|hash|csv-string] -## aOptions.column[$aField.name] — имя колонки в таблице +## aValue[table|hash|array|csv-string] +## aOptions.column[$aField.name] — имя колонки в таблице или массиве ## aOptions.emptyValue[null] — значение массива, если в aValue нет данных ## aOptions.valueFunction[fieldValue] — функция форматирования значения поля ^self.cleanMethodArgument[] @@ -1198,14 +1198,21 @@ pfClass $lEmptyValue[^if(^aOptions.contains[emptyValue]){$aOptions.emptyValue}{null}] $lColumn[^if(def $aOptions.column){$aOptions.column}{$aField.name}] ^switch(true){ - ^case($aValue is hash){$result[^aValue.foreach[k;_]{^lValueFunction[$aField;$k]}[, ]]} - ^case($aValue is table){$result[^aValue.menu{^lValueFunction[$aField;$aValue.[$lColumn]]}[, ]]} + ^case($aValue is hash){ + $result[^aValue.foreach[k;]{^lValueFunction[$aField;$k]}[, ]] + } + ^case($aValue is table){ + $result[^aValue.menu{^lValueFunction[$aField;$aValue.[$lColumn]]}[, ]] + } + ^case($aValue is array){ + $result[^aValue.foreach[;v]{^if($v is hash){^lValueFunction[$aField;$v.[$lColumn]]}{^lValueFunction[$aField;$v]}}[, ]] + } ^case($aValue is string){ $lItems[^self._parseCSVString[$aValue]] $result[^lItems.foreach[_;v]{^lValueFunction[$aField;$v]}[, ]] } ^case[DEFAULT]{ - ^throw[pfSQLBuilder.bad.array.values;Значениями массива может быть хеш, таблица или csv-строка. (Поле: $aField.name, тип значения: $aValue.CLASS_NAME)] + ^throw[pfSQLBuilder.bad.array.values;Значениями массива может быть хеш, таблица, массив или csv-строка. (Поле: $aField.name, тип значения: $aValue.CLASS_NAME)] } }] ^if(!def $result && def $lEmptyValue){ diff --git a/lib/tests/unittest.p b/lib/tests/unittest.p index 536dcf7..36deebc 100644 --- a/lib/tests/unittest.p +++ b/lib/tests/unittest.p @@ -750,6 +750,7 @@ $aException.file (${aException.lineno}:$aException.colno)] ^self.fail[Duration $lDuration <= $aDurationInSeconds] } + @assertHashEquals[aActual;aExpected;aOptions] ## aOptions.nestedAssert(false) — рекурсивный вызов $aActual[^hash::create[$aActual]] diff --git a/ut/sql/sql_table/orm_test.p b/ut/sql/sql_table/orm_test.p index defcd6b..69c8ff6 100644 --- a/ut/sql/sql_table/orm_test.p +++ b/ut/sql/sql_table/orm_test.p @@ -386,6 +386,31 @@ t1,50,10}[$.separator[,]] ^self.assert($lUser.userID == 1)[UserID is $lUser.userID] +@testConditions_arraysOfHashes[] + ^self._createTestUsers(50) + + $lRes[^sut.all[ + $.[userID in][^sut.all[ + $.asArray(true) + $.where[ + $sut.userID % 5 = 0 + ] + ]] + $.asArray(true) + ]] + + ^self.assertEq[^lRes.foreach[;v]{$v.userID}[,]][5,10,15,20,25,30,35,40,45,50] + +@testConditions_arraysOfHashesColumn[] + ^self._createTestUsers(50) + + $lRes[^sut.all[ + $.[userID in][^array::create[5;15;25;35;45]] + $.asArray(true) + ]] + + ^self.assertEq[^lRes.foreach[;v]{$v.userID}[,]][5,15,25,35,45] + #---------------------------------------------------------------------------------------------------------------------- @CLASS