def executeQuery()

in tools/perf-scale-workload/timestreamquery.py [0:0]


def executeQuery(client, query, timing = False, logFile = None):
    try:
        pages = None
        queryId = None
        firstResult = None
        start = timer()
        ## Create the paginator to paginate through the results.
        paginator = client.get_paginator('query')
        pageIterator = paginator.paginate(QueryString=query)
        emptyPages = 0
        pages = list()
        lastPage = None
        for page in pageIterator:
            if 'QueryId' in page and queryId == None:
                queryId = page['QueryId']
                print("QueryId: {}".format(queryId))

            lastPage = page

            if 'Rows' not in page or len(page['Rows']) == 0:
                ## We got an empty page.
                emptyPages +=1
            else:
                pages.append(page)
                if firstResult == None:
                    ## Note the time when the first row of result was received.
                    firstResult = timer()

        ## If there were no result, then return the last empty page to carry over the query results context
        if len(pages) == 0 and lastPage != None:
            pages.append(lastPage)
        if lastPage != None:
            if lastPage['QueryStatus'] != None:
                bytesMetered = int(lastPage['QueryStatus']['CumulativeBytesMetered'])
                bytesMeteredMB = round(bytesMetered / (1024.0 * 1024), 3)
        infoMsg = "Read {} pages of result. Empty pages: {}. Bytes metered (MB): {}".format(len(pages), emptyPages, bytesMeteredMB)
        print(infoMsg)
        if logFile != None:
            logFile.write("{}\n".format(infoMsg))

        return pages
    except Exception as e:
        if queryId != None:
            ## Try canceling the query if it is still running
            print("Attempting to cancel query: {}".format(queryId))
            try:
                client.cancel_query(query_id=queryId)
            except:
                pass
        print(e)
        exc_type, exc_value, exc_traceback = sys.exc_info()
        traceback.print_exception(exc_type, exc_value, exc_traceback, limit=2, file=sys.stdout)
        if e.response != None:
            queryId = None
            print("RequestId: {}".format(e.response['ResponseMetadata']['RequestId']))
            if 'QueryId' in e.response:
                queryId = e.response['QueryId']
            print("QueryId: {}".format(queryId))
            if pages != None:
                print("Read {} pages".format(len(pages)))
        raise e
    except KeyboardInterrupt:
        if queryId != None:
            ## Try canceling the query if it is still running
            print("Attempting to cancel query: {}".format(queryId))
            try:
                client.cancel_query(query_id=queryId)
            except:
                pass
        raise
    finally:
        end = timer()
        if timing == True:
            now = datetime.datetime.utcnow()
            if firstResult != None:
                timeToFirstResult = firstResult - start
                timeToReadResults = end - firstResult
            else:
                timeToFirstResult = end - start
                timeToReadResults = 0

            timingMsg = "{}. QueryId: {} Time: {}. First result: {}. Time to read results: {}.".format(now.strftime("%Y-%m-%d %H:%M:%S"),
                queryId, round(end - start, 3), round(timeToFirstResult, 3), round(timeToReadResults, 3))
            print(timingMsg)
            if logFile != None:
                logFile.write("{}\n".format(timingMsg))