#!/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)