lealone / Lealone

比 MySQL 和 MongoDB 快10倍的 OLTP 关系数据库和文档数据库
Other
2.44k stars 513 forks source link

Lealone如何创建自定义函数 #176

Closed ContyChen closed 1 year ago

ContyChen commented 1 year ago

如何在lealone数据库中创建自定义函数? 之前好像在微博讲过,现在找不到了,麻烦能给一个示例吗?

codefollower commented 1 year ago

lealone 可用的 sql 语句都在这里: http://lealone.org/grammar.html

这个是创建自定义函数的语句: CREATE ALIAS

CREATE ALIAS MY_SQRT FOR "java.lang.Math.sqrt"; 指向一个静态的 java 方法即可。

创建聚合函数复杂一点,用 CREATE AGGREGATE

先实现 org.lealone.db.api.Aggregate 接口

    package my.aggregate;

    public  class Median implements org.lealone.db.api.Aggregate {

        private final ArrayList<String> list = new ArrayList<>();

        @Override
        public void add(Object value) {
            list.add(value.toString());
        }

        @Override
        public Object getResult() {
            return list.get(list.size() / 2);
        }

        @Override
        public int getInternalType(int[] inputType) {
            return Value.STRING;
        }

        @Override
        public void init(Connection conn) {
            // nothing to do
        }
    }

然后用 CREATE AGGREGATE median FOR "my.aggregate.Median" 最后使用自定义的聚合函数: select median(xxx) from yyy

codefollower commented 1 year ago

用 java 实现的普通函数和聚合函数打成 jar 包后,放到 LEALONE_HOME/lib 目录 或者直接命令行启动 java -cp lealone.jar;my.jar org.lealone.main.Lealone

ContyChen commented 1 year ago

好的,感谢,我试一下

ContyChen commented 1 year ago

在函数中访问表的数据用JDBC吗?还是有其他好的实现方式

codefollower commented 1 year ago

在函数中访问表的数据用JDBC吗?还是有其他好的实现方式

如果不想关心 lealone 的内部实现,只能用 JDBC 这种标准的接口。

lealone 的内部实现有一个数据库对象模型,一般是通过 LealoneDatabase.findDatabase 找到一个 Database 实例,然后用它能找到 Schema、Table、Index。只是这些都是内部实现,如果应用想在函数中直接使用这些类,lealone 是不保证在新的版本中保持 api 兼容的。

codefollower commented 1 year ago

在函数中访问表的数据用JDBC吗?还是有其他好的实现方式

还有一个更简单的办法就是直接用 lealone orm 框架,也是用嵌入式的方式直接访问表。