带有聚合函数的 Corda 查询

Corda query with aggregate functions

我想计算 fungible_token table 中的行数。 (Corda_OS 4.4 TokenSDK 1.2)
这是我的代码

@StartableByRPC
class Count : FlowLogic<String>() {
    override val progressTracker = ProgressTracker()
    @Suspendable
    @Throws(FlowException::class)
    override fun call():String{
        val generalCriteria = QueryCriteria.VaultQueryCriteria(status = Vault.StateStatus.ALL)
        val count =PersistentFungibleToken::amount.count()
        val countCriteria = QueryCriteria.VaultCustomQueryCriteria(count)
        val criteria = generalCriteria.and(countCriteria)
        val queryBy: Vault.Page<FungibleToken> = serviceHub.vaultService.queryBy(criteria, PageSpecification())
        val resutCount = queryBy.otherResults[0] as Long
        return  "total : ${resutCount}"
    }
}

它在fungible_token中有4行table(一条记录已被消耗)
预期结果 = 4,但结果 = 3
我检查我的 postgresql 日志,找到这个查询

select
  count(persistent1_.amount) as col_0_0_ 
from
  vault_states vaultschem0_ 
  cross join fungible_token persistent1_ 
where
  (vaultschem0_.contract_state_class_name in ('com.r3.corda.lib.tokens.contracts.states.FungibleToken')) 
  and vaultschem0_.state_status = 0
  and ( 
    vaultschem0_.output_index
    , vaultschem0_.transaction_id
  ) = ( 
    persistent1_.output_index
    , persistent1_.transaction_id
  ) 
limit
 201

Vault.StateStatus.ALL 不起作用?

我认为你把它弄得有点复杂了。您想要实现的目标可以通过一个简单的查询来完成:

 QueryCriteria countCriteria = new QueryCriteria.VaultCustomQueryCriteria(
     Builder.count(QueryCriteriaUtils.getField("amount", PersistentFungibleToken.class)),
     Vault.StateStatus.ALL
 );
 Vault.Page<FungibleToken> fungibleTokenPage = 
     activeParty.vaultQueryByCriteria(countCriteria, FungibleToken.class);

但是在前面的复合查询中的问题是,如果未指定,VaultCustomQueryCriteria 初始化时状态为未使用。