July 23, 2019

Invoking/executing rich query in Oracle Blockchain Platform (OBP)

[OBP] This example is developed in NodeJS.

Hyperledger blockchain ledger is storing data in Key-Value pairs. So, if to fetch the data from the ledger, we will pass the key. But do you know, we can query the ledger without the key aswell.
Hyperledger blockchain is providing an option to query the ledger using a rich query. ChaincodeStub class has a method getQueryResult() which does this job. Please note that this method is supported only for state databases that support rich query. Below is the syntax of the method.

Syntax:
    <async> getQueryResult(query)

Input:
   A query string is in the native syntax of the underlying state database

Returns:
   Promise for StateQueryIterator Object

Below is the node JS code snippet to see the implementation of this method. In the below example, I am taking a product id from a user and fetching the set of keys and their JSON objects from the state database where the JSON object contains the given product id.

        let queryString = "SELECT key, valueJson FROM <STATE> WHERE json_extract(valueJson, '$.productid') = '" + args[0] + "'";
        let resultsIterator = await stub.getQueryResult(queryString);
        let results = [];

        while (true) {
            let oneRecord = {};
            let res = await resultsIterator.next();
            if (res.value && res.value.value.toString()) {
                let val = res.value.value.toString('utf8');
                try {
                    oneRecord.value = JSON.parse(val);
                } catch (err) {
                    console.log(err);
                    oneRecord.value = val;
                }
                results.push(oneRecord);
            }
            if (res.done) {
                await resultsIterator.close();
                return Buffer.from(JSON.stringify(results));
            }
        }

In the above example, the getQueryResult()  returns a promise object with an iterator. Hence, we need to call next() method of it to get the inside values.