From 67361188e50026e5f94544d5bb8cab504c1e5a84 Mon Sep 17 00:00:00 2001 From: josecoll Date: Fri, 4 Aug 2017 16:22:21 +0100 Subject: [PATCH] Vault Query fix: query by multiple issuer party names. (#1170) * Fixed query by multiple issuer party names. * Changes following feedback from PR review. Added changelog entry. --- docs/source/changelog.rst | 2 ++ .../vault/HibernateQueryCriteriaParser.kt | 4 ++-- .../node/services/vault/VaultQueryTests.kt | 23 +++++++++++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst index 9f72d979a6..89d046c03e 100644 --- a/docs/source/changelog.rst +++ b/docs/source/changelog.rst @@ -62,6 +62,8 @@ UNRELEASED .. Milestone 15: +* Vault Query fix: filter by multiple issuer names in ``FungibleAssetQueryCriteria`` + * Following deprecated methods have been removed: * In ``DataFeed`` * ``first`` and ``current``, replaced by ``snapshot`` diff --git a/node/src/main/kotlin/net/corda/node/services/vault/HibernateQueryCriteriaParser.kt b/node/src/main/kotlin/net/corda/node/services/vault/HibernateQueryCriteriaParser.kt index 0e5a5aea4b..04c9ea3e4d 100644 --- a/node/src/main/kotlin/net/corda/node/services/vault/HibernateQueryCriteriaParser.kt +++ b/node/src/main/kotlin/net/corda/node/services/vault/HibernateQueryCriteriaParser.kt @@ -242,8 +242,8 @@ class HibernateQueryCriteriaParser(val contractType: Class, criteria.issuerPartyName?.let { val issuerParties = criteria.issuerPartyName as List val joinFungibleStateToParty = vaultFungibleStates.join("issuerParty") - val dealPartyKeys = issuerParties.map { it.nameOrNull().toString() } - predicateSet.add(criteriaBuilder.equal(joinFungibleStateToParty.get("name"), dealPartyKeys)) + val issuerPartyNames = issuerParties.map { it.nameOrNull().toString() } + predicateSet.add(criteriaBuilder.and(joinFungibleStateToParty.get("name").`in`(issuerPartyNames))) } // issuer reference diff --git a/node/src/test/kotlin/net/corda/node/services/vault/VaultQueryTests.kt b/node/src/test/kotlin/net/corda/node/services/vault/VaultQueryTests.kt index 8768b51cf3..0e1b6dd5d0 100644 --- a/node/src/test/kotlin/net/corda/node/services/vault/VaultQueryTests.kt +++ b/node/src/test/kotlin/net/corda/node/services/vault/VaultQueryTests.kt @@ -1392,6 +1392,29 @@ class VaultQueryTests : TestDependencyInjectionBase() { } } + @Test + fun `unconsumed fungible assets for selected issuer parties`() { + // GBP issuer + val GBP_CASH_ISSUER_KEY by lazy { entropyToKeyPair(BigInteger.valueOf(1001)) } + val GBP_CASH_ISSUER by lazy { Party(X500Name("CN=British Pounds Cash Issuer,O=R3,OU=corda,L=London,C=GB"), GBP_CASH_ISSUER_KEY.public).ref(1) } + // USD issuer + val USD_CASH_ISSUER_KEY by lazy { entropyToKeyPair(BigInteger.valueOf(1002)) } + val USD_CASH_ISSUER by lazy { Party(X500Name("CN=US Dollars Cash Issuer,O=R3,OU=corda,L=New York,C=US"), USD_CASH_ISSUER_KEY.public).ref(1) } + // CHF issuer + val CHF_CASH_ISSUER_KEY by lazy { entropyToKeyPair(BigInteger.valueOf(1003)) } + val CHF_CASH_ISSUER by lazy { Party(X500Name("CN=Swiss Francs Cash Issuer,O=R3,OU=corda,L=Zurich,C=CH"), CHF_CASH_ISSUER_KEY.public).ref(1) } + + database.transaction { + services.fillWithSomeTestCash(100.POUNDS, DUMMY_NOTARY, 1, 1, Random(0L), issuedBy = (GBP_CASH_ISSUER), issuerKey = (GBP_CASH_ISSUER_KEY)) + services.fillWithSomeTestCash(100.DOLLARS, DUMMY_NOTARY, 1, 1, Random(0L), issuedBy = (USD_CASH_ISSUER), issuerKey = (USD_CASH_ISSUER_KEY)) + services.fillWithSomeTestCash(100.SWISS_FRANCS, DUMMY_NOTARY, 1, 1, Random(0L), issuedBy = (CHF_CASH_ISSUER), issuerKey = (CHF_CASH_ISSUER_KEY)) + + val criteria = FungibleAssetQueryCriteria(issuerPartyName = listOf(GBP_CASH_ISSUER.party, USD_CASH_ISSUER.party)) + val results = vaultQuerySvc.queryBy>(criteria) + assertThat(results.states).hasSize(2) + } + } + @Test fun `unconsumed fungible assets by owner`() { database.transaction {