From 48e79a2389c01e0011da6165af434fa55dece9e9 Mon Sep 17 00:00:00 2001 From: Oleg Volchkov Date: Fri, 28 Aug 2026 11:08:02 +0300 Subject: [PATCH] =?UTF-8?q?=D0=92=20lib/sql/models/sql=5Ftable.p@pfSQLTabl?= =?UTF-8?q?e@=5FallOrder=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BE=D0=BF=D1=86=D0=B8=D1=8E=20=5F=5ForderByContext?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ut.yml | 2 +- lib/sql/models/sql_table.p | 3 ++- ut/sql/sql_table/common_test.p | 25 +++++++++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ut.yml b/.github/workflows/ut.yml index 13718d5..a5511d7 100644 --- a/.github/workflows/ut.yml +++ b/.github/workflows/ut.yml @@ -29,7 +29,7 @@ jobs: ln -fs `pwd`/parser3.cgi $HOME/bin/ ln -fs `pwd`/lib $HOME/bin/lib - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - name: "Prepare MySQL 8 drivers" run: | diff --git a/lib/sql/models/sql_table.p b/lib/sql/models/sql_table.p index f04beb2..0029b1b 100644 --- a/lib/sql/models/sql_table.p +++ b/lib/sql/models/sql_table.p @@ -646,12 +646,13 @@ pfClass @_allOrder[aOptions] ## aOptions.orderBy +## aOptions.__orderByContext[group] — новый контекст для выражения, чтобы явно поменять дефолтный group (_allOrder[$.orderBy[$lOrderBy] $.__orderByContext[select]])) ^if(^aOptions.contains[orderBy]){ $lOrder[$aOptions.orderBy] }(def $self._defaultOrderBy){ $lOrder[$self._defaultOrderBy] } - ^self.asContext[group]{ + ^self.asContext[^ifdef[$aOptions.__orderByContext]{group}]{ ^switch(true){ ^case($lOrder is hash){ $result[^lOrder.foreach[k;v]{^if(^self._fields.contains[$k]){^self.sqlFieldName[$k] ^switch[^v.lower[]]{^case[desc;-]{DESC} ^case[asc;+]{ASC}}}}[, ]]} diff --git a/ut/sql/sql_table/common_test.p b/ut/sql/sql_table/common_test.p index 7ce90a5..68ef2e8 100644 --- a/ut/sql/sql_table/common_test.p +++ b/ut/sql/sql_table/common_test.p @@ -135,6 +135,31 @@ pfTestCase ^sut.sqlFieldName[unexistant] } +@test_allOrder__orderByContext_option[] + ^self.sut.addFields[ + $.simple[] + $.dbField[$.dbField[db_field]] + $.exField[$.expression[sum(db_field_1)]] + $.exDBField[$.expression[max(db_field_2)] $.dbField[db_field_2]] + $.fexField[$.expression[min(db_field_3)] $.fieldExpression[db_field_3]] + ] + + $self.sut._defaultOrderBy[ + $.simple[] + $.dbField[] + $.exField[] + $.exDBField[] + $.fexField[] + ] + +# Без опции сортируем по алиасам + ^self.assertEq[^self.sut._allOrder[];"test_table"."simple" , "test_table"."db_field" , "exField" , "exDBField" , "fexField" ] + ^self.assertEq[^self.sut._allOrder[$.__orderByContext[]];"test_table"."simple" , "test_table"."db_field" , "exField" , "exDBField" , "fexField" ] + +# С опцией сортируем с учётом контекста + ^self.assertEq[^self.sut._allOrder[$.__orderByContext[select]];"test_table"."simple" , "test_table"."db_field" , sum(db_field_1) , max(db_field_2) , min(db_field_3) ] + ^self.assertEq[^self.sut._allOrder[$.__orderByContext[group]];"test_table"."simple" , "test_table"."db_field" , "exField" , "exDBField" , "fexField" ] + @test_sql_json_processors[] ^self.sut.addFields[ $.j1[$.processor[json]]