向外部H2数据库添加聚合函数

2019年11月6日 60点热度 0条评论

我正在尝试使用Java在我的H2数据库中创建聚合函数。
该函数应从给定的Double列返回自定义中位数计算。
该计算包括仅使用通过max_variance int值与平均值足够接近的值。为此,我创建了一个类:

package custommedian;

public class CustomMedian implements org.h2.api.AggregateFunction{
    final int max_variance = 7;
    java.util.LinkedList<Double> values = new java.util.LinkedList<Double>();

    @Override
    public void init(java.sql.Connection cnctn) throws java.sql.SQLException {
        // I ignored this
    }

    @Override
    public int getType(int[] ints) throws java.sql.SQLException {
       return java.sql.Types.DOUBLE;
    }

    @Override
    public void add(Object o) throws java.sql.SQLException {
        values.add((Double)o);
    }

    @Override
    public Object getResult() throws java.sql.SQLException {
        double average = 0;
        java.util.Iterator<Double> i;
        java.util.LinkedList<Double> properValues = new java.util.LinkedList<Double>();

        // Get average value
        for( i = values.iterator(); i.hasNext(); ) {
            average += i.next();    
        }
        average = average / values.size();

        // Filter out invalid values
        for( i = values.iterator(); i.hasNext(); ) {
            double value = i.next();
            if (value - max_variance < average && value + max_variance > average){
                properValues.add(value);
            }
        }

        // Sort list
        java.util.Collections.sort(properValues);

        // Return median
        int size = properValues.size();
        if (size > 0){
            int pos = ((int) size/2);
            // Odd size
            if ((size%2) == 1 ) return properValues.get(pos);
            // Even size
            else return ( properValues.get(pos-1) + properValues.get(pos) ) / 2;
        }
        else 
            return null;
    }
}

现在,我应该对其进行编译,以便数据库可以访问它并使用以下命令:

CREATE AGGREGATE MEDIAN FOR "custommedian.CustomMedian";

我应该怎么做?

我尝试将.jar文件与数据库文件放在同一文件夹中,但似乎找不到该类:

Class "custommedian.CustomMedian" not found; SQL statement:

任何人都可以告诉我,要做这项工作还需要做什么?

在此先多谢!

编辑:

解决了:

正如Lukas所建议的,我最终将H2 jar嵌入到我的应用程序中,这样就没有类路径问题。

解决方案如下:

您是否已将类添加到H2数据库进程的类路径中?即启动H2数据库时?

实现此目的的另一种方法是派生H2并构建它,包括您的自定义聚合函数。或者只是将您的.class文件放入H2 jar文件中,这取决于您必须更新自己的代码的频率,这也可以。那么它肯定会在类路径上...

在最坏的情况下,H2用户组非常活跃:

http://groups.google.com/group/h2-database