0

在 WSO2 CEP 3.0.0 中。我在双重类型的属性中遇到了一些令人困惑的行为。

假设以下 siddhi 脚本:

define stream LongStream LongAttr1 long, LongAttr2 long;
define stream DoubleStream DoubleAttr1 double;

from LongStream
select (LongAttr1/LongAttr2) as DoubleAttr1
insert into DoubleStream;

from DoubleStream[DoubleAttr1 > 0.75]
...

在这个脚本中,在 DoubleStream 中插入 DoubleAttr1 是有效的,可以很好地给出一个带小数的浮点值。但是之后的过滤器引发了一个强制转换异常。

ERROR - {QuerySelector}  Input event attribute type java.lang.Double cannot be cast to java.lang.Long type defined in the stream definition!
java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Long at org.wso2.siddhi.core.executor.conditon.compare.greater_than_equal.GreaterThanEqualCompareConditionExecutorLongDouble.process(GreaterThanEqualCompareConditionExecutorLongDouble.java:34)

这很令人困惑,似乎 DoubleAttr1 被认为是长的?

如果我将 DoubleAttr1 计算为:

convert(LongAttr1/LongAttr2, double)
or
(LongAttr1 * 100.0) / (LongAttr2 * 100.0)

不再引发异常。我发现这种行为非常令人困惑,我认为应该在以后的版本中防止或纠正它。你有什么意见?

溴,

埃里克

PS:我也遇到了转换函数的一些舍入错误:如果 LongAttr1 = 2 和 LongAttr2 = 2,转换 (LogAttr1 / LongAttr2 *100) 给出 99.0 作为结果

4

1 回答 1

0

我这周才刚刚开始研究 siddhi,所以我不是专家,但我遇到了类似的问题。我试图将代表秒的 long 除以 60 以获得分钟,我得到了类似的异常。

我通过除以 60.0 来解决这个问题。看起来是因为我将 long 除以一个整数,它正在将结果评估为 long 并在尝试转换为我的流定义时导致异常。

它可能与此处讨论过的问题相同

意外结果导致长/整数除法

于 2014-11-07T11:35:52.723 回答