示例#1
0
文件: scalrr.py 项目: esoroush/scalrr
def query_execute(userquery,options):
	global saved_qpresults
	query = "select * from earthquake"
	if userquery != "":
		query = userquery
		print >> sys.stderr, "user query: ",query
	sdbioptions = {'afl':False}
	print >> sys.stderr, "saved_qpresults",saved_qpresults
	if saved_qpresults == 0:
		saved_qpresults = sdbi.verifyQuery(query,sdbioptions)
		#only do this check for new queries
		if options['reduce_res_check'] and (saved_qpresults['size'] > sdbi.D3_DATA_THRESHOLD):
			return {'reduce_res':True}
	if 'reduce_type' in options: # reduction requested
		sdbioptions['reduce_res'] = True
		srtoptions = {'afl':False}
		if 'predicate' in options:
			srtoptions['predicate'] = options['predicate']
		sdbioptions['reduce_options'] = setup_reduce_type(options['reduce_type'],srtoptions)
	else: #return original query
		sdbioptions = {'afl':False,'reduce_res':False}
	queryresultobj = sdbi.executeQuery(query,sdbioptions)

	print >> sys.stderr, "retrieved data from db.\nparsing results..."
	sdbioptions={'dimnames':saved_qpresults['dims']}
	queryresultarr = sdbi.getAllAttrArrFromQueryForJSON(queryresultobj[0],sdbioptions)
	if queryresultobj[1] != 0:
		saved_qpresults = queryresultobj[1]
	# get the new dim info
	queryresultarr['dimnames'] = saved_qpresults['dims'];
	queryresultarr['dimbases'] = saved_qpresults['dimbases'];
	queryresultarr['dimwidths'] = saved_qpresults['dimwidths'];
	print >> sys.stderr, "setting saved_qpresults to 0"
	saved_qpresults = 0 # reset so we can use later
	return queryresultarr # note that I don't set reduce_res false. JS code will still handle it properly
示例#2
0
def fetch_first_tile2(userquery,options):
	db = sdbi.scidbOpenConn()
	global experts
	query = userquery
	sdbioptions = {'afl':False,'db':db}
	saved_qpresults = sdbi.verifyQuery(query,sdbioptions)
	sdbi.scidbCloseConn(db)
	print "saved qp results, looking for error"
	if 'error' in saved_qpresults:
		print "error found, returning error:",saved_qpresults
		return saved_qpresults
	else:
		print "saved_qpresults:",saved_qpresults
	user_id = options['user_id']
	# setup metadata
	print "setting up metadata"
	with sbdata.metadata_lock:
		sbdata.backend_metadata[user_id] = {}
		sbdata.backend_metadata[user_id]['orig_query'] = query
		sbdata.backend_metadata[user_id]['saved_qpresults'] = saved_qpresults
		if 'data_threshold' in options:
			sbdata.backend_metadata[user_id]['data_threshold'] = options['data_threshold']
		else: # default is whatever is prescribed in scidb server interface code
			sbdata.backend_metadata[user_id]['data_threshold'] = sdbi.D3_DATA_THRESHOLD
		sbdata.backend_metadata[user_id]['levels'] = 0 #sbdata.default_levels #leave at default levels for now
		#TODO: let # levels vary
	#get tile
	base_id = [0] * saved_qpresults['numdims']
	print "base id:",base_id
	if 'usenumpy' in options:
		usenumpy = options['usenumpy']
	else:
		usenumpy = False
	tile = ti.getTileByIDN(base_id,0,user_id,usenumpy)
	if 'error' in tile:
		return tile
	#save tile info
	tile_key = str(base_id)
	with sbdata.user_history_lock: # add tile to history
		currtime = datetime.now()
		sbdata.user_history[user_id] = [{'tile_id':base_id,'level':0,'timestamp':currtime}]
		try:
			if not os.path.isdir(history_dir):
				os.makedirs(history_dir)
			with open(history_dir +"/"+str(user_id)+".txt", "a") as myfile:
			    myfile.write(str(base_id)+'\t0\t'+str(currtime)+"\n")
		except Exception as e:
			print e # don't barf if this doesn't work
	with sbdata.user_tiles_lock:# save tile
		sbdata.user_tiles[user_id] = {0:{tile_key:tile}}
		print "added tile to sbdata.user_tiles:"#,sbdata.user_tiles
	#start prefetching
	#print "setting up prefetching experts"
	#experts = range(1)
	#expert_threads = range(1)
	#experts[0] = dumb_expert.BasicExpert()
	#expert_threads[0] = threading.Thread(target=experts[0].prefetch,args=(sbdata.max_prefetched,user_id,))
	#expert_threads[0].start()
	#sdbi.scidbCloseConn(db)
	return tile
示例#3
0
def query_execute(userquery,options):
	user_id = options['user_id']
	resolution = sdbi.D3_DATA_THRESHOLD
	if 'resolution' in options and options['resolution'] > 0:
		print "got resolution"
        	resolution = options['resolution']
	db = sdbi.scidbOpenConn()
	query = userquery
	#print  "user query: ",query
	sdbioptions = {'afl':False,'db':db,'resolution':resolution}
	saved_qpresults = None
        if 'saved_qpresults' in options:
        	saved_qpresults = options['saved_qpresults']
		#dumb_expert.prefetch(3,options['user_id'])
		#tile = ti.getTileByID(2,sbdata.backend_metadata[options['user_id']]['levels'],options['user_id'])
		#print "tile: ",tile
		#sdbioptions={'dimnames':saved_qpresults['dims']}
		#print sdbi.getAllAttrArrFromQueryForJSON(tile[0],sdbioptions)
		#fetch_tile(0,1,{'user_id':user_id})
	if saved_qpresults is None: # first time
		#fetch_first_tile(query,{'user_id':user_id})
		saved_qpresults = sdbi.verifyQuery(query,sdbioptions)
		#with sbdata.metadata_lock:
		#	sbdata.backend_metadata[user_id] = {}
		#	sbdata.backend_metadata[user_id]['orig_query'] = query
		#	sbdata.backend_metadata[user_id]['saved_qpresults'] = saved_qpresults
		#	if 'data_threshold' in options:
		#		sbdata.backend_metadata[user_id]['data_threshold'] = options['data_threshold']
		#	else: # default
		#		sbdata.backend_metadata[user_id]['data_threshold'] = sdbi.D3_DATA_THRESHOLD
		#	sbdata.backend_metadata[user_id]['levels'] = sbdata.default_levels #leave at default levels for now
		#	#TODO: let # levels vary
		#only do this check for new queries
		if options['reduce_res_check'] and (saved_qpresults['size'] > resolution):#sdbi.D3_DATA_THRESHOLD):
			return {'reduce_res':True,'saved_qpresults':saved_qpresults}
	if 'reduce_type' in options: # reduction requested
		sdbioptions['reduce_res'] = True
		srtoptions = {'afl':False,'saved_qpresults':saved_qpresults}
		if 'predicate' in options:
			srtoptions['predicate'] = options['predicate']
		sdbioptions['reduce_options'] = setup_reduce_type(options['reduce_type'],srtoptions)
	else: #return original query
		sdbioptions = {'afl':False,'reduce_res':False,'db':db}
	queryresultobj = sdbi.executeQuery(query,sdbioptions)
	print "queryresultobj:",queryresultobj
	print  "retrieved data from db.\nparsing results..."
	sdbioptions={'dimnames':saved_qpresults['dims']}
	queryresultarr = sdbi.getAllAttrArrFromQueryForJSON(queryresultobj[0],sdbioptions)
	if queryresultobj[1] != 0:
		saved_qpresults = queryresultobj[1]
	# get the new dim info
	queryresultarr['dimnames'] = saved_qpresults['dims']
	queryresultarr['dimbases'] = saved_qpresults['dimbases']
	queryresultarr['dimwidths'] = saved_qpresults['dimwidths']
	queryresultarr['saved_qpresults'] = saved_qpresults
	sdbi.scidbCloseConn(db)
	return queryresultarr # note that I don't set reduce_res false. JS code will still handle it properly
def verify_query(query):
  saved_qpresults = None
  try:
    db = sdbi.scidbOpenConn()
    sdbioptions = {'afl':False,'db':db}
    saved_qpresults = sdbi.verifyQuery(query,sdbioptions)
    sdbi.scidbCloseConn(db)
  except Exception as e:
    if DEBUG: print "error occured:",e
    pass
  return saved_qpresults
示例#5
0
def fetch_first_tile(userquery,options):
	db = sdbi.scidbOpenConn()
	global experts
	query = userquery
	sdbioptions = {'afl':False,'db':db}
	saved_qpresults = sdbi.verifyQuery(query,sdbioptions)
	user_id = options['user_id']
	# setup metadata
	print "setting up metadata"
	with sbdata.metadata_lock:
		sbdata.backend_metadata[user_id] = {}
		sbdata.backend_metadata[user_id]['orig_query'] = query
		sbdata.backend_metadata[user_id]['saved_qpresults'] = saved_qpresults
		if 'data_threshold' in options:
			sbdata.backend_metadata[user_id]['data_threshold'] = options['data_threshold']
		else: # default is whatever is prescribed in scidb server interface code
			sbdata.backend_metadata[user_id]['data_threshold'] = sdbi.D3_DATA_THRESHOLD
		sbdata.backend_metadata[user_id]['levels'] = 0 #sbdata.default_levels #leave at default levels for now
		#TODO: let # levels vary
	#get tile
	tile = ti.getTileByIDXY(0,0,0,user_id)
	#save tile info
	tile_key = "0,0"
	with sbdata.user_history_lock: # add tile to history
		sbdata.user_history[user_id] = [{'tile_xid':0,'tile_yid':0,'level':0,'timestamp':datetime.now()}]
	with sbdata.user_tiles_lock:# save tile
		sbdata.user_tiles[user_id] = {0:{tile_key:tile}}
		print "added tile to sbdata.user_tiles:"#,sbdata.user_tiles
	#start prefetching
	#print "setting up prefetching experts"
	#experts = range(1)
	#expert_threads = range(1)
	#experts[0] = dumb_expert.BasicExpert()
	#expert_threads[0] = threading.Thread(target=experts[0].prefetch,args=(sbdata.max_prefetched,user_id,))
	#expert_threads[0].start()
	#sdbi.scidbCloseConn(db)
	return tile
示例#6
0
def compare_tiles(query,threshold,zoom_diff,x_label,y_label):
	db = sdbi.scidbOpenConn()
	sdbioptions = {'afl':False,'db':db}
	saved_qpresults = sdbi.verifyQuery(query,sdbioptions)
	sdbi.scidbCloseConn(db)
	if 'error' in saved_qpresults:
		print "error found, returning error:",saved_qpresults
		return saved_qpresults
	else:
		if DEBUG_PRINT: print "saved_qpresults:",saved_qpresults
	if x_label not in saved_qpresults['dims']:
		print "x_label",x_label,"not found"
		return
	if y_label not in saved_qpresults['dims']:
		print "y_label",y_label,"not found"
		return
	n = saved_qpresults['numdims']
	root_k = math.ceil(math.pow(threshold,1.0/n))
	threshold = root_k ** 2 ## adjust to make it a nice power
	tsize = saved_qpresults['size'] # get the size of the result
	levels = 1
	if tsize > threshold: # if k happens to be larger than the total results
		levels = math.ceil(math.log(1.0*tsize/threshold)/(n*math.log(zoom_diff)))+1 # need to account for zoom diff
	if DEBUG_PRINT: print "levels:",levels

	tile_metadata = sdbi.get_complete_tile_metadata(root_k,zoom_diff,saved_qpresults)
	if DEBUG_PRINT: print "tile metadata:",tile_metadata
	
	#_id = [0,0]
	#tile = ti.getTileNoUser(_id,query,saved_qpresults,levels,threshold)
	#if 'error' in tile:
	#	print 'error found, reeturning error:',tile
	#	return tile
	for l in range(1,int(levels)):
		total_tiles_root = int(math.pow(zoom_diff,l))
		for xid in range(0,total_tiles_root):
			for yid in range(0,total_tiles_root):
				#get tile
				tile_info = {'type':'xy','tile_xid':xid,'tile_yid':yid,'x_label':x_label,'y_label':y_label}
				tile = ti.getTileNoUser(tile_info,query,saved_qpresults,l,levels,threshold,USE_NUMPY)
				if 'error' in tile:
					print 'error found, reeturning error:',tile
					return tile
				#stats = tile['stats']
				#if DEBUG_PRINT: print stats
				if yid+1 < total_tiles_root:
					for yid2 in range(yid+1,total_tiles_root):
						#if DEBUG_PRINT: print "comparing tile (lvl:",l,", x:",xid,", y:",yid,") and tile (lvl:",l,", x:",xid,", y:",yid2,")"
						#check rest of col: xid,yid2
						tile_info['tile_xid']=xid
						tile_info['tile_yid']=yid2
						#get other tile
						newtile = ti.getTileNoUser(tile_info,query,saved_qpresults,l,levels,threshold,USE_NUMPY)
						if 'error' in newtile:
							print 'error found, reeturning error:',newtile
							return newtile
						#compare tiles
				if xid+1 < total_tiles_root:
					for xid2 in range(xid+1,total_tiles_root):
						for yid2 in range(0,total_tiles_root):
							#if DEBUG_PRINT: print "comparing tile (lvl:",l,", x:",xid,", y:",yid,") and tile (lvl:",l,", x:",xid2,", y:",yid2,")"
							#check all tiles w/ > xid: xid2,yid2
							tile_info['tile_xid']=xid2
							tile_info['tile_yid']=yid2
							#get other tile
							newtile = ti.getTileNoUser(tile_info,query,saved_qpresults,l,levels,threshold,USE_NUMPY)
							if 'error' in newtile:
								print 'error found, reeturning error:',newtile
								return newtile
示例#7
0
文件: scalrr.py 项目: esoroush/scalrr
def queryplan_execute(userquery,options):
	sdbioptions = {'afl':False}
	return sdbi.verifyQuery(userquery,sdbioptions)