Skip to content

Instantly share code, notes, and snippets.

@chhaileng
Last active November 10, 2019 14:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chhaileng/fb727f15f17a843c4f3ac5c995592c8e to your computer and use it in GitHub Desktop.
Save chhaileng/fb727f15f17a843c4f3ac5c995592c8e to your computer and use it in GitHub Desktop.
package main
import (
"encoding/json"
"strconv"
"github.com/hyperledger/fabric/core/chaincode/shim"
"github.com/hyperledger/fabric/protos/ledger/queryresult"
"github.com/hyperledger/fabric/protos/peer"
)
// CountStudent : by college ID & department ID
func CountStudent(stub shim.ChaincodeStubInterface, collegeId, departmentId string) (int, error) {
// No need to validate electioinType and candidateID, caller will handle this
queryString := "{\"selector\":{\"doc_type\":\"student\",\"college_id\":\"" + collegeId + "\",\"department_id\":\"" + departmentId + "\"}}"
var pageSize int32 = 1000
bookmark := ""
page := 0
var resultsIterator shim.StateQueryIteratorInterface
var responseMetadata *peer.QueryResponseMetadata
var err error
lastPageBookmark := ""
recordCount := 0
for true {
resultsIterator, responseMetadata, err = stub.GetQueryResultWithPagination(queryString, pageSize, bookmark)
if err != nil {
return 0, err
}
if bookmark == responseMetadata.Bookmark {
break
}
page++
lastPageBookmark = bookmark
// responseMetadata will be "nil" if the record is 0 at first page
bookmark = responseMetadata.Bookmark
if responseMetadata.Bookmark == "nil" {
break
}
}
defer resultsIterator.Close()
// optimize count by: (limit * (total_page -1) + number of record at last page)
// Do this no need to loop and count record in every page
recordCount = int(pageSize) * (page - 1)
resultsIterator, responseMetadata, err = stub.GetQueryResultWithPagination(queryString, pageSize, lastPageBookmark)
if err != nil {
return 0, err
}
for resultsIterator.HasNext() {
_, err := resultsIterator.Next()
if err != nil {
return 0, err
}
recordCount++
}
return recordCount, nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment