在Corda中创建自定义查询的可能方法

时间:2018-03-19 23:45:07

标签: corda

我们有一个queryablestate,用于在系统初始化时存储一些信息,这些状态只发出一次并且从不消耗

class DataState implements LinearState, QueryableState {

    Party partyA;
    Party partyB;
    String partyAId;
    String partyBId;
    String sharedIdentifierNumber;

    DataState(Party partyA, Party partyB, String partyAId, String partyBId, String sharedIdentifierNumber) {
        this.partyA = partyA;
        this.partyB = partyB;
        this.partyAId = partyAId;
        this.partyBId = partyBId;
        this.sharedIdentifierNumber = sharedIdentifierNumber;
    }
}
partyA和partyAId必须与实体A相关(对于partyB也是如此) 一些示例实例:

new DataState(party1, party2, "00001", "12345", "0001")
new DataState(party3, party1, "05432", "00001", "0022")
new DataState(party2, party1, "12345", "00001", "0123")

我们希望方法像地图一样工作:

String retrievePartyId(Party party){}
assertTrue(retrievePartyId(party1).equals("00001"))
Party retrieveParty(String partyId){}
assertTrue(retrieveParty("12345").equals(party2))

我们已经通过使用自定义字段条件查询所有状态并通过

上的迭代进行比较来完成此操作
List<StateAndRef<DataState>> 

我们想知道是否有一些有效的方法可以做到这一点,也许在Corda中有一些自定义查询标准。我们认为这与sql column projections有关。查询接口返回&#39;状态列表(.getStates())&#39;或聚合结果&#39;(。getOtherResults())&#39;。我们想知道是否可以(或计划)从数据库中获取单个列,然后通过Vault接口过滤重复项,目前我们在java中这样做。

1 个答案:

答案 0 :(得分:1)

如果您的状态为QueryableState,则可以根据其架构属性对其进行有效查询。

例如,假设在CorDapp示例(https://github.com/corda/cordapp-example)中,我想基于它们的值以及我是否是贷方来查询IOUState的保险库。我可以这样做:

try {
    Field value = IOUSchemaV1.PersistentIOU.class.getDeclaredField("value");
    Field lender = IOUSchemaV1.PersistentIOU.class.getDeclaredField("lender");

    QueryCriteria valueOver50Criteria = new QueryCriteria.VaultCustomQueryCriteria(greaterThan(value, 50));
    QueryCriteria lenderIsMeCriteria = new QueryCriteria.VaultCustomQueryCriteria(equal(lender, getOurIdentity().getName().toString()));
    QueryCriteria criteria = valueOver50Criteria.and(lenderIsMeCriteria);

    Vault.Page<IOUState> results = getServiceHub().getVaultService().queryBy(IOUState.class, criteria);
    List<StateAndRef<IOUState>> matchingStates = results.getStates();

} catch (NoSuchFieldException e) {
    e.printStackTrace();
}

在您的情况下,您将根据当事人的身份证或当事人的姓名进行查询。然后,您将获取第一个结果并使用它将该方的名称映射到该方的ID,反之亦然。