Files
fantaibao-qlexpress4/docs/custom-item-source.adoc
small-red-hat 2dfed7464e
Some checks failed
Reduce Adoc / reduce (push) Failing after 57s
Java Unit Test with Maven / test (push) Failing after 1m42s
first
2025-12-29 13:59:13 +08:00

153 lines
4.1 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

:toc:
= 自定义语法元素
本节系统梳理在 QLExpress4 在自定义语法元素方面的接口和能力。
== 总览
* 自定义函数
** 实现CustomFunction接口
** 使用 Java 函数式接口
** 通过注解扫描注册
** 通过QLExpress脚本添加
** 实现QLFunctionalVarargs
* 自定义操作符
** 实现CustomBinaryOperator
** 替换内置操作符
** 使用 Java 函数式接口
** 添加别名
** 实现QLFunctionalVarargs
* 扩展函数
** 继承ExtensionFunction
** 实现QLFunctionalVarargs
* 操作符与函数别名
== 自定义函数
=== 实现CustomFunction接口
[source,java,indent=0]
----
include::../src/test/java/com/alibaba/qlexpress4/test/function/HelloFunction.java[]
----
[source,java,indent=0]
----
include::../src/test/java/com/alibaba/qlexpress4/Express4RunnerTest.java[tag=customComplexFunction]
----
=== 使用 Java 函数式接口
[source,java,indent=0]
----
include::../src/test/java/com/alibaba/qlexpress4/docs/CustomItemsDocTest.java[tag=addFunctionWithJavaFunctional]
----
=== 注解方式注册
[source,java,indent=0]
----
include::../src/test/java/com/alibaba/qlexpress4/Express4RunnerTest.java[tag=annoObj]
----
[source,java,indent=0]
----
include::../src/test/java/com/alibaba/qlexpress4/Express4RunnerTest.java[tag=addFunctionByAnnotationObject]
----
=== 通过QLExpress脚本添加
[source,java,indent=0]
----
include::../src/test/java/com/alibaba/qlexpress4/docs/CustomItemsDocTest.java[tag=joinFunctionVarargsObj]
----
=== 实现QLFunctionalVarargs
[source,java,indent=0]
----
include::../src/test/java/com/alibaba/qlexpress4/docs/CustomItemsDocTest.java[tag=addFunctionByVarargs]
----
[source,java,indent=0]
----
include::../src/test/java/com/alibaba/qlexpress4/docs/CustomItemsDocTest.java[tag=addFunctionByVarargs]
----
== 自定义操作符
=== 实现CustomBinaryOperator并设置优先级
[source,java,indent=0]
----
include::../src/test/java/com/alibaba/qlexpress4/docs/CustomItemsDocTest.java[tag=addOperatorWithPrecedence]
----
=== 替换内置操作符
[source,java,indent=0]
----
include::../src/test/java/com/alibaba/qlexpress4/docs/CustomItemsDocTest.java[tag=replaceDefaultOperator]
----
=== 使用 Java 函数式接口
[source,java,indent=0]
----
include::../src/test/java/com/alibaba/qlexpress4/docs/CustomItemsDocTest.java[tag=addOperatorBiFunction]
----
=== 实现QLFunctionalVarargs
[source,java,indent=0]
----
include::../src/test/java/com/alibaba/qlexpress4/docs/CustomItemsDocTest.java[tag=addOperatorByVarargs]
----
== 扩展函数
=== 继承ExtensionFunction
[source,java,indent=0]
----
include::../src/test/java/com/alibaba/qlexpress4/Express4RunnerTest.java[tag=defineExtensionFunctionByExtensionFunction]
----
=== 实现QLFunctionalVarargs
[source,java,indent=0]
----
include::../src/test/java/com/alibaba/qlexpress4/Express4RunnerTest.java[tag=defineExtensionFunctionByQLFunctionalVarargs]
----
== QLFunctionalVarargs一个对象同时定义三类操作
同一个QLFunctionalVarargs对象可同时用作函数、操作符与扩展函数的实现便于在多处复用统一的语义与实现。该能力来源于接口的可变参数设计详见下方示例与接口定义。背景讨论参考 link:https://github.com/alibaba/QLExpress/issues/407[issue407]
[source,java,indent=0]
----
include::../src/test/java/com/alibaba/qlexpress4/docs/CustomItemsDocTest.java[tag=qlfunctionalvarargsAllInOne]
----
=== 接口定义
[source,java,indent=0]
----
include::../src/main/java/com/alibaba/qlexpress4/api/QLFunctionalVarargs.java[]
----
== 操作符与函数别名(亦支持关键字别名)
[source,java,indent=0]
----
include::../src/test/java/com/alibaba/qlexpress4/Express4RunnerTest.java[tag=addAlias]
----
== 说明与建议
- QLFunctionalVarargs 的定义模式下,扩展函数调用时实参列表首位是接收者对象,其后为调用参数;函数与操作符不含接收者。
- 自定义操作符的优先级需根据表达式期望进行设置,避免与已有运算规则产生混淆。
- 注解方式注册仅会处理公开方法,且重复名称将注册失败;批量注册返回结果中包含成功与失败清单。