我对一些内置原语有疑问。是否可以为 DateTime 类型使用内置插件:差异、最小值、最大值、总和,或者为此目的创建自定义内置插件更好?它们适用于整数和浮点数,但似乎不适用于 DateTime 类型(或者我使用的语法可能是错误的)。
1 回答
您的语法不正确。首先,我们可以跳转到Builtin
's javadoc 以识别Builtin
s 存在什么。
选择Max
,根据您的提及,我们可以继续在 GrepCode 上查找它的完全限定类名。一旦我们到达那里,我们注意到它实现的 parimary 方法是bodyCall(Node[], int, RuleContext)
,所以让我们看一下它的实现(截至2.11.0
),看看它为什么会这样:
@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
.
请注意,如果我们查看 的实现(截至2.11.0
)LessThan#bodyCall(Node[], int, RuleContext)
,我们可以跟踪它的使用行为,Util
该行为对日期/时间对象很敏感。
如果您有一个用于max(?a ?b ?c)
将最大值绑定到的规则?c
,您有时可以(如果您的规则具有良好的对称性)lessThan(?a ?b)
仅用于限制规则被绑定的方式(从而获得相同的结果)。在这种lessThan
情况下,规则的其余部分可以继续假设这?b
是更大的价值,一直。同样,这要求您的规则具有良好的对称性,在其他地方允许绑定?a
和?b
没有其他约束。
Max
如果您需要可以使用文字的等价物XSDDateTime
,那么您实际上可能必须自己制作一些。值得庆幸的是,正如这些Builtin
s 的代码所示,创建它们实际上非常容易。
从更哲学的角度来看,我不确定这是开发人员有意识的决定,还是可能是一个小小的疏忽。我想使用的比较实用程序 ( Util
)LessThan
实际上可能比Max
内置函数更新,因此Max
没有根据它实现。