Range queries
As well as retrieving assets with a unique key, SHIM offers API functions the opportunity to retrieve sets of assets based on a range criteria. Moreover, composite keys can be modeled to enable queries against multiple components of the key.
The range functions return an iterator (StateQueryIteratorInterface) over a set of keys matching the query criteria. The returned keys are in lexical order. The iterator must be closed with a call to the function Close(). Additionally, when a composite key has multiple attributes, the range query function, GetStateByPartialCompositeKey(), can be used to search for keys matching a subset of the attributes.
For example, the key of a payment composed of TradeId and PaymentId can be searched for across all payments associated with a specific TradeId, as shown in the following snippet:
// Returns an iterator over all keys between the startKey (inclusive) and endKey (exclusive). // To query from start or end of the range, the startKey and endKey can be an empty. func GetStateByRange(startKey, endKey string) (StateQueryIteratorInterface, error) // Returns an iterator over all composite keys whose prefix matches the given partial composite key. // Same rules as for arguments of CreateCompositeKey function apply. func GetStateByPartialCompositeKey(objectType string, keys []string) (StateQueryIteratorInterface, error)
We can also search for all trade agreements with an ID within the range of 1-100 with the following query:
startKey, err = getTradeKey(stub, "1") endKey, err = getTradeKey(stub, "100") keysIterator, err := stub.GetStateByRange(startKey, endKey) if err != nil { return shim.Error(fmt.Printf("Error accessing state: %s", err)) } defer keysIterator.Close() var keys []string for keysIterator.HasNext() { key, _, err := keysIterator.Next() if err != nil { return shim.Error(fmt.Printf("keys operation failed. Error accessing state: %s", err)) } keys = append(keys, key) }