0
头像

使用 API 时不能(显然)查询 DocumentNote 值

亲爱的支持,

我似乎不得不再次回到这个问题:

我正在为 Naturalis 开发一个插件,该插件在导入 fasta 和 AB1 文档时向它们添加文档注释。这很好用。关键是:当我再次导入完全相同的文档时,插件应该检测到这一点,因为其中一个文档注释起到了键的作用。插件仍然必须导入文档,但另一个文档注释 - “文档版本” - 必须增加。

我知道 Geneious 本身有一个修订号,但这些是插件的规范,所以这就是我需要实现的。

因此,插件首先对作为键的注释字段进行查询,然后根据需要为新文档设置“文档版本”。

但是,这永远行不通。在日志文件中,您可以看到 Geneious 执行了正确的查询,但没有任何返回。

附上两张图片:第一张是日志文件(实际上是通过 Swing TextArea 呈现给用户的)。您可以看到 Geneious 执行的查询(它是您的 Query 类的 toString() ),它似乎完全有效,但下一条日志消息说:“找到 0 个文件”。

第二个是 Geneious GUI 本身。它向您显示了两个相同的文档,但仍然带有相同的“文档版本”注释。“提取 ID”列是我正在搜索的关键,正如您所看到的,这两个文档是相同的。

奇怪的是,Geneious 本身检测到文件是相同的——它在最后一个名字后面放了一个 2。

最后,在这里您可以看到执行查询 (findByExtractID) 的 QueryUtils 类和负责从 DocumentNoteField 创建查询字段的枚举:

https://github.com/naturalis/sd_java__geneious_plugin/blob/v2_master/importers/src/main/java/nl/naturalis/geneious/note/NaturalisField.java

https://github.com/naturalis/sd_java__geneious_plugin/blob/v2_master/importers/src/main/java/nl/naturalis/geneious/util/QueryUtils.java

信息管理

11 条评论

0
头像

抱歉 ...我终于自己弄明白了。谢谢。

信息管理 0 票
评论动作 永久链接
0
头像

其实不是,我在查询中发现了一个错误,但问题仍然存在,我在另一篇文章中提到过:现在查询有时会找到以前导入的文档,但有时不会。似乎如果我快速连续执行该操作,文档尚未编入索引。

我真的需要一种方法来强制 Geneious 索引文档。有没有相关的 API?

信息管理 0 票
评论动作 永久链接
0
头像

我相信索引通常会立即触发,因此您无需强制执行。相反,您应该等待索引完成使用:

WritableDatabaseService.waitForSearchIndexingToComplete()

(在您的目标数据库上)

理查德·摩尔 0 票
评论动作 永久链接
0
头像

关键是 waitForSearchIndexing 立即返回而不对共享数据库做任何事情(根据 javadocs),正是因为索引是立即触发的。

然而,如果是这样的话,索引显然需要相当长的时间,这肯定足以让用户在索引完成之前启动另一个文档操作。

那么我需要一个像“isStillIndexing”这样的API。只有在返回 false 之后,我才会让文档操作允许进行任何搜索

信息管理 0 票
评论动作 永久链接
0
头像

抱歉,javadoc 的措辞有点误导。

“共享数据库总是立即索引文档,所以这个方法总是立即返回而不做任何事情”

索引不在共享数据库中的单独线程中运行,它是同步的,因此在索引完成之前文档甚至不会出现在数据库中。这就是它“立即索引文档”的意思。

因此,如果您得到的文档没有出现在共享数据库搜索结果中,那么就会出现其他问题(或者 javadoc 错误)。在我们深入挖掘之前,您能否确认是否是这种情况?

理查德·摩尔 0 票
评论动作 永久链接
0
头像

是的,我可以确认这一点。如果我的代码有问题,我肯定会得到错误的结果。但这种情况并非如此。

 

如果我在一次操作中导入带注释的(比如)fasta 文档,然后在下一次使用文档注释之一的值搜索它,该文档有时会返回,有时不会。如果我等待大约50秒以上,文件基本上保证会回来。如果我快速连续执行这两个操作,则文档大部分时间都不会返回,即使调用了 waitForSearchIndexingToComplete。

信息管理 0 票
评论动作 永久链接
0
头像

可能是我在从 DocumentOperation 子类而不是在 DocumentOperation 子类本身启动的 SwingWorker 线程中调用 waitForSearchIndexingToComplete 吗?

此外,我打这个电话DocumentOperation开始,而不是结尾。我不介意用户继续直行之后,但我介意,如果他们开始下DocumentOperation而索引仍在继续。

信息管理 0 票
评论动作 永久链接
0
头像

你好,理查德,

 

你有机会调查我的问题吗?

 

我现在还尝试在 SwingWorker 线程之外调用 waitForSearchIndexingToComplete。但即使我将它作为 performOperation 方法中的第一个(或最后一个)语句,我仍然遇到同样的问题。

信息管理 0 票
评论动作 永久链接
0
头像

抱歉,我与开发团队进行了交谈,结果证明我们不久前改变了行为,使其不会立即索引文档,而是如您所料的那样在后台线程中进行。

不幸的是,waitForSearchIndexingToComplete() 方法的 javadoc 和实现尚未更新以适应此情况。

所以目前没有办法可靠地等待文档在共享数据库中建立索引。我为此记录了一个错误,但我无法估计何时修复。

我一直在想一个好的解决方法,但我一直无法想出任何我害怕的东西。有了这些知识,也许你会有更多的运气?

理查德·摩尔 0 票
评论动作 永久链接
0
头像

嗨,理查德,

 

好,谢谢。我当然希望你的开发团队能尽快解决这个问题,因为它对我们来说相当重要(因为显然文档现在可以在功能损坏的状态下进入数据库 - 例如文档版本注释设置不正确)。

 

我想我现在要做的是强制用户在允许他们启动另一个操作之前等待固定的秒数

信息管理 0 票
评论动作 永久链接
0
头像

顺便说一句,我最终想出了一种(相当脏的)方法来确保已经完成。在我完成 DocumentOperarion 创建或更新某些 DocumentNotes 之后,我为我们的 DocumentNotes 之一创建了一个具有唯一值的“ping 文档”。然后,在每 3 秒休眠一次时,我尝试使用该值检索该文档。如果我取回它,我认为其他文档的索引现在也已完成,并删除 pingd 文件。

信息管理 0 票
评论动作 永久链接