将聚合函数添加到外部H2数据库
我试图在我的H2数据库中使用Java创建一个聚合函数。 该函数应该从给定的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
当作为外部进程运行H2服务器时,可以使用java -cp <dir> ...
将这些类添加到类路径中。
使用h2.sh
或h2.bat
启动H2服务器时,可以将该目录添加到环境变量%H2DRIVERS%
或%CLASSPATH%
。
上一篇: Adding aggregate function to external H2 database
下一篇: Curious inconsistent behaviour from SQL Server in windowed function clauses?