diff --git a/benchmark/benchmark.py b/benchmark/benchmark.py new file mode 100644 index 0000000..3126b5e --- /dev/null +++ b/benchmark/benchmark.py @@ -0,0 +1,122 @@ +#!/bin/python +import urllib, urllib2 +import json + +class HyriseConnection(object): + def __init__(self, host, port): + super(HyriseConnection, self).__init__() + self.host = host + self.port = port + + def __hyriseurl(self): + return 'http://%s:%d/query' % (self.host, self.port) + + def __parseResponse(self, response): + result = json.loads(response) + if 'error' in result: + print 'An error occurred: %s' % result['error'][0] + return None + + if 'performanceData' in result: + pf_data = result['performanceData'] + total_time = 0 + parse_time = 0 + querytask_time = 0 + + for operator in pf_data: + time_ms = operator['endTime'] - operator['startTime'] + total_time += time_ms + if operator['name'] == 'RequestParseTask': + parse_time += time_ms + if operator['name'] == 'SQLQueryTask': + querytask_time += time_ms + + return { + 'total_ms': total_time, + 'parse_ms': parse_time, + 'querytask_ms': querytask_time, + 'preparation_ms': parse_time + querytask_time + } + + def __sendRequest(self, params): + url = self.__hyriseurl() + params['performance'] = 'true' + data = urllib.urlencode(params) + req = urllib2.Request(url, data) + try: + rsp = urllib2.urlopen(req) + response = rsp.read(); + return self.__parseResponse(response) + except TypeError, e: + print "An error occurred" + return None + except Exception, e: + return self.__parseResponse(e.read()) + + def __aggregatePerfArray(self, perfArray): + perf = perfArray[0] + for data in perfArray[1:]: + for key in data: + perf[key] += data[key] + + for key in perf: + perf[key] /= len(perfArray) + + return perf + + def executeSingleSQL(self, sql): + params = {'sql': sql} + return self.__sendRequest(params) + + def executeSingleJSON(self, jsonString): + params = {'query': jsonString} + return self.__sendRequest(params) + + def executeSQL(self, sql, times=1): + perf = [self.executeSingleSQL(sql) for _ in range(times)] + return self.__aggregatePerfArray(perf) + + def executeJSON(self, json, times=1): + perf = [self.executeSingleJSON(json) for _ in range(times)] + return self.__aggregatePerfArray(perf) + + +if __name__ == '__main__': + hyrise = HyriseConnection('localhost', 5000) + + # Load Table + hyrise.executeSQL("CREATE TABLE IF NOT EXISTS students FROM TBL FILE 'test/students.tbl';") + + print hyrise.executeSQL("SELECT name, city FROM students WHERE grade <= 2.0", 50) + + print hyrise.executeJSON("""{ + "operators": { + "0": { + "type": "GetTable", + "name": "students" + }, + "1": { + "type": "SimpleTableScan", + "predicates": [ + {"type" : "LTE_V", "in" : 0, "f" : "grade", "value" : 2, "vtype": 1} + ] + }, + "2": { + "type": "ProjectionScan", + "fields": [ + "name", + "city" + ] + } + }, + "edges": [ + [ + "0", + "1" + ], + [ + "1", + "2" + ] + ] + }""", 50)