【问题标题】:Possible ways to create custom queries in Corda在 Corda 中创建自定义查询的可能方法
【发布时间】:2018-03-20 21:12:09
【问题描述】:

我们有一个可查询的状态,用于在系统初始化时存储一些信息,这些状态只发出一次,永不消耗

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 有关。查询接口返回'states(.getStates())' 或聚合结果'(.getOtherResults())' 的列表。我们想知道是否有可能(或计划)从 db 中获取单个列,然后通过 vault 接口过滤重复项,目前我们正在 java 中这样做。

【问题讨论】:

    标签: corda


    【解决方案1】:

    如果您的状态是QueryableStates,则可以根据其架构的属性有效地查询它们。

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

    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 或当事人的姓名进行查询。然后,您将获取第一个结果并使用它将派对的名称映射到派对的 ID,反之亦然。

    【讨论】:

      猜你喜欢
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-08
      • 2023-03-25
      • 2018-07-12
      • 2017-05-14
      相关资源
      最近更新 更多