github.com/renegr87/renegr87@v2.1.1+incompatible/core/ledger/kvledger/txmgmt/txmgr/lockbasedtxmgr/lockbased_query_executer.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package lockbasedtxmgr
     8  
     9  import (
    10  	commonledger "github.com/hyperledger/fabric/common/ledger"
    11  	"github.com/hyperledger/fabric/core/ledger"
    12  )
    13  
    14  // lockBasedQueryExecutor is a query executor used in `LockBasedTxMgr`
    15  type lockBasedQueryExecutor struct {
    16  	helper *queryHelper
    17  	txid   string
    18  }
    19  
    20  func newQueryExecutor(txmgr *LockBasedTxMgr, txid string, performCollCheck bool, hasher ledger.Hasher) *lockBasedQueryExecutor {
    21  	helper := newQueryHelper(txmgr, nil, performCollCheck, hasher)
    22  	logger.Debugf("constructing new query executor txid = [%s]", txid)
    23  	return &lockBasedQueryExecutor{helper, txid}
    24  }
    25  
    26  // GetState implements method in interface `ledger.QueryExecutor`
    27  func (q *lockBasedQueryExecutor) GetState(ns string, key string) (val []byte, err error) {
    28  	val, _, err = q.helper.getState(ns, key)
    29  	return
    30  }
    31  
    32  // GetStateMetadata implements method in interface `ledger.QueryExecutor`
    33  func (q *lockBasedQueryExecutor) GetStateMetadata(namespace, key string) (map[string][]byte, error) {
    34  	return q.helper.getStateMetadata(namespace, key)
    35  }
    36  
    37  // GetStateMultipleKeys implements method in interface `ledger.QueryExecutor`
    38  func (q *lockBasedQueryExecutor) GetStateMultipleKeys(namespace string, keys []string) ([][]byte, error) {
    39  	return q.helper.getStateMultipleKeys(namespace, keys)
    40  }
    41  
    42  // GetStateRangeScanIterator implements method in interface `ledger.QueryExecutor`
    43  // startKey is included in the results and endKey is excluded. An empty startKey refers to the first available key
    44  // and an empty endKey refers to the last available key. For scanning all the keys, both the startKey and the endKey
    45  // can be supplied as empty strings. However, a full scan should be used judiciously for performance reasons.
    46  func (q *lockBasedQueryExecutor) GetStateRangeScanIterator(namespace string, startKey string, endKey string) (commonledger.ResultsIterator, error) {
    47  	return q.helper.getStateRangeScanIterator(namespace, startKey, endKey)
    48  }
    49  
    50  // GetStateRangeScanIteratorWithMetadata implements method in interface `ledger.QueryExecutor`
    51  // startKey is included in the results and endKey is excluded. An empty startKey refers to the first available key
    52  // and an empty endKey refers to the last available key. For scanning all the keys, both the startKey and the endKey
    53  // can be supplied as empty strings. However, a full scan should be used judiciously for performance reasons.
    54  // metadata is a map of additional query parameters
    55  func (q *lockBasedQueryExecutor) GetStateRangeScanIteratorWithMetadata(namespace string, startKey string, endKey string, metadata map[string]interface{}) (ledger.QueryResultsIterator, error) {
    56  	return q.helper.getStateRangeScanIteratorWithMetadata(namespace, startKey, endKey, metadata)
    57  }
    58  
    59  // ExecuteQuery implements method in interface `ledger.QueryExecutor`
    60  func (q *lockBasedQueryExecutor) ExecuteQuery(namespace, query string) (commonledger.ResultsIterator, error) {
    61  	return q.helper.executeQuery(namespace, query)
    62  }
    63  
    64  // ExecuteQueryWithMetadata implements method in interface `ledger.QueryExecutor`
    65  func (q *lockBasedQueryExecutor) ExecuteQueryWithMetadata(namespace, query string, metadata map[string]interface{}) (ledger.QueryResultsIterator, error) {
    66  	return q.helper.executeQueryWithMetadata(namespace, query, metadata)
    67  }
    68  
    69  // GetPrivateData implements method in interface `ledger.QueryExecutor`
    70  func (q *lockBasedQueryExecutor) GetPrivateData(namespace, collection, key string) ([]byte, error) {
    71  	return q.helper.getPrivateData(namespace, collection, key)
    72  }
    73  
    74  func (q *lockBasedQueryExecutor) GetPrivateDataHash(namespace, collection, key string) ([]byte, error) {
    75  	valueHash, _, err := q.helper.getPrivateDataValueHash(namespace, collection, key)
    76  	return valueHash, err
    77  }
    78  
    79  // GetPrivateDataMetadata implements method in interface `ledger.QueryExecutor`
    80  func (q *lockBasedQueryExecutor) GetPrivateDataMetadata(namespace, collection, key string) (map[string][]byte, error) {
    81  	return q.helper.getPrivateDataMetadata(namespace, collection, key)
    82  }
    83  
    84  // GetPrivateDataMetadataByHash implements method in interface `ledger.QueryExecutor`
    85  func (q *lockBasedQueryExecutor) GetPrivateDataMetadataByHash(namespace, collection string, keyhash []byte) (map[string][]byte, error) {
    86  	return q.helper.getPrivateDataMetadataByHash(namespace, collection, keyhash)
    87  }
    88  
    89  // GetPrivateDataMultipleKeys implements method in interface `ledger.QueryExecutor`
    90  func (q *lockBasedQueryExecutor) GetPrivateDataMultipleKeys(namespace, collection string, keys []string) ([][]byte, error) {
    91  	return q.helper.getPrivateDataMultipleKeys(namespace, collection, keys)
    92  }
    93  
    94  // GetPrivateDataRangeScanIterator implements method in interface `ledger.QueryExecutor`
    95  func (q *lockBasedQueryExecutor) GetPrivateDataRangeScanIterator(namespace, collection, startKey, endKey string) (commonledger.ResultsIterator, error) {
    96  	return q.helper.getPrivateDataRangeScanIterator(namespace, collection, startKey, endKey)
    97  }
    98  
    99  // ExecuteQueryOnPrivateData implements method in interface `ledger.QueryExecutor`
   100  func (q *lockBasedQueryExecutor) ExecuteQueryOnPrivateData(namespace, collection, query string) (commonledger.ResultsIterator, error) {
   101  	return q.helper.executeQueryOnPrivateData(namespace, collection, query)
   102  }
   103  
   104  // Done implements method in interface `ledger.QueryExecutor`
   105  func (q *lockBasedQueryExecutor) Done() {
   106  	logger.Debugf("Done with transaction simulation / query execution [%s]", q.txid)
   107  	q.helper.done()
   108  }