javascript - Pentaho Javascript - 行操作

标签 javascript pentaho pentaho-data-integration

我正在尝试在旧版本的 pentaho 4.4 中使用 javascript 操作一行)并得到一些我无法解释/不明白 Pentaho 在做什么的奇怪结果

var test = 'field';
Alert (this[test]); //--> Undefined
Alert (this['field']); // --> Expected result
Alert (this[test]); //--> Expected Result

出于某种原因,在我使用文字字符串引用之前,对 this[test] 的初始请求是未定义的,因此无法动态驱动进程(即我无法通过引用访问行信息).

关于为什么的任何想法?仅仅是 Pentaho 处理变量的方式吗?实际上,我希望我的最终结果允许我更改任何给定位置的行值。要么:

row[test] = 'New value

this[test] = 'New Value

this[test].setValue('New Value');

但是,如果不替换值使其成为一个非常静态的过程,以上都不起作用。

最佳答案

据我所知,Kettle 不会将字段添加到脚本的范围,除非该字段作为子字符串包含在脚本源代码中(即使注释中提到的字段也应该添加)。请参阅 determineUsedFields()addValues() 方法 ( https://github.com/pentaho/pentaho-kettle/blob/4.4.0/src/org/pentaho/di/trans/steps/scriptvalues_mod/ScriptValuesMod.java#L106 )。

因此,您提供的确切脚本实际上会生成三个已定义值或三个未定义值,具体取决于该字段是否存在。只有在我从代码中完全删除带有字段名称的字符串,并在另一个字段中传递字段名称后,我才能重现您的问题。

因此,操作行值的一种方法可能是在脚本中提及所有字段名称(例如在评论中),然后尝试使用您尝试过的 setValue(似乎仅在兼容模式下工作)。

另一种可能的方法是使用 row 数组变量获取值,使用 getInputRowMeta().indexOfValue(fieldName) 获取字段的索引,例如:

var idx = getInputRowMeta().indexOfValue(fieldName)
// WARNING: you may assign value of any type this way
// and the value will not be converted to a type defined
// in the field's ValueMeta:
row[idx] = 'New value'

但是,这种方法绕过了类型转换,类型转换通常在 getValueFromJScript() 方法中的 JS 步骤之外传递 JavaScript 值时执行。

例如,以下代码将在输出中放入无效值,您甚至可能不会注意到它,直到后续步骤以某种不正确的方式处理该值:

// Let's assume that fieldName is name of the 0th input field.
// I'd expect, that the value would remain the same
// but in fact the `fieldName` references some wrapper oject
// which looks similar to its value
// but has a different type
row[0] = fieldName;

在后续的 JS 步骤中:

for(var i = 0; i < row.length; i++) {
    Alert(row[i]) // alerts same value as the input, e.g. 'test'
    Alert(row[i].class) // alerts undefined. While expected is 'java.lang.String'
    // Some other subsequent steps may crash once this value encountered
}

关于javascript - Pentaho Javascript - 行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44190760/

相关文章:

javascript - 使用 Selenium IDE 调用 JavaScript 文件中的函数

javascript - react 编辑表单创建

javascript - jQuery Clean up 或更好的方法

pentaho - Kettle - 两个 csv 输入到 PostgreSQL 输出

pentaho - mysql 存储库如何在 Pentaho 用户控制台中工作?

java - macOS 10.15.4 中 Pentaho Data Integration 安装问题

pentaho - 合并行(diff)是逐行比较,而不是一行与其他表的整行比较

javascript - 使用未托管在 Google 服务器上的图像嵌入 Google PhotoSphere (gapi.panoembed)

javascript - 使用 Pentaho/JavaScript 制作带条件的标志

mysql - Pentaho 将唯一记录导入数据库