2012-01-29 41 views
4

我正在编写一个API,将非技术用户执行的操作转换为Salesforce.com SOQL 'SELECT''UPSERT''DELETE'语句。有没有可以验证生成的SOQL的语法的资源,库等?我是我公司中唯一拥有SOQL经验的人,所以我很乐意将其放入一系列自动化测试中,以便其他开发人员增强(或修复)SOQL生成算法,以了解它是否仍能正常运行。有没有办法验证Salesforce.com的SOQL查询的语法而不执行它?

我知道一个解决方案就是做这些集成测试。但是,我宁愿避免这种情况,原因有三:

  1. 我需要维护另一个Salesforce.com帐户才能进行测试,因此我们不会检查我们的API请求上限。
  2. 无论什么时候Salesforce.com存在连接问题,我们最终都会追查误报。
  3. 那些没有经验的其他开发人员可能需要弄清楚如何在DML操作测试失败后清理测试Salesforce.com实例(这实际上意味着我会需要在发生这种情况时清理实例)。

回答

2

你可以通过使用SoqlBuilder library来解决你的问题。它为您生成SOQL,并且能够生成SOQL语句,而这些语句很容易出错,无法手动创建。语法很简单,我已经在很少的问题中广泛使用它。

+0

不幸的是,我没有使用Apex(*首先在C#*上抖动),所以我不能使用这个解决方案,但我认为这是我的问题的正确答案。事实上,这个库不会使用验证SOQL的工具,而只会让您构建有效的SOQL。虽然在更新库以了解它们之前,您不能使用新的SOQL过程,但在严格的脱机验证程序中也会存在此限制。 – Technetium 2012-02-16 17:54:49

1

我想不出从Salesforce以外的方式来做到这一点(甚至在Apex中,我现在只有一个想法可能无法正常工作),但我可以考虑两个可能的建议有帮助:

  1. 通过运行验证查询,但使用自定义Web服务批量执行它们。即在Apex中编写Web服务,最多可以接受100个查询字符串,让它运行并返回结果。这将大大减少API调用的数量,但如果您期待UI中的试用错误类型设置,它当然不起作用。

  2. 使用元数据API来下拉有关所有对象及其字段的信息,并使用它们来验证查询中的字段是否正确。验证其他查询语法应该相对简单,但条件可能会有点棘手。

+0

无论哪种方式,我们都在谈论集成测试,不幸的。你的第一个建议绝对解决了我的首要问题。至于第二个建议,我不太关心列名的有效性,因为列在各个账户之间会有所不同 - 这是重要的语法。 – Technetium 2012-01-30 18:51:08

+0

是的,我认为唯一的出路将是编写你自己的解析器和验证器(或者看看别人是否做到了这一点)。 – 2012-01-30 23:42:01

2

我找到了另一种方法来做到这一点。

Salesforce.com张贴在Backus-Noir Form(BNF)他们的SOQL符号在这里: http://www.salesforce.com/us/developer/docs/api90/Content/sforce_api_calls_soql_bnf_notation.htm

这意味着你可以使用一个BNF感知语言识别工具来分析SOQL。其中最常用的工具是ANTLR,它是免费的。遵循ANTLR示例,将SOQL语法传递到其语法编译器中,以获得所需语言(C#,Java,Python等)的Lexer和Parser。然后,您可以将要验证的实际SOQL语句传递给Lexer,然后将Lexer令牌传递到Parser中,以分解SOQL语句。如果您的Lexer或Parser失败,您的SOQL无效。

0

您可以使用利用SOAP API的salesforce develop nuget包

相关问题