text: #!/bin/python
  from __future__ import print_function
  
  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 as e:
  			print("An error occurred")
  			return None
  		except Exception as 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)
  		
  
  
  queries = {
  	'select-1': {
  		'sql': "SELECT name, city FROM students WHERE grade <= 2.0",
  		'json': """{"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"]]}""",
  
  		'prepare': "PREPARE sel_test: SELECT name, city FROM students WHERE grade <= ?",
  		'execute': "EXECUTE sel_test(2.0);"
  
  	},
  
  	'insert-1': {
  		'sql': "INSERT INTO students VALUES ('Max', 42, 'Musterhausen', 2.3);",
  		'json': """{"operators":{"0":{"type":"GetTable","name":"students"},"1":{"type":"InsertScan","data":[["Max",42,"Musterhausen",2.3]]},"commit":{"type":"Commit"}},"edges":[["0","1"],["1","commit"]]}"""
  	},
  
  	'insert-2': {
  		'sql': """
  			INSERT INTO students VALUES ('Max', 42, 'Musterhausen', 2.3);
  			INSERT INTO students VALUES ('Max', 42, 'Musterhausen', 2.3);
  			INSERT INTO students VALUES ('Max', 42, 'Musterhausen', 2.3);
  			INSERT INTO students VALUES ('Max', 42, 'Musterhausen', 2.3);
  			INSERT INTO students VALUES ('Max', 42, 'Musterhausen', 2.3);
  			INSERT INTO students VALUES ('Max', 42, 'Musterhausen', 2.3);
  			INSERT INTO students VALUES ('Max', 42, 'Musterhausen', 2.3);
  			INSERT INTO students VALUES ('Max', 42, 'Musterhausen', 2.3);
  		""",
  		'json': """{
  	        "operators": {
  	            "0": {
  	                "type": "GetTable",
  	                "name": "students"
  	            },
  	            "1": {
  	                "type": "InsertScan",
  	                "data": [
  	                    ["Max", 42, "Musterhausen", 2.3],
  	                    ["Max", 42, "Musterhausen", 2.3],
  	                    ["Max", 42, "Musterhausen", 2.3],
  	                    ["Max", 42, "Musterhausen", 2.3],
  	                    ["Max", 42, "Musterhausen", 2.3],
  	                    ["Max", 42, "Musterhausen", 2.3],
  	                    ["Max", 42, "Musterhausen", 2.3],
  	                    ["Max", 42, "Musterhausen", 2.3]
  	                ]
  	            },
  		        "commit" : {
  		            "type" : "Commit"
  		        }
  	        },
  	        "edges": [["0","1"],["1","commit"]]
  	    }""",
  	    'prepare': """PREPARE batch_insert {
  			INSERT INTO students VALUES ('Max', 42, 'Musterhausen', 2.3);
  			INSERT INTO students VALUES ('Max', 42, 'Musterhausen', 2.3);
  			INSERT INTO students VALUES ('Max', 42, 'Musterhausen', 2.3);
  			INSERT INTO students VALUES ('Max', 42, 'Musterhausen', 2.3);
  			INSERT INTO students VALUES ('Max', 42, 'Musterhausen', 2.3);
  			INSERT INTO students VALUES ('Max', 42, 'Musterhausen', 2.3);
  			INSERT INTO students VALUES ('Max', 42, 'Musterhausen', 2.3);
  			INSERT INTO students VALUES ('Max', 42, 'Musterhausen', 2.3);
  	    }""",
  	    'execute': "EXECUTE batch_insert;"
  	}
  }
  
  if __name__ == '__main__':
  	hyrise = HyriseConnection('localhost', 5000)
  
  	# Load Table
  	hyrise.executeSQL("CREATE TABLE IF NOT EXISTS students FROM TBL FILE 'test/students.tbl';")
  
  	query = queries['insert-2']
  
  	times = 50
  
  
  	# if 'prepare' in query:	hyrise.executeSQL(query['prepare'])
  	
  	if 'sql' in query: 		print('SQL: ', hyrise.executeSQL(query['sql'], times))
  
  	if 'execute' in query: 	print('Prepared: ', hyrise.executeSQL(query['execute'], times))
  
  	# if 'json' in query:		print('JSON: ', hyrise.executeJSON(query['json'], times))
  