如何使用 MDriven OclPs 查找匹配字符串列表的所有对象?

How to use MDriven OclPs to find all objects matching a list of strings?

在一个应用程序中,我收到了一个字符串列表。然后我想使用 OclPs 查找特定属性等于列表中任何字符串的所有对象。例如。如果我们有 Person 对象并收到姓氏列表,请查找姓氏出现在列表中的所有人。

虽然这肯定可以在 MDriven 的内存 OCL 引擎中完成,但我似乎无法在更有限的 OclPs 中实现这一点(它将 OCL 转换为 SQL 并在数据库)。

尝试 1:首先将名称列表分配给 vNames(字符串集合),然后:

Person.allInstances->select(p|vNames->exists(n|n = p.LastName))

这给出了错误“循环变量只能有 class 类型,不能有 System.String”。

尝试 2:首先将搜索名称的 "|" 分隔字符串(包括前导和尾随 "|")分配给 vNames,然后:

Person.allInstances->select(p|vNames.SqlLike('%|' + p.LastName + '|%'))

这给出了错误,指出无法在 Firebird 中添加字符串。但是 Firebird 确​​实支持使用 || 运算符的字符串连接。

尝试使用 .Contains(...) 而不是 .SqlLike(...) 表示它在 OclPs 中不受支持。此外,它会找到姓氏包含在任何搜索名称中的人,即不正确的搜索。

我没主意了...

建议您使用正版OCL工具。您似乎在证明 MDriven OclPs 不是 OCL。

在这种情况下,当您有一长串字符串并且想要一个对象列表时,我认为您最好的选择是将 SQL 与 sqlpassthroughobjects 一起使用:

https://wiki.mdriven.net/index.php/OCLOperators_sqlpassthroughobjects

Person.sqlpassthroughobjects('select personid from person where lastname in ('+vNames->collect(n|'\''+n+'\'')->asCommaList+')')

oclPS 只实现了 OCL 的一个相当小的子集,因为它将 OCL 转换为 sql。

例如,不能使用“非对象”的集合。

Person.allInstances->select(p|vNames.SqlLike('%|' + p.LastName + '|%'))

而是在此处查看 sqlpassthroughobjects https://wiki.mdriven.net/index.php/OCLOperators_sqlpassthroughobjects

您也可以将名称作为 class 的对象插入数据库,然后使用 oclPS。