Skip to content

Commit

Permalink
replace Metadata in query with pageSize and bookmark (hyperledger#1024)
Browse files Browse the repository at this point in the history
The range query receives metadata such as pagination limit.
The execute query at couchdb receives metadata such as the
pagination bookmark and pagination limit.
ValidateRangeMetadata() and ValidateQueryMetadata() validate
the received metadata.

However, the term metadata is confusing with the statemetadata
which stores the key-based endorsement. Hence, we replace
Metadata in range and execute query API with Pagination.
As we have removed the metadata map, we also removed
ValidateRangeMetadata() and ValidateQueryMetadata() as they
are not needed anymore.

Signed-off-by: senthil <cendhu@gmail.com>
  • Loading branch information
cendhu authored Apr 18, 2020
1 parent 9bf609e commit b17b6dd
Show file tree
Hide file tree
Showing 24 changed files with 903 additions and 1,133 deletions.
42 changes: 4 additions & 38 deletions core/chaincode/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -710,14 +710,9 @@ func (h *Handler) HandleGetStateByRange(msg *pb.ChaincodeMessage, txContext *Tra
}

totalReturnLimit := h.calculateTotalReturnLimit(metadata)

iterID := h.UUIDGenerator.New()

var rangeIter commonledger.ResultsIterator
var paginationInfo map[string]interface{}

isPaginated := false

namespaceID := txContext.NamespaceID
collection := getStateByRange.Collection
if isCollectionSet(collection) {
Expand All @@ -730,21 +725,15 @@ func (h *Handler) HandleGetStateByRange(msg *pb.ChaincodeMessage, txContext *Tra
rangeIter, err = txContext.TXSimulator.GetPrivateDataRangeScanIterator(namespaceID, collection,
getStateByRange.StartKey, getStateByRange.EndKey)
} else if isMetadataSetForPagination(metadata) {
paginationInfo, err = createPaginationInfoFromMetadata(metadata, totalReturnLimit, pb.ChaincodeMessage_GET_STATE_BY_RANGE)
if err != nil {
return nil, err
}
isPaginated = true

startKey := getStateByRange.StartKey

if isMetadataSetForPagination(metadata) {
if metadata.Bookmark != "" {
startKey = metadata.Bookmark
}
}
rangeIter, err = txContext.TXSimulator.GetStateRangeScanIteratorWithMetadata(namespaceID,
startKey, getStateByRange.EndKey, paginationInfo)
rangeIter, err = txContext.TXSimulator.GetStateRangeScanIteratorWithPagination(namespaceID,
startKey, getStateByRange.EndKey, metadata.PageSize)
} else {
rangeIter, err = txContext.TXSimulator.GetStateRangeScanIterator(namespaceID, getStateByRange.StartKey, getStateByRange.EndKey)
}
Expand Down Expand Up @@ -838,10 +827,7 @@ func (h *Handler) HandleGetQueryResult(msg *pb.ChaincodeMessage, txContext *Tran

totalReturnLimit := h.calculateTotalReturnLimit(metadata)
isPaginated := false

var executeIter commonledger.ResultsIterator
var paginationInfo map[string]interface{}

namespaceID := txContext.NamespaceID
collection := getQueryResult.Collection
if isCollectionSet(collection) {
Expand All @@ -853,13 +839,9 @@ func (h *Handler) HandleGetQueryResult(msg *pb.ChaincodeMessage, txContext *Tran
}
executeIter, err = txContext.TXSimulator.ExecuteQueryOnPrivateData(namespaceID, collection, getQueryResult.Query)
} else if isMetadataSetForPagination(metadata) {
paginationInfo, err = createPaginationInfoFromMetadata(metadata, totalReturnLimit, pb.ChaincodeMessage_GET_QUERY_RESULT)
if err != nil {
return nil, err
}
isPaginated = true
executeIter, err = txContext.TXSimulator.ExecuteQueryWithMetadata(namespaceID,
getQueryResult.Query, paginationInfo)
executeIter, err = txContext.TXSimulator.ExecuteQueryWithPagination(namespaceID,
getQueryResult.Query, metadata.Bookmark, metadata.PageSize)

} else {
executeIter, err = txContext.TXSimulator.ExecuteQuery(namespaceID, getQueryResult.Query)
Expand Down Expand Up @@ -952,22 +934,6 @@ func getQueryMetadataFromBytes(metadataBytes []byte) (*pb.QueryMetadata, error)
return nil, nil
}

func createPaginationInfoFromMetadata(metadata *pb.QueryMetadata, totalReturnLimit int32, queryType pb.ChaincodeMessage_Type) (map[string]interface{}, error) {
paginationInfoMap := make(map[string]interface{})

switch queryType {
case pb.ChaincodeMessage_GET_QUERY_RESULT:
paginationInfoMap["bookmark"] = metadata.Bookmark
case pb.ChaincodeMessage_GET_STATE_BY_RANGE:
// this is a no-op for range query
default:
return nil, errors.New("query type must be either GetQueryResult or GetStateByRange")
}

paginationInfoMap["limit"] = totalReturnLimit
return paginationInfoMap, nil
}

func (h *Handler) calculateTotalReturnLimit(metadata *pb.QueryMetadata) int32 {
totalReturnLimit := int32(h.TotalQueryLimit)
if metadata != nil {
Expand Down
174 changes: 88 additions & 86 deletions core/chaincode/mock/tx_simulator.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit b17b6dd

Please sign in to comment.