0

我对一些内置原语有疑问。是否可以为 DateTime 类型使用内置插件:差异、最小值、最大值、总和,或者为此目的创建自定义内置插件更好?它们适用于整数和浮点数,但似乎不适用于 DateTime 类型(或者我使用的语法可能是错误的)。

4

1 回答 1

0

您的语法不正确。首先,我们可以跳转到Builtin's javadoc 以识别Builtins 存在什么。

选择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.0LessThan#bodyCall(Node[], int, RuleContext),我们可以跟踪它的使用行为,Util该行为对日期/时间对象很敏感。

如果您有一个用于max(?a ?b ?c)将最大值绑定到的规则?c,您有时可以(如果您的规则具有良好的对称性)lessThan(?a ?b)仅用于限制规则被绑定的方式(从而获得相同的结果)。在这种lessThan情况下,规则的其余部分可以继续假设这?b是更大的价值,一直。同样,这要求您的规则具有良好的对称性,在其他地方允许绑定?a?b没有其他约束。

Max如果您需要可以使用文字的等价物XSDDateTime,那么您实际上可能必须自己制作一些。值得庆幸的是,正如这些Builtins 的代码所示,创建它们实际上非常容易。

从更哲学的角度来看,我不确定这是开发人员有意识的决定,还是可能是一个小小的疏忽。我想使用的比较实用程序 ( Util)LessThan实际上可能比Max内置函数更新,因此Max没有根据它实现。

于 2014-04-25T00:58:46.210 回答