Skip to content

refactor: 升级 JSqlParser 5.3 并补充兼容覆盖 - #30

Merged
zhou-hao merged 4 commits into
1.1from
jsqlparser-5-3-upgrade
Apr 16, 2026
Merged

refactor: 升级 JSqlParser 5.3 并补充兼容覆盖#30
zhou-hao merged 4 commits into
1.1from
jsqlparser-5-3-upgrade

Conversation

@zhou-hao

Copy link
Copy Markdown
Member

目的

  • 升级 JSqlParser 到 5.3,并适配 5.x AST / API 变化
  • 补充针对分支热点的测试,提升回归保护能力

核心变动

  • 构建:升级 jsqlparser5.3,并将编译基线调整到 Java 11
  • 兼容:适配 Select / ParenthesedSelect / Values / ParenthesedFromItem 等 5.x 节点模型变化
  • 映射:更新 FromFeatureValueMapFeaturePropertyMapFeatureFunctionMapFeature 等关键分发与映射逻辑
  • 测试:新增 DefaultContextRecordTestFeatureCoverageTest,并同步修正已有测试用例

测试结果

  • 命令:JAVA_HOME=$(/usr/libexec/java_home -v 11) mvn test
  • 单元测试:173 passed, 0 failed, 0 skipped
  • 覆盖率:instruction 92.04%, branch 79.52%, line 92.69%

风险与说明

  • 影响范围:SQL 解析、from/value 映射、函数参数处理、测试基线
  • 未覆盖项:分支覆盖率已提升但尚未达到 80%,仍可继续围绕 FromFeature / ValueMapFeature 的剩余分支补测
  • 已知限制:本次同时引入 Java 11 作为编译运行基线,消费方需确认本地 JDK 版本

@zhou-hao

Copy link
Copy Markdown
Member Author

已补充本轮收尾改动:

  • 将项目版本提升为 ,作为本次 JSqlParser 5.3 / Java 11 破坏性升级的版本边界
  • 同步 GitHub Actions 到 JDK 11,并升级 、、
  • 清理 Codacy 关注的 类问题,统一通过 no-op 处理默认 visitor 分支
  • 的空 已补充显式说明

验证结果:

  • 命令:[INFO] Scanning for projects...
    [INFO]
    [INFO] ----------------------< org.jetlinks:reactor-ql >-----------------------
    [INFO] Building JetLinks 1.1.0
    [INFO] from pom.xml
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- license:4.6:check (check-license) @ reactor-ql ---
    [WARNING] Parameter 'legacyConfigExcludes' (user property 'license.excludes') is deprecated: use LicenseSet.excludes
    [WARNING] Parameter 'legacyConfigHeader' (user property 'license.header') is deprecated: use LicenseSet.header
    [WARNING] Parameter 'legacyConfigIncludes' (user property 'license.includes') is deprecated: use LicenseSet.includes
    [INFO] Checking licenses...
    [INFO]
    [INFO] --- jacoco:0.8.7:prepare-agent (default) @ reactor-ql ---
    [INFO] argLine set to "-javaagent:/Users/zhouhao/.m2/repository/org/jacoco/org.jacoco.agent/0.8.7/org.jacoco.agent-0.8.7-runtime.jar=destfile=/Volumes/BigSur 1/Users/zhouhao/IdeaProjects/reactor-ql/target/jacoco.exec,excludes=/ExpressionVisitorAdapter*:/ReactorQLMetadata*:net/sf/jsqlparser/**"
    [INFO]
    [INFO] --- resources:3.3.1:resources (default-resources) @ reactor-ql ---
    [INFO] Copying 0 resource from src/main/resources to target/classes
    [INFO]
    [INFO] --- compiler:3.11.0:compile (default-compile) @ reactor-ql ---
    [INFO] Nothing to compile - all classes are up to date
    [INFO]
    [INFO] --- resources:3.3.1:testResources (default-testResources) @ reactor-ql ---
    [INFO] skip non existing resourceDirectory /Volumes/BigSur 1/Users/zhouhao/IdeaProjects/reactor-ql/src/test/resources
    [INFO]
    [INFO] --- compiler:3.11.0:testCompile (default-testCompile) @ reactor-ql ---
    [INFO] Nothing to compile - all classes are up to date
    [INFO]
    [INFO] --- surefire:2.22.0:test (default-test) @ reactor-ql ---
    [INFO]
    [INFO] -------------------------------------------------------
    [INFO] T E S T S
    [INFO] -------------------------------------------------------
    [INFO] Running org.jetlinks.reactor.ql.supports.DefaultReactorQLMetadataTest
    [INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.445 s - in org.jetlinks.reactor.ql.supports.DefaultReactorQLMetadataTest
    [INFO] Running org.jetlinks.reactor.ql.supports.DefaultPropertyFeatureTest
    21:08:08.466 [main] DEBUG org.apache.commons.beanutils.converters.BooleanConverter - Setting default value: false
    21:08:08.472 [main] DEBUG org.apache.commons.beanutils.converters.BooleanConverter - Converting 'Boolean' value 'false' to type 'Boolean'
    21:08:08.472 [main] DEBUG org.apache.commons.beanutils.converters.BooleanConverter - No conversion required, value is already a Boolean
    21:08:08.475 [main] DEBUG org.apache.commons.beanutils.converters.ByteConverter - Setting default value: 0
    21:08:08.475 [main] DEBUG org.apache.commons.beanutils.converters.ByteConverter - Converting 'Integer' value '0' to type 'Byte'
    21:08:08.475 [main] DEBUG org.apache.commons.beanutils.converters.ByteConverter - Converted to Byte value '0'
    21:08:08.476 [main] DEBUG org.apache.commons.beanutils.converters.CharacterConverter - Setting default value:
    21:08:08.476 [main] DEBUG org.apache.commons.beanutils.converters.CharacterConverter - Converting 'Character' value ' ' to type 'Character'
    21:08:08.476 [main] DEBUG org.apache.commons.beanutils.converters.CharacterConverter - No conversion required, value is already a Character
    21:08:08.477 [main] DEBUG org.apache.commons.beanutils.converters.DoubleConverter - Setting default value: 0
    21:08:08.477 [main] DEBUG org.apache.commons.beanutils.converters.DoubleConverter - Converting 'Integer' value '0' to type 'Double'
    21:08:08.477 [main] DEBUG org.apache.commons.beanutils.converters.DoubleConverter - Converted to Double value '0.0'
    21:08:08.478 [main] DEBUG org.apache.commons.beanutils.converters.FloatConverter - Setting default value: 0
    21:08:08.478 [main] DEBUG org.apache.commons.beanutils.converters.FloatConverter - Converting 'Integer' value '0' to type 'Float'
    21:08:08.478 [main] DEBUG org.apache.commons.beanutils.converters.FloatConverter - Converted to Float value '0.0'
    21:08:08.479 [main] DEBUG org.apache.commons.beanutils.converters.IntegerConverter - Setting default value: 0
    21:08:08.479 [main] DEBUG org.apache.commons.beanutils.converters.IntegerConverter - Converting 'Integer' value '0' to type 'Integer'
    21:08:08.479 [main] DEBUG org.apache.commons.beanutils.converters.IntegerConverter - No conversion required, value is already a Integer
    21:08:08.480 [main] DEBUG org.apache.commons.beanutils.converters.LongConverter - Setting default value: 0
    21:08:08.480 [main] DEBUG org.apache.commons.beanutils.converters.LongConverter - Converting 'Integer' value '0' to type 'Long'
    21:08:08.480 [main] DEBUG org.apache.commons.beanutils.converters.LongConverter - Converted to Long value '0'
    21:08:08.481 [main] DEBUG org.apache.commons.beanutils.converters.ShortConverter - Setting default value: 0
    21:08:08.481 [main] DEBUG org.apache.commons.beanutils.converters.ShortConverter - Converting 'Integer' value '0' to type 'Short'
    21:08:08.481 [main] DEBUG org.apache.commons.beanutils.converters.ShortConverter - Converted to Short value '0'
    21:08:08.482 [main] DEBUG org.apache.commons.beanutils.converters.BigDecimalConverter - Setting default value: 0.0
    21:08:08.482 [main] DEBUG org.apache.commons.beanutils.converters.BigDecimalConverter - Converting 'BigDecimal' value '0.0' to type 'BigDecimal'
    21:08:08.482 [main] DEBUG org.apache.commons.beanutils.converters.BigDecimalConverter - No conversion required, value is already a BigDecimal
    21:08:08.483 [main] DEBUG org.apache.commons.beanutils.converters.BigIntegerConverter - Setting default value: 0
    21:08:08.483 [main] DEBUG org.apache.commons.beanutils.converters.BigIntegerConverter - Converting 'BigInteger' value '0' to type 'BigInteger'
    21:08:08.483 [main] DEBUG org.apache.commons.beanutils.converters.BigIntegerConverter - No conversion required, value is already a BigInteger
    21:08:08.483 [main] DEBUG org.apache.commons.beanutils.converters.BooleanConverter - Setting default value: false
    21:08:08.483 [main] DEBUG org.apache.commons.beanutils.converters.BooleanConverter - Converting 'Boolean' value 'false' to type 'Boolean'
    21:08:08.484 [main] DEBUG org.apache.commons.beanutils.converters.BooleanConverter - No conversion required, value is already a Boolean
    21:08:08.484 [main] DEBUG org.apache.commons.beanutils.converters.ByteConverter - Setting default value: 0
    21:08:08.484 [main] DEBUG org.apache.commons.beanutils.converters.ByteConverter - Converting 'Integer' value '0' to type 'Byte'
    21:08:08.484 [main] DEBUG org.apache.commons.beanutils.converters.ByteConverter - Converted to Byte value '0'
    21:08:08.484 [main] DEBUG org.apache.commons.beanutils.converters.CharacterConverter - Setting default value:
    21:08:08.484 [main] DEBUG org.apache.commons.beanutils.converters.CharacterConverter - Converting 'Character' value ' ' to type 'Character'
    21:08:08.484 [main] DEBUG org.apache.commons.beanutils.converters.CharacterConverter - No conversion required, value is already a Character
    21:08:08.484 [main] DEBUG org.apache.commons.beanutils.converters.DoubleConverter - Setting default value: 0
    21:08:08.484 [main] DEBUG org.apache.commons.beanutils.converters.DoubleConverter - Converting 'Integer' value '0' to type 'Double'
    21:08:08.484 [main] DEBUG org.apache.commons.beanutils.converters.DoubleConverter - Converted to Double value '0.0'
    21:08:08.484 [main] DEBUG org.apache.commons.beanutils.converters.FloatConverter - Setting default value: 0
    21:08:08.484 [main] DEBUG org.apache.commons.beanutils.converters.FloatConverter - Converting 'Integer' value '0' to type 'Float'
    21:08:08.484 [main] DEBUG org.apache.commons.beanutils.converters.FloatConverter - Converted to Float value '0.0'
    21:08:08.484 [main] DEBUG org.apache.commons.beanutils.converters.IntegerConverter - Setting default value: 0
    21:08:08.485 [main] DEBUG org.apache.commons.beanutils.converters.IntegerConverter - Converting 'Integer' value '0' to type 'Integer'
    21:08:08.485 [main] DEBUG org.apache.commons.beanutils.converters.IntegerConverter - No conversion required, value is already a Integer
    21:08:08.485 [main] DEBUG org.apache.commons.beanutils.converters.LongConverter - Setting default value: 0
    21:08:08.485 [main] DEBUG org.apache.commons.beanutils.converters.LongConverter - Converting 'Integer' value '0' to type 'Long'
    21:08:08.485 [main] DEBUG org.apache.commons.beanutils.converters.LongConverter - Converted to Long value '0'
    21:08:08.485 [main] DEBUG org.apache.commons.beanutils.converters.ShortConverter - Setting default value: 0
    21:08:08.485 [main] DEBUG org.apache.commons.beanutils.converters.ShortConverter - Converting 'Integer' value '0' to type 'Short'
    21:08:08.485 [main] DEBUG org.apache.commons.beanutils.converters.ShortConverter - Converted to Short value '0'
    21:08:08.486 [main] DEBUG org.apache.commons.beanutils.converters.StringConverter - Setting default value:
    21:08:08.486 [main] DEBUG org.apache.commons.beanutils.converters.StringConverter - Converting 'String' value '' to type 'String'
    21:08:08.497 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting default value: [Z@ac4e690
    21:08:08.497 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting 'boolean[]' value '[Z@ac4e690' to type 'boolean[]'
    21:08:08.497 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - No conversion required, value is already a boolean[]
    21:08:08.497 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting default value: [B@6afeaf2d
    21:08:08.497 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting 'byte[]' value '[B@6afeaf2d' to type 'byte[]'
    21:08:08.497 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - No conversion required, value is already a byte[]
    21:08:08.498 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting default value: [C@365bfc5f
    21:08:08.498 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting 'char[]' value '[C@365bfc5f' to type 'char[]'
    21:08:08.498 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - No conversion required, value is already a char[]
    21:08:08.498 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting default value: [D@37a3ec27
    21:08:08.498 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting 'double[]' value '[D@37a3ec27' to type 'double[]'
    21:08:08.498 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - No conversion required, value is already a double[]
    21:08:08.498 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting default value: [F@416b1265
    21:08:08.498 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting 'float[]' value '[F@416b1265' to type 'float[]'
    21:08:08.498 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - No conversion required, value is already a float[]
    21:08:08.498 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting default value: [I@da22aa
    21:08:08.498 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting 'int[]' value '[I@da22aa' to type 'int[]'
    21:08:08.498 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - No conversion required, value is already a int[]
    21:08:08.498 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting default value: [J@75452aea
    21:08:08.498 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting 'long[]' value '[J@75452aea' to type 'long[]'
    21:08:08.498 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - No conversion required, value is already a long[]
    21:08:08.499 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting default value: [S@4537880f
    21:08:08.499 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting 'short[]' value '[S@4537880f' to type 'short[]'
    21:08:08.499 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - No conversion required, value is already a short[]
    21:08:08.499 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting default value: [Ljava.math.BigDecimal;@48e74764
    21:08:08.499 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting 'BigDecimal[]' value '[Ljava.math.BigDecimal;@48e74764' to type 'BigDecimal[]'
    21:08:08.499 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - No conversion required, value is already a BigDecimal[]
    21:08:08.499 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting default value: [Ljava.math.BigInteger;@7a3643e3
    21:08:08.499 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting 'BigInteger[]' value '[Ljava.math.BigInteger;@7a3643e3' to type 'BigInteger[]'
    21:08:08.499 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - No conversion required, value is already a BigInteger[]
    21:08:08.499 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting default value: [Ljava.lang.Boolean;@55071497
    21:08:08.500 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting 'Boolean[]' value '[Ljava.lang.Boolean;@55071497' to type 'Boolean[]'
    21:08:08.500 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - No conversion required, value is already a Boolean[]
    21:08:08.500 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting default value: [Ljava.lang.Byte;@58b8f9e3
    21:08:08.500 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting 'Byte[]' value '[Ljava.lang.Byte;@58b8f9e3' to type 'Byte[]'
    21:08:08.500 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - No conversion required, value is already a Byte[]
    21:08:08.500 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting default value: [Ljava.lang.Character;@5f6e2ad9
    21:08:08.500 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting 'Character[]' value '[Ljava.lang.Character;@5f6e2ad9' to type 'Character[]'
    21:08:08.500 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - No conversion required, value is already a Character[]
    21:08:08.500 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting default value: [Ljava.lang.Double;@1cc9bd9b
    21:08:08.500 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting 'Double[]' value '[Ljava.lang.Double;@1cc9bd9b' to type 'Double[]'
    21:08:08.500 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - No conversion required, value is already a Double[]
    21:08:08.500 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting default value: [Ljava.lang.Float;@1d1cfe4
    21:08:08.500 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting 'Float[]' value '[Ljava.lang.Float;@1d1cfe4' to type 'Float[]'
    21:08:08.500 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - No conversion required, value is already a Float[]
    21:08:08.500 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting default value: [Ljava.lang.Integer;@5a51336a
    21:08:08.501 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting 'Integer[]' value '[Ljava.lang.Integer;@5a51336a' to type 'Integer[]'
    21:08:08.501 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - No conversion required, value is already a Integer[]
    21:08:08.501 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting default value: [Ljava.lang.Long;@42211e04
    21:08:08.501 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting 'Long[]' value '[Ljava.lang.Long;@42211e04' to type 'Long[]'
    21:08:08.501 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - No conversion required, value is already a Long[]
    21:08:08.501 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting default value: [Ljava.lang.Short;@312a738d
    21:08:08.501 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting 'Short[]' value '[Ljava.lang.Short;@312a738d' to type 'Short[]'
    21:08:08.501 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - No conversion required, value is already a Short[]
    21:08:08.501 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting default value: [Ljava.lang.String;@34cb0e49
    21:08:08.501 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting 'String[]' value '[Ljava.lang.String;@34cb0e49' to type 'String[]'
    21:08:08.501 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - No conversion required, value is already a String[]
    21:08:08.502 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting default value: [Ljava.lang.Class;@48b2dbc4
    21:08:08.502 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting 'Class[]' value '[Ljava.lang.Class;@48b2dbc4' to type 'Class[]'
    21:08:08.502 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - No conversion required, value is already a Class[]
    21:08:08.502 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting default value: [Ljava.util.Date;@2a667f44
    21:08:08.502 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting 'Date[]' value '[Ljava.util.Date;@2a667f44' to type 'Date[]'
    21:08:08.502 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - No conversion required, value is already a Date[]
    21:08:08.502 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting default value: [Ljava.util.Calendar;@3f6f9cef
    21:08:08.502 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting 'Calendar[]' value '[Ljava.util.Calendar;@3f6f9cef' to type 'Calendar[]'
    21:08:08.502 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - No conversion required, value is already a Calendar[]
    21:08:08.502 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting default value: [Ljava.io.File;@7858d31d
    21:08:08.502 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting 'java.io.File[]' value '[Ljava.io.File;@7858d31d' to type 'java.io.File[]'
    21:08:08.503 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - No conversion required, value is already a java.io.File[]
    21:08:08.503 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting default value: [Ljava.sql.Date;@3b65084e
    21:08:08.503 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting 'java.sql.Date[]' value '[Ljava.sql.Date;@3b65084e' to type 'java.sql.Date[]'
    21:08:08.503 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - No conversion required, value is already a java.sql.Date[]
    21:08:08.503 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting default value: [Ljava.sql.Time;@cae2a97
    21:08:08.503 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting 'java.sql.Time[]' value '[Ljava.sql.Time;@cae2a97' to type 'java.sql.Time[]'
    21:08:08.503 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - No conversion required, value is already a java.sql.Time[]
    21:08:08.503 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting default value: [Ljava.sql.Timestamp;@14656be5
    21:08:08.503 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting 'java.sql.Timestamp[]' value '[Ljava.sql.Timestamp;@14656be5' to type 'java.sql.Timestamp[]'
    21:08:08.503 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - No conversion required, value is already a java.sql.Timestamp[]
    21:08:08.503 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Setting default value: [Ljava.net.URL;@5db9f51f
    21:08:08.503 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - Converting 'java.net.URL[]' value '[Ljava.net.URL;@5db9f51f' to type 'java.net.URL[]'
    21:08:08.503 [main] DEBUG org.apache.commons.beanutils.converters.ArrayConverter - No conversion required, value is already a java.net.URL[]
    21:08:08.565 [main] WARN org.jetlinks.reactor.ql.supports.DefaultPropertyFeature - get property [nest.aa] from org.jetlinks.reactor.ql.supports.DefaultPropertyFeatureTest$TestData@3add5e17 error java.lang.NoSuchMethodException: Unknown property 'aa' on class 'class org.jetlinks.reactor.ql.supports.DefaultPropertyFeatureTest$TestData'
    21:08:08.566 [main] WARN org.jetlinks.reactor.ql.supports.DefaultPropertyFeature - get property [aa] from org.jetlinks.reactor.ql.supports.DefaultPropertyFeatureTest$TestData@1c58d7be error java.lang.NoSuchMethodException: Unknown property 'aa' on class 'class org.jetlinks.reactor.ql.supports.DefaultPropertyFeatureTest$TestData'
    [INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.18 s - in org.jetlinks.reactor.ql.supports.DefaultPropertyFeatureTest
    [INFO] Running org.jetlinks.reactor.ql.supports.fmap.ArrayValueFlatMapFeatureTest
    [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.002 s - in org.jetlinks.reactor.ql.supports.fmap.ArrayValueFlatMapFeatureTest
    [INFO] Running org.jetlinks.reactor.ql.supports.FeatureCoverageTest
    21:08:08.691 [main] DEBUG reactor.util.Loggers - Using Slf4j logging framework
    [INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.296 s - in org.jetlinks.reactor.ql.supports.FeatureCoverageTest
    [INFO] Running org.jetlinks.reactor.ql.supports.filter.EqualsFilterTest
    [INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.002 s - in org.jetlinks.reactor.ql.supports.filter.EqualsFilterTest
    [INFO] Running org.jetlinks.reactor.ql.supports.filter.BetweenFilterTest
    [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 s - in org.jetlinks.reactor.ql.supports.filter.BetweenFilterTest
    [INFO] Running org.jetlinks.reactor.ql.supports.filter.LikeFilterTest
    [INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 s - in org.jetlinks.reactor.ql.supports.filter.LikeFilterTest
    [INFO] Running org.jetlinks.reactor.ql.supports.filter.GreaterTanFilterTest
    [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 s - in org.jetlinks.reactor.ql.supports.filter.GreaterTanFilterTest
    [INFO] Running org.jetlinks.reactor.ql.supports.filter.LessTanFilterTest
    [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 s - in org.jetlinks.reactor.ql.supports.filter.LessTanFilterTest
    [INFO] Running org.jetlinks.reactor.ql.supports.filter.IfValueMapFeatureTest
    [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 s - in org.jetlinks.reactor.ql.supports.filter.IfValueMapFeatureTest
    [INFO] Running org.jetlinks.reactor.ql.supports.filter.LessEqualsTanFilterTest
    [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 s - in org.jetlinks.reactor.ql.supports.filter.LessEqualsTanFilterTest
    [INFO] Running org.jetlinks.reactor.ql.supports.filter.GreaterEqualsTanFilterTest
    [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 s - in org.jetlinks.reactor.ql.supports.filter.GreaterEqualsTanFilterTest
    [INFO] Running org.jetlinks.reactor.ql.DefaultContextRecordTest
    [INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 s - in org.jetlinks.reactor.ql.DefaultContextRecordTest
    [INFO] Running org.jetlinks.reactor.ql.utils.CompareUtilsTest
    [INFO] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.008 s - in org.jetlinks.reactor.ql.utils.CompareUtilsTest
    [INFO] Running org.jetlinks.reactor.ql.utils.CastUtilsTest
    [INFO] Tests run: 11, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.019 s - in org.jetlinks.reactor.ql.utils.CastUtilsTest
    [INFO] Running org.jetlinks.reactor.ql.utils.ExpressionUtilsTest
    [INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.003 s - in org.jetlinks.reactor.ql.utils.ExpressionUtilsTest
    [INFO] Running org.jetlinks.reactor.ql.utils.CalculateUtilsTest
    [INFO] Tests run: 14, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.015 s - in org.jetlinks.reactor.ql.utils.CalculateUtilsTest
    [INFO] Running org.jetlinks.reactor.ql.examples.GroupByWindowTest
    {total=3.0, min=1, max=2}
    {total=3.0, min=1, max=2}
    {total=5.0, min=2, max=3}
    {total=7.0, min=3, max=4}
    {total=9.0, min=4, max=5}
    {total=11.0, min=5, max=6}
    {total=6.0, min=6, max=6}
    {total=6.0}
    {total=9.0}
    {total=12.0}
    {total=15.0}
    {total=11.0}
    {total=6.0}
    {total=6.0}
    {total=15.0}
    {total=15.0}
    {idList2=[{type=1}, {type=1}, {type=1}, {type=1}, {type=1}, {type=1}, {type=1}, {type=1}, {type=1}, {type=1}], idList=[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], total=10.0, list=[{type=1}, {type=1}, {type=1}, {type=1}, {type=1}, {type=1}, {type=1}, {type=1}, {type=1}, {type=1}]}
    {idList2=[{type=2}, {type=2}, {type=2}, {type=2}, {type=2}, {type=2}, {type=2}, {type=2}, {type=2}, {type=2}], idList=[2, 2, 2, 2, 2, 2, 2, 2, 2, 2], total=20.0, list=[{type=2}, {type=2}, {type=2}, {type=2}, {type=2}, {type=2}, {type=2}, {type=2}, {type=2}, {type=2}]}
    {idList2=[{type=3}, {type=3}, {type=3}, {type=3}, {type=3}, {type=3}, {type=3}, {type=3}, {type=3}, {type=3}], idList=[3, 3, 3, 3, 3, 3, 3, 3, 3, 3], total=30.0, list=[{type=3}, {type=3}, {type=3}, {type=3}, {type=3}, {type=3}, {type=3}, {type=3}, {type=3}, {type=3}]}
    {idList2=[{type=4}, {type=4}, {type=4}, {type=4}, {type=4}, {type=4}, {type=4}, {type=4}, {type=4}, {type=4}], idList=[4, 4, 4, 4, 4, 4, 4, 4, 4, 4], total=40.0, list=[{type=4}, {type=4}, {type=4}, {type=4}, {type=4}, {type=4}, {type=4}, {type=4}, {type=4}, {type=4}]}
    {idList2=[{type=5}, {type=5}, {type=5}, {type=5}, {type=5}, {type=5}, {type=5}, {type=5}, {type=5}, {type=5}], idList=[5, 5, 5, 5, 5, 5, 5, 5, 5, 5], total=50.0, list=[{type=5}, {type=5}, {type=5}, {type=5}, {type=5}, {type=5}, {type=5}, {type=5}, {type=5}, {type=5}]}
    {idList2=[{type=6}, {type=6}, {type=6}, {type=6}, {type=6}, {type=6}, {type=6}, {type=6}, {type=6}, {type=6}], idList=[6, 6, 6, 6, 6, 6, 6, 6, 6, 6], total=60.0, list=[{type=6}, {type=6}, {type=6}, {type=6}, {type=6}, {type=6}, {type=6}, {type=6}, {type=6}, {type=6}]}
    {idList2=[{type=7}, {type=7}, {type=7}, {type=7}, {type=7}, {type=7}, {type=7}, {type=7}, {type=7}, {type=7}], idList=[7, 7, 7, 7, 7, 7, 7, 7, 7, 7], total=70.0, list=[{type=7}, {type=7}, {type=7}, {type=7}, {type=7}, {type=7}, {type=7}, {type=7}, {type=7}, {type=7}]}
    {idList2=[{type=8}, {type=8}, {type=8}, {type=8}, {type=8}, {type=8}, {type=8}, {type=8}, {type=8}, {type=8}], idList=[8, 8, 8, 8, 8, 8, 8, 8, 8, 8], total=80.0, list=[{type=8}, {type=8}, {type=8}, {type=8}, {type=8}, {type=8}, {type=8}, {type=8}, {type=8}, {type=8}]}
    {idList2=[{type=9}, {type=9}, {type=9}, {type=9}, {type=9}, {type=9}, {type=9}, {type=9}, {type=9}, {type=9}], idList=[9, 9, 9, 9, 9, 9, 9, 9, 9, 9], total=90.0, list=[{type=9}, {type=9}, {type=9}, {type=9}, {type=9}, {type=9}, {type=9}, {type=9}, {type=9}, {type=9}]}
    {sum=3.0, total=2, avg=1.5, min=1, max=2}
    {sum=7.0, total=2, avg=3.5, min=3, max=4}
    {sum=11.0, total=2, avg=5.5, min=5, max=6}
    {total=6.0}
    {total=15.0}
    [INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 5.499 s - in org.jetlinks.reactor.ql.examples.GroupByWindowTest
    [INFO] Running org.jetlinks.reactor.ql.examples.UnionTest
    {t.v=2}
    {t.v=0}
    {t.v=1}
    {t.v=0}
    {t.v=1}
    {t.v=0}
    {t.v=1}
    {t.v=0}
    {t.v=1}
    {t.v=2}
    [INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.162 s - in org.jetlinks.reactor.ql.examples.UnionTest
    [INFO] Running org.jetlinks.reactor.ql.ReactorQLTest
    {row={1=1, 2=2}}
    {t3.name=t3, t2.name=t2, t1.name=t1, t1.v=0, t3.v=0, t2.v=0}
    {t3.name=t3, t2.name=t2, t1.name=t1, t1.v=1, t3.v=1, t2.v=1}
    {t1.name=t1, t1.v=2}
    {c=3}
    {deviceNum=12131221, gpsSpeed=34.3}
    {t2.name=1, t1.name=t1}
    {t2.name=t1, t1.name=t1}
    {t2.name=1, t1.name=t1}
    {t2.name=t1, t1.name=t1}
    {v=2}
    {v=3}
    {v=7}
    {v=8}
    {v=10}
    {v=1}
    {v=2}
    {v=6}
    {v=7}
    {v=10}
    {v={bool=true}}
    {v={bool=false}}
    {v=1}
    {1 ^ 3=2, bit_unsigned_shift(1, 3)=0, bit_count(30)=4, -(+3)=-3, 1 & 3=1, bit_mutex(2, 4)=6, bit_not(3)=-4, hex=0x616263 , 1 << 3=3, 1 >> 3=3, 1 | 3=3, bit_right_shift(1, 3)=0, -3=-3, bit_or(3, 9)=11, ~3=-4, bit_left_shift(1, 3)=8, bit_and(3, 8)=0}
    {t=table}
    {t3.t1.v1=0, t3.t2.v2=1}
    {t3.t1.v1=1, t3.t2.v2=2}
    {elapsed=0, rownum=1}
    {elapsed=0, rownum=1}
    {_group_by_key=[0], type=0, total=10}
    {_group_by_key=[1], type=1, total=10}
    {_group_by_key=[2], type=2, total=10}
    {_group_by_key=[3], type=3, total=10}
    {_group_by_key=[4], type=4, total=10}
    {_group_by_key=[5], type=5, total=10}
    {_group_by_key=[6], type=6, total=10}
    {_group_by_key=[7], type=7, total=10}
    {_group_by_key=[8], type=8, total=10}
    {_group_by_key=[9], type=9, total=10}
    {this=0}
    {this=1}
    {this=2}
    {this=3}
    {this=4}
    {this=5}
    {this=6}
    {this=7}
    {this=8}
    {this=9}
    {this=0}
    {this=1}
    {this=2}
    {this=3}
    {this=4}
    {this=5}
    {this=6}
    {this=7}
    {this=8}
    {this=9}
    {type=0}
    {type=一}
    {type=二}
    {type=三}
    {date=Wed Jan 01 00:00:00 CST 2020, float=100.3, long=100, bool3=false, bool2=true, bool1=true, bool0=true, val=1, d=100.3, int=100, decimal=1.0E+32}
    {log=2.302585092994046, log1p=2.3978952727983707, log10=1.0, expm1=22025.465794806718, cos=-0.8390715290764524, rint=10.0, radians=0.17453292519943295, atan=1.4711276743037347, degrees=572.9577951308232, tanh=0.9999999958776927, sin=-0.5440211108893698, exp=22026.465794806718, floor=10.0, tan=0.6483608274590866, sinh=11013.232874703393, acos=NaN, ceil=10.0, cosh=11013.232920103324, abs=10.0, round=10, asin=NaN}
    {week=3, year=2026, second=14, hour=21, day=15, minute=8, month=4, day2=105}
    {row=[{val=1}, {val=4}]}
    {t2.name=t2, t1.name=t1, t1.v=0, t2.v=0}
    {t2.name=t2, t2.v=1}
    {t2.name=t2, t2.v=0}
    {t2.name=t2, t1.name=t1, t1.v=1, t2.v=1}
    {row=[{val=1}, {val=2}, {val=3}, {val=4}]}
    {v={list=[10, 20, 30]}}
    21:08:14.980 [main] INFO testGroupTimeProperty - | onSubscribe([Fuseable] FluxOnAssembly.OnAssemblySubscriber)
    21:08:14.981 [main] INFO testGroupTimeProperty - | request(unbounded)
    {deviceId=2, total=0}
    21:08:16.993 [parallel-4] INFO testGroupTimeProperty - | onNext({deviceId=2, total=0})
    {deviceId=1, total=0}
    21:08:16.994 [parallel-4] INFO testGroupTimeProperty - | onNext({deviceId=1, total=0})
    {deviceId=1, total=0}
    21:08:17.989 [parallel-3] INFO testGroupTimeProperty - | onNext({deviceId=1, total=0})
    {deviceId=2, total=0}
    21:08:17.993 [parallel-4] INFO testGroupTimeProperty - | onNext({deviceId=2, total=0})
    21:08:17.993 [parallel-4] INFO testGroupTimeProperty - | cancel()
    {total=3.5}
    {total=5.5}
    {total=7.5}
    {total=9.0}
    {this=1}
    {this=2}
    {this=3}
    {this=4}
    {this=5}
    {this=6}
    {this=7}
    {sub=-10, mod=0, mul=0, sub1=-10, min=1, avg=2.0, divi=0, mod1=0, mul1=0, mx=2, plus=10, div1=0, v=10}
    {sub=-9, mod=1, mul=10, sub1=-9, min=1, avg=2.0, divi=0, mod1=1, mul1=10, mx=2, plus=11, div1=0, v=11}
    {sub=-8, mod=0, mul=20, sub1=-8, min=1, avg=2.0, divi=0, mod1=2, mul1=20, mx=2, plus=12, div1=0, v=12}
    {sub=-7, mod=1, mul=30, sub1=-7, min=1, avg=2.0, divi=0, mod1=3, mul1=30, mx=2, plus=13, div1=0, v=13}
    {sub=-6, mod=0, mul=40, sub1=-6, min=1, avg=2.0, divi=0, mod1=4, mul1=40, mx=2, plus=14, div1=0, v=14}
    {sub=-5, mod=1, mul=50, sub1=-5, min=1, avg=2.0, divi=0, mod1=5, mul1=50, mx=2, plus=15, div1=0, v=15}
    {sub=-4, mod=0, mul=60, sub1=-4, min=1, avg=2.0, divi=0, mod1=6, mul1=60, mx=2, plus=16, div1=0, v=16}
    {sub=-3, mod=1, mul=70, sub1=-3, min=1, avg=2.0, divi=0, mod1=7, mul1=70, mx=2, plus=17, div1=0, v=17}
    {sub=-2, mod=0, mul=80, sub1=-2, min=1, avg=2.0, divi=0, mod1=8, mul1=80, mx=2, plus=18, div1=0, v=18}
    {sub=-1, mod=1, mul=90, sub1=-1, min=1, avg=2.0, divi=0, mod1=9, mul1=90, mx=2, plus=19, div1=0, v=19}
    {sub=0, mod=0, mul=100, sub1=0, min=1, avg=2.0, divi=1, mod1=0, mul1=100, mx=2, plus=20, div1=1, v=20}
    {sub=1, mod=1, mul=110, sub1=1, min=1, avg=2.0, divi=1, mod1=1, mul1=110, mx=2, plus=21, div1=1, v=21}
    {sub=2, mod=0, mul=120, sub1=2, min=1, avg=2.0, divi=1, mod1=2, mul1=120, mx=2, plus=22, div1=1, v=22}
    {sub=3, mod=1, mul=130, sub1=3, min=1, avg=2.0, divi=1, mod1=3, mul1=130, mx=2, plus=23, div1=1, v=23}
    {sub=4, mod=0, mul=140, sub1=4, min=1, avg=2.0, divi=1, mod1=4, mul1=140, mx=2, plus=24, div1=1, v=24}
    {sub=5, mod=1, mul=150, sub1=5, min=1, avg=2.0, divi=1, mod1=5, mul1=150, mx=2, plus=25, div1=1, v=25}
    {sub=6, mod=0, mul=160, sub1=6, min=1, avg=2.0, divi=1, mod1=6, mul1=160, mx=2, plus=26, div1=1, v=26}
    {sub=7, mod=1, mul=170, sub1=7, min=1, avg=2.0, divi=1, mod1=7, mul1=170, mx=2, plus=27, div1=1, v=27}
    {sub=8, mod=0, mul=180, sub1=8, min=1, avg=2.0, divi=1, mod1=8, mul1=180, mx=2, plus=28, div1=1, v=28}
    {sub=9, mod=1, mul=190, sub1=9, min=1, avg=2.0, divi=1, mod1=9, mul1=190, mx=2, plus=29, div1=1, v=29}
    {sub=10, mod=0, mul=200, sub1=10, min=1, avg=2.0, divi=2, mod1=0, mul1=200, mx=2, plus=30, div1=2, v=30}
    {sub=11, mod=1, mul=210, sub1=11, min=1, avg=2.0, divi=2, mod1=1, mul1=210, mx=2, plus=31, div1=2, v=31}
    {sub=12, mod=0, mul=220, sub1=12, min=1, avg=2.0, divi=2, mod1=2, mul1=220, mx=2, plus=32, div1=2, v=32}
    {sub=13, mod=1, mul=230, sub1=13, min=1, avg=2.0, divi=2, mod1=3, mul1=230, mx=2, plus=33, div1=2, v=33}
    {sub=14, mod=0, mul=240, sub1=14, min=1, avg=2.0, divi=2, mod1=4, mul1=240, mx=2, plus=34, div1=2, v=34}
    {sub=15, mod=1, mul=250, sub1=15, min=1, avg=2.0, divi=2, mod1=5, mul1=250, mx=2, plus=35, div1=2, v=35}
    {sub=16, mod=0, mul=260, sub1=16, min=1, avg=2.0, divi=2, mod1=6, mul1=260, mx=2, plus=36, div1=2, v=36}
    {sub=17, mod=1, mul=270, sub1=17, min=1, avg=2.0, divi=2, mod1=7, mul1=270, mx=2, plus=37, div1=2, v=37}
    {sub=18, mod=0, mul=280, sub1=18, min=1, avg=2.0, divi=2, mod1=8, mul1=280, mx=2, plus=38, div1=2, v=38}
    {sub=19, mod=1, mul=290, sub1=19, min=1, avg=2.0, divi=2, mod1=9, mul1=290, mx=2, plus=39, div1=2, v=39}
    {sub=20, mod=0, mul=300, sub1=20, min=1, avg=2.0, divi=3, mod1=0, mul1=300, mx=2, plus=40, div1=3, v=40}
    {sub=21, mod=1, mul=310, sub1=21, min=1, avg=2.0, divi=3, mod1=1, mul1=310, mx=2, plus=41, div1=3, v=41}
    {sub=22, mod=0, mul=320, sub1=22, min=1, avg=2.0, divi=3, mod1=2, mul1=320, mx=2, plus=42, div1=3, v=42}
    {sub=23, mod=1, mul=330, sub1=23, min=1, avg=2.0, divi=3, mod1=3, mul1=330, mx=2, plus=43, div1=3, v=43}
    {sub=24, mod=0, mul=340, sub1=24, min=1, avg=2.0, divi=3, mod1=4, mul1=340, mx=2, plus=44, div1=3, v=44}
    {sub=25, mod=1, mul=350, sub1=25, min=1, avg=2.0, divi=3, mod1=5, mul1=350, mx=2, plus=45, div1=3, v=45}
    {sub=26, mod=0, mul=360, sub1=26, min=1, avg=2.0, divi=3, mod1=6, mul1=360, mx=2, plus=46, div1=3, v=46}
    {sub=27, mod=1, mul=370, sub1=27, min=1, avg=2.0, divi=3, mod1=7, mul1=370, mx=2, plus=47, div1=3, v=47}
    {sub=28, mod=0, mul=380, sub1=28, min=1, avg=2.0, divi=3, mod1=8, mul1=380, mx=2, plus=48, div1=3, v=48}
    {sub=29, mod=1, mul=390, sub1=29, min=1, avg=2.0, divi=3, mod1=9, mul1=390, mx=2, plus=49, div1=3, v=49}
    {sub=30, mod=0, mul=400, sub1=30, min=1, avg=2.0, divi=4, mod1=0, mul1=400, mx=2, plus=50, div1=4, v=50}
    {sub=31, mod=1, mul=410, sub1=31, min=1, avg=2.0, divi=4, mod1=1, mul1=410, mx=2, plus=51, div1=4, v=51}
    {sub=32, mod=0, mul=420, sub1=32, min=1, avg=2.0, divi=4, mod1=2, mul1=420, mx=2, plus=52, div1=4, v=52}
    {sub=33, mod=1, mul=430, sub1=33, min=1, avg=2.0, divi=4, mod1=3, mul1=430, mx=2, plus=53, div1=4, v=53}
    {sub=34, mod=0, mul=440, sub1=34, min=1, avg=2.0, divi=4, mod1=4, mul1=440, mx=2, plus=54, div1=4, v=54}
    {sub=35, mod=1, mul=450, sub1=35, min=1, avg=2.0, divi=4, mod1=5, mul1=450, mx=2, plus=55, div1=4, v=55}
    {sub=36, mod=0, mul=460, sub1=36, min=1, avg=2.0, divi=4, mod1=6, mul1=460, mx=2, plus=56, div1=4, v=56}
    {sub=37, mod=1, mul=470, sub1=37, min=1, avg=2.0, divi=4, mod1=7, mul1=470, mx=2, plus=57, div1=4, v=57}
    {sub=38, mod=0, mul=480, sub1=38, min=1, avg=2.0, divi=4, mod1=8, mul1=480, mx=2, plus=58, div1=4, v=58}
    {sub=39, mod=1, mul=490, sub1=39, min=1, avg=2.0, divi=4, mod1=9, mul1=490, mx=2, plus=59, div1=4, v=59}
    {sub=40, mod=0, mul=500, sub1=40, min=1, avg=2.0, divi=5, mod1=0, mul1=500, mx=2, plus=60, div1=5, v=60}
    {sub=41, mod=1, mul=510, sub1=41, min=1, avg=2.0, divi=5, mod1=1, mul1=510, mx=2, plus=61, div1=5, v=61}
    {sub=42, mod=0, mul=520, sub1=42, min=1, avg=2.0, divi=5, mod1=2, mul1=520, mx=2, plus=62, div1=5, v=62}
    {sub=43, mod=1, mul=530, sub1=43, min=1, avg=2.0, divi=5, mod1=3, mul1=530, mx=2, plus=63, div1=5, v=63}
    {sub=44, mod=0, mul=540, sub1=44, min=1, avg=2.0, divi=5, mod1=4, mul1=540, mx=2, plus=64, div1=5, v=64}
    {sub=45, mod=1, mul=550, sub1=45, min=1, avg=2.0, divi=5, mod1=5, mul1=550, mx=2, plus=65, div1=5, v=65}
    {sub=46, mod=0, mul=560, sub1=46, min=1, avg=2.0, divi=5, mod1=6, mul1=560, mx=2, plus=66, div1=5, v=66}
    {sub=47, mod=1, mul=570, sub1=47, min=1, avg=2.0, divi=5, mod1=7, mul1=570, mx=2, plus=67, div1=5, v=67}
    {sub=48, mod=0, mul=580, sub1=48, min=1, avg=2.0, divi=5, mod1=8, mul1=580, mx=2, plus=68, div1=5, v=68}
    {sub=49, mod=1, mul=590, sub1=49, min=1, avg=2.0, divi=5, mod1=9, mul1=590, mx=2, plus=69, div1=5, v=69}
    {sub=50, mod=0, mul=600, sub1=50, min=1, avg=2.0, divi=6, mod1=0, mul1=600, mx=2, plus=70, div1=6, v=70}
    {sub=51, mod=1, mul=610, sub1=51, min=1, avg=2.0, divi=6, mod1=1, mul1=610, mx=2, plus=71, div1=6, v=71}
    {sub=52, mod=0, mul=620, sub1=52, min=1, avg=2.0, divi=6, mod1=2, mul1=620, mx=2, plus=72, div1=6, v=72}
    {sub=53, mod=1, mul=630, sub1=53, min=1, avg=2.0, divi=6, mod1=3, mul1=630, mx=2, plus=73, div1=6, v=73}
    {sub=54, mod=0, mul=640, sub1=54, min=1, avg=2.0, divi=6, mod1=4, mul1=640, mx=2, plus=74, div1=6, v=74}
    {sub=55, mod=1, mul=650, sub1=55, min=1, avg=2.0, divi=6, mod1=5, mul1=650, mx=2, plus=75, div1=6, v=75}
    {sub=56, mod=0, mul=660, sub1=56, min=1, avg=2.0, divi=6, mod1=6, mul1=660, mx=2, plus=76, div1=6, v=76}
    {sub=57, mod=1, mul=670, sub1=57, min=1, avg=2.0, divi=6, mod1=7, mul1=670, mx=2, plus=77, div1=6, v=77}
    {sub=58, mod=0, mul=680, sub1=58, min=1, avg=2.0, divi=6, mod1=8, mul1=680, mx=2, plus=78, div1=6, v=78}
    {sub=59, mod=1, mul=690, sub1=59, min=1, avg=2.0, divi=6, mod1=9, mul1=690, mx=2, plus=79, div1=6, v=79}
    {sub=60, mod=0, mul=700, sub1=60, min=1, avg=2.0, divi=7, mod1=0, mul1=700, mx=2, plus=80, div1=7, v=80}
    {sub=61, mod=1, mul=710, sub1=61, min=1, avg=2.0, divi=7, mod1=1, mul1=710, mx=2, plus=81, div1=7, v=81}
    {sub=62, mod=0, mul=720, sub1=62, min=1, avg=2.0, divi=7, mod1=2, mul1=720, mx=2, plus=82, div1=7, v=82}
    {sub=63, mod=1, mul=730, sub1=63, min=1, avg=2.0, divi=7, mod1=3, mul1=730, mx=2, plus=83, div1=7, v=83}
    {sub=64, mod=0, mul=740, sub1=64, min=1, avg=2.0, divi=7, mod1=4, mul1=740, mx=2, plus=84, div1=7, v=84}
    {sub=65, mod=1, mul=750, sub1=65, min=1, avg=2.0, divi=7, mod1=5, mul1=750, mx=2, plus=85, div1=7, v=85}
    {sub=66, mod=0, mul=760, sub1=66, min=1, avg=2.0, divi=7, mod1=6, mul1=760, mx=2, plus=86, div1=7, v=86}
    {sub=67, mod=1, mul=770, sub1=67, min=1, avg=2.0, divi=7, mod1=7, mul1=770, mx=2, plus=87, div1=7, v=87}
    {sub=68, mod=0, mul=780, sub1=68, min=1, avg=2.0, divi=7, mod1=8, mul1=780, mx=2, plus=88, div1=7, v=88}
    {sub=69, mod=1, mul=790, sub1=69, min=1, avg=2.0, divi=7, mod1=9, mul1=790, mx=2, plus=89, div1=7, v=89}
    {sub=70, mod=0, mul=800, sub1=70, min=1, avg=2.0, divi=8, mod1=0, mul1=800, mx=2, plus=90, div1=8, v=90}
    {sub=71, mod=1, mul=810, sub1=71, min=1, avg=2.0, divi=8, mod1=1, mul1=810, mx=2, plus=91, div1=8, v=91}
    {sub=72, mod=0, mul=820, sub1=72, min=1, avg=2.0, divi=8, mod1=2, mul1=820, mx=2, plus=92, div1=8, v=92}
    {sub=73, mod=1, mul=830, sub1=73, min=1, avg=2.0, divi=8, mod1=3, mul1=830, mx=2, plus=93, div1=8, v=93}
    {sub=74, mod=0, mul=840, sub1=74, min=1, avg=2.0, divi=8, mod1=4, mul1=840, mx=2, plus=94, div1=8, v=94}
    {sub=75, mod=1, mul=850, sub1=75, min=1, avg=2.0, divi=8, mod1=5, mul1=850, mx=2, plus=95, div1=8, v=95}
    {sub=76, mod=0, mul=860, sub1=76, min=1, avg=2.0, divi=8, mod1=6, mul1=860, mx=2, plus=96, div1=8, v=96}
    {sub=77, mod=1, mul=870, sub1=77, min=1, avg=2.0, divi=8, mod1=7, mul1=870, mx=2, plus=97, div1=8, v=97}
    {sub=78, mod=0, mul=880, sub1=78, min=1, avg=2.0, divi=8, mod1=8, mul1=880, mx=2, plus=98, div1=8, v=98}
    {sub=79, mod=1, mul=890, sub1=79, min=1, avg=2.0, divi=8, mod1=9, mul1=890, mx=2, plus=99, div1=8, v=99}
    {sub=80, mod=0, mul=900, sub1=80, min=1, avg=2.0, divi=9, mod1=0, mul1=900, mx=2, plus=100, div1=9, v=100}
    {sub=81, mod=1, mul=910, sub1=81, min=1, avg=2.0, divi=9, mod1=1, mul1=910, mx=2, plus=101, div1=9, v=101}
    {sub=82, mod=0, mul=920, sub1=82, min=1, avg=2.0, divi=9, mod1=2, mul1=920, mx=2, plus=102, div1=9, v=102}
    {sub=83, mod=1, mul=930, sub1=83, min=1, avg=2.0, divi=9, mod1=3, mul1=930, mx=2, plus=103, div1=9, v=103}
    {sub=84, mod=0, mul=940, sub1=84, min=1, avg=2.0, divi=9, mod1=4, mul1=940, mx=2, plus=104, div1=9, v=104}
    {sub=85, mod=1, mul=950, sub1=85, min=1, avg=2.0, divi=9, mod1=5, mul1=950, mx=2, plus=105, div1=9, v=105}
    {sub=86, mod=0, mul=960, sub1=86, min=1, avg=2.0, divi=9, mod1=6, mul1=960, mx=2, plus=106, div1=9, v=106}
    {sub=87, mod=1, mul=970, sub1=87, min=1, avg=2.0, divi=9, mod1=7, mul1=970, mx=2, plus=107, div1=9, v=107}
    {sub=88, mod=0, mul=980, sub1=88, min=1, avg=2.0, divi=9, mod1=8, mul1=980, mx=2, plus=108, div1=9, v=108}
    {sub=89, mod=1, mul=990, sub1=89, min=1, avg=2.0, divi=9, mod1=9, mul1=990, mx=2, plus=109, div1=9, v=109}
    {total=5, v=0}
    {total=5, v=5}
    {total=1, v=10}
    {id=123, each2=1, each=1}
    {id=123, each2=2, each=1}
    {id=123, each2=3, each=1}
    {id=123, each2=1, each=2}
    {id=123, each2=2, each=2}
    {id=123, each2=3, each=2}
    {id=123, each2=1, each=3}
    {id=123, each2=2, each=3}
    {id=123, each2=3, each=3}
    {each2=1, each=1}
    {each2=2, each=1}
    {each2=3, each=1}
    {each2=1, each=2}
    {each2=2, each=2}
    {each2=3, each=2}
    {each2=1, each=3}
    {each2=2, each=3}
    {each2=3, each=3}
    {each2=1, each=1}
    {total=0.0}
    {total=1.5}
    {total=3.5}
    {total=5.5}
    {total=7.5}
    {total=9.0}
    21:08:28.376 [main] WARN org.jetlinks.reactor.ql.supports.DefaultPropertyFeature - get property [name] from 1 error java.lang.NoSuchMethodException: Unknown property 'name' on class 'class java.lang.Integer'
    {a=b}
    {deviceId=dev-2, total=2, productId=prod-1}
    {deviceId=dev-3, total=2, productId=prod-1}
    {deviceId=dev-0, total=2, productId=prod-0}
    {deviceId=dev-1, total=2, productId=prod-0}
    {deviceId=dev-4, total=2, productId=prod-2}
    {v=4}
    {v=9}
    {v=10}
    {v=4}
    {v=9}
    {v=10}
    {sum=1.0}
    {isIn=true}
    {isIn=true}
    {isIn=false}
    {isIn=true}
    {isIn=false}
    {isIn=true}
    {isIn=true}
    {isIn=true}
    {isIn=true}
    {isIn=true}
    {isIn=true}
    {isIn=true}
    {isIn=false}
    {isIn=false}
    {isIn=true}
    {t=7}
    {t=7}
    {t2.name=t2, t1.name=t1, t1.v=0, t2.v=0}
    {t2.name=t2, t1.name=t1, t1.v=1, t2.v=1}
    {this=1}
    {this=2}
    {this=3}
    {this=4}
    {this=5}
    {this=6}
    {this=7}
    select collect_row(name,val) $this from (
    select val,
    case
    when val<10 then '<10ms'
    when range(val,10,100) then '10ms-100ms'
    when val>100 then '>100ms'
    else '>100ms'
    end name
    from dual group by _window(10)
    ) t
    {10ms-100ms=99, >100ms=129, <10ms=9}
    {max=3}
    {t3.t1.v1=1, t3.t2.v2=1}
    {t3.t1.v1=2, t3.t2.v2=1}
    {t3.t1.v1=2, t3.t2.v2=2}
    {t3.t1.v1=3, t3.t2.v2=2}
    {t3.t1.v1=4, t3.t2.v2=2}
    {v=0}
    {v=1}
    {v=5}
    {v=6}
    {v=10}
    {type=1, total=10}
    {_group_by_key=[0], total=0.5}
    {_group_by_key=[1], total=2.5}
    {_group_by_key=[2], total=4.5}
    {_group_by_key=[3], total=6.5}
    {_group_by_key=[4], total=8.5}
    {this=1}
    {this=2}
    {this=3}
    {this=4}
    {this=5}
    {this=6}
    {this=7}
    java.lang.ArithmeticException: / by zero: null
    java.lang.ArithmeticException: / by zero: null
    java.lang.ArithmeticException: / by zero: null
    {this=1}
    {this=2}
    {this=3}
    {this=4}
    {this=5}
    {this=6}
    {this=7}
    {total=0}
    {total=0}
    {total=1}
    {total=0}
    {total=1}
    {row=[{val=1}, {val=2}, {val=3}, {val=4}, {val=5}, {val=6}, {val=7}, {val=8}, {val=9}, {val=10}, {val=11}, {val=12}, {val=13}, {val=14}, {val=15}, {val=16}, {val=17}, {val=18}, {val=19}, {val=20}]}
    {total=0.5}
    {total=2.5}
    {total=4.5}
    {total=6.5}
    {total=8.5}

{elapsed=0, rownum=1}
{elapsed=1, rownum=2}
{elapsed=0, rownum=3}
{elapsed=0, rownum=4}
{elapsed=0, rownum=5}
{a=b}
{v=1}
{v=2}
{v=6}
{v=7}
{v=10}
{v=1}
{v=2}
{v=6}
{v=7}
{v=10}
{t=5}
PT0.402144S
{t=1000000}
PT1.291514S
{avg=10.5, g=0, v=21.0}
{avg=12.5, g=1, v=25.0}
{avg=14.5, g=2, v=29.0}
{avg=16.5, g=3, v=33.0}
{avg=18.5, g=4, v=37.0}
{sum=6.0}
select
val,
if(val<1,1,0) lt1ms,
if(val between 1 and 10,1,0) gt1ms,
if(val>=10,1,0) gt10ms
from dual
{gt10ms=0, val=1, lt1ms=0, gt1ms=1}
{gt10ms=0, val=2, lt1ms=0, gt1ms=1}
{gt10ms=0, val=3, lt1ms=0, gt1ms=1}
{gt10ms=0, val=4, lt1ms=0, gt1ms=1}
{gt10ms=0, val=5, lt1ms=0, gt1ms=1}
{gt10ms=0, val=6, lt1ms=0, gt1ms=1}
{gt10ms=0, val=7, lt1ms=0, gt1ms=1}
{gt10ms=0, val=8, lt1ms=0, gt1ms=1}
{gt10ms=0, val=9, lt1ms=0, gt1ms=1}
{gt10ms=1, val=10, lt1ms=0, gt1ms=1}
{gt10ms=1, val=11, lt1ms=0, gt1ms=0}
{gt10ms=1, val=12, lt1ms=0, gt1ms=0}
{gt10ms=1, val=13, lt1ms=0, gt1ms=0}
{gt10ms=1, val=14, lt1ms=0, gt1ms=0}
{gt10ms=1, val=15, lt1ms=0, gt1ms=0}
{gt10ms=1, val=16, lt1ms=0, gt1ms=0}
{gt10ms=1, val=17, lt1ms=0, gt1ms=0}
{gt10ms=1, val=18, lt1ms=0, gt1ms=0}
{gt10ms=1, val=19, lt1ms=0, gt1ms=0}
{gt10ms=1, val=20, lt1ms=0, gt1ms=0}
{t2.name=t2, t1.name=t1, t1.v=0, t2.v=0}
{t2.name=t2, t1.name=t1, t1.v=1, t2.v=1}
[INFO] Tests run: 97, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 22.297 s - in org.jetlinks.reactor.ql.ReactorQLTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 173, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO]
[INFO] --- jacoco:0.8.7:report (report) @ reactor-ql ---
[INFO] Loading execution data file /Volumes/BigSur 1/Users/zhouhao/IdeaProjects/reactor-ql/target/jacoco.exec
[INFO] Analyzed bundle 'JetLinks' with 75 classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 32.726 s
[INFO] Finished at: 2026-04-15T21:08:37+08:00
[INFO] ------------------------------------------------------------------------

  • 结果:173 passed, 0 failed, 0 skipped
  • 覆盖率:instruction 92.04%, branch 79.52%, line 92.69%

@zhou-hao

Copy link
Copy Markdown
Member Author

已补充本轮收尾改动:

  • 将项目版本提升为 1.1.0,作为本次 JSqlParser 5.3 / Java 11 破坏性升级的版本边界
  • 同步 GitHub Actions 到 JDK 11,并升级 actions/checkout、actions/setup-java、codecov-action
  • 清理 Codacy 关注的 Document empty method body 类问题,统一通过 ignore(...) no-op 处理默认 visitor 分支
  • CastUtils 的空 catch 已补充显式说明

验证结果:

  • 命令:JAVA_HOME=$(/usr/libexec/java_home -v 11) mvn test
  • 结果:173 passed, 0 failed, 0 skipped
  • 覆盖率:instruction 92.04%, branch 79.52%, line 92.69%

@zhou-hao
zhou-hao force-pushed the jsqlparser-5-3-upgrade branch from 3447ff5 to 83328d7 Compare April 15, 2026 13:10
@codecov

codecov Bot commented Apr 15, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 58.94737% with 78 lines in your changes missing coverage. Please review.
✅ Project coverage is 86.36%. Comparing base (d68bf1d) to head (cd55c3e).

Files with missing lines Patch % Lines
...java/org/jetlinks/reactor/ql/DefaultReactorQL.java 48.38% 14 Missing and 2 partials ⚠️
...ks/reactor/ql/supports/from/FromValuesFeature.java 53.57% 7 Missing and 6 partials ⚠️
...ks/reactor/ql/supports/map/PropertyMapFeature.java 60.60% 6 Missing and 7 partials ⚠️
...a/org/jetlinks/reactor/ql/feature/FromFeature.java 61.53% 7 Missing and 3 partials ⚠️
...r/ql/supports/distinct/DefaultDistinctFeature.java 50.00% 7 Missing and 1 partial ⚠️
.../jetlinks/reactor/ql/supports/filter/InFilter.java 27.27% 6 Missing and 2 partials ⚠️
.../reactor/ql/supports/DefaultReactorQLMetadata.java 80.00% 2 Missing and 2 partials ⚠️
...g/jetlinks/reactor/ql/feature/ValueMapFeature.java 66.66% 0 Missing and 2 partials ⚠️
...actor/ql/supports/agg/CollectRowAggMapFeature.java 0.00% 0 Missing and 1 partial ⚠️
.../reactor/ql/supports/filter/IfValueMapFeature.java 0.00% 0 Missing and 1 partial ⚠️
... and 2 more
Additional details and impacted files
@@             Coverage Diff              @@
##             master      #30      +/-   ##
============================================
- Coverage     86.96%   86.36%   -0.60%     
- Complexity      962     1011      +49     
============================================
  Files            63       63              
  Lines          2586     2663      +77     
  Branches        360      387      +27     
============================================
+ Hits           2249     2300      +51     
- Misses          172      196      +24     
- Partials        165      167       +2     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@zhou-hao
zhou-hao changed the base branch from master to 1.1 April 16, 2026 09:31
@zhou-hao
zhou-hao merged commit 02ab6f2 into 1.1 Apr 16, 2026
1 check failed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant