使用表达式语言的 apache nifi 中的布尔条件评估没有意义

Boolean condition evaluation in apache nifi using expression language doesnt make sense

我是 apache nifi 表达式语言的新手。我需要根据该验证流文件属性值和路由。

这是我的要求。

更新: 详细要求:

{
    "REC_YEAR": 2020,
    "DESCRIPTION": "test",
    "CURRENCY_CD": "USD",
    "CALCULATED_FLAG": "N",
    "CUR_IND": "Y",
    "START_DT": "2020-12-19 17:33:35",
    "END_DT": "9999-12-31 00:00:00"
}

输入数据: 现在,当我在 json 中将输入数据作为空字符串提供时,我希望它是 TRUE。但它总是以 FALSE 结束。我在这里做错了什么?

输入样本#1

{
    "CURRENCY_CD": ""
}

输入样本#2

{
    "CURRENCY_CD": null
}

对于这些值中的任何一个,空字符串或 null,nifi 将具有值的相应属性标记为“空字符串集”。

如果我尝试将此逻辑分解为多个属性以分别检查表达式布尔条件,它的计算结果是正确的。将它们组合起来的 Or() 条件是我期望为真的地方,但它的计算结果为假。

然后,我也尝试这样使用,

${
    ${Is-CURRENCY_CD-Empty:equals(true)}
    :or(${Is-CURRENCY_CD-NotEmptyAndLen3:equals(true)})
}

并将其存储在属性“Is_CurrencyCode_Valid”中并期望它为真,但反过来,它带有假。

有点难以理解您的 post - 可以更清楚一点。

RouteOnAttribute takes one or more Dynamic Properties with some Expression Language 必须评估为 True 或 False。

如果动态 属性 的表达式语言计算结果为 True,则 FlowFile 被定向到与动态 属性.

名称的关系

如果 Dynamic 属性 的表达式语言评估为 False,它将尝试下一个 Dynamic 属性(如果有的话)- 如果没有更多的 Dynamic Properties,并且所有returned False,然后将 FlowFile 发送到 unmatched 关系。

如果您的数据 总是 null/empty(负)或包含 3 个字符(正),则无需检查这两种情况 - 只需检查负面或正面条件。

例如

一个动态 属性 调用了 valid,表达式为 ${CURRENCY_CD:length():equals(3)}

使用此配置,CURRENCY_CD 具有 3 个字符的所有 FlowFiles 将被路由到 valid 关系。所有 有 3 个字符的 FlowFiles,包括 null/empty,将被路由到 unmatched 关系。

这样,将发生以下情况:

CURRENCY_CD = TRI 转到 valid

CURRENCY_CD = null 转到 unmatched

CURRENCY_CD = testing 转到 unmatched(我们在这里假设这不会出现在您的数据中)

如果您不能保证并且某些数据可能不属于这 2 个条件,您可以添加第二个名为 empty 的动态 属性,表达式 ${CURRENCY_CD:isEmpty()}。这会将所有 null/empty FlowFiles 路由到关系 empty.

这样,将发生以下情况:

CURRENCY_CD = TRI 转到 valid

CURRENCY_CD = null 转到 empty

CURRENCY_CD = testing 转到 unmatched

很难从你的 post 看出,但如果 empty/null 和 3 个字符都是肯定条件,并且你想在一个表达式中验证这两个,那么你可以将你的表达式简化为:

${CURRENCY_CD:isEmpty():or(${CURRENCY_CD:length():equals(3)})}

return 对 empty/null 或 3 个字符都为真,并将它们转发到相同的关系。

这样,将发生以下情况:

CURRENCY_CD = TRI 转到 valid

CURRENCY_CD = null 转到 valid

CURRENCY_CD = testing 转到 unmatched