我对一些内置基元有疑问。是否可以使用内置函数:差异,最小值,最大值,总和也适用于DateTime类型,或者为此目的创建自定义内置函数更好? 它们使用整数和浮点数工作正常,但似乎不适用于DateTime类型(或者我使用的语法可能不对)。
答案 0 :(得分:0)
您的语法不正确。首先,我们可以跳转到Builtin
的javadoc,以确定Builtin
的存在。
根据您的提及选择Max
,我们可以继续在GrepCode上查找它的完全限定类名。一旦我们到达那里,我们注意到它实现的parimary方法是bodyCall(Node[], int, RuleContext)
,所以让我们来看看它的实现(从2.11.0
开始)并看看为什么它和&#{}} #39; s的行为方式如下:
@Override
public boolean bodyCall(Node[] args, int length, RuleContext context) {
checkArgs(length, context);
BindingEnvironment env = context.getEnv();
Node n1 = getArg(0, args, context);
Node n2 = getArg(1, args, context);
if (n1.isLiteral() && n2.isLiteral()) {
Object v1 = n1.getLiteralValue();
Object v2 = n2.getLiteralValue();
Node res = null;
if (v1 instanceof Number && v2 instanceof Number) {
Number nv1 = (Number)v1;
Number nv2 = (Number)v2;
if (v1 instanceof Float || v1 instanceof Double
|| v2 instanceof Float || v2 instanceof Double) {
res = (nv1.doubleValue() > nv2.doubleValue()) ? n1 : n2;
} else {
res = (nv1.longValue() > nv2.longValue()) ? n1 : n2;
}
return env.bind(args[2], res);
}
}
// Doesn't (yet) handle partially bound cases
return false;
}
这里要注意的重要一点是,如果一个实例是java.lang.Number
的衍生物,该方法将仅绑定一个值。
请注意,如果我们查看LessThan#bodyCall(Node[], int, RuleContext)
的实施(截至2.11.0
),我们就可以追踪其使用所在的Util
的行为/ em>对日期/时间对象敏感。
如果您的规则使用max(?a ?b ?c)
将最大值绑定到?c
,您有时可以(如果您的规则具有良好的对称性)使用lessThan(?a ?b)
来限制规则受到约束(因此,实现相同的结果)。在lessThan
的情况下,规则的其余部分可以继续,假设?b
一直是更大的值。同样,这要求您的规则具有良好的对称性,在其他地方,允许绑定?a
和?b
而不受其他约束。
如果您需要等效的Max
可以使用XSDDateTime
文字,那么您确实可能需要自己制作一些文字。值得庆幸的是,正如这些Builtin
的代码所示,创建它们实际上非常容易。
在一个更哲学的说明中,我不确定这是否是开发人员有意识的决定,或者是否是一个小的疏忽。我认为Util
使用的比较实用程序(LessThan
)实际上可能比Max
内置项更新,因此Max
并未实现。{{1}}。