def test_score_fusion(self): treestr = '{"$and": [{"reading": {"$gte": 0}}, {"teaching_or_training": {"$gte": 0}}, {"$or": [{"research": {"$gte": 0}}, {"eating": {"$gte": 0}}]}]}' tree = json.loads(treestr) print tree qt = ScoreFusionQueryTree(tree, debug=True) results = qt.sql() print "Result = ", results self.assertEqual(results, "SELECT v_id, reading, teaching_or_training, research, eating, ((reading + teaching_or_training + MAX(research,eating)) / 3) as result FROM clip_calib_scores ORDER BY result DESC LIMIT 0,50;")
def query_fusion(): """ On submisison gets the query "algo" is avg by default "rank_fusion" to be supported soon """ algo = flask.request.args.get("algo", "scorefusion") dataset = flask.request.args.get("dataset", "ignored") tree = flask.request.args.get('tree', None) skip = int(flask.request.args.get('skip', '0')) limit = int(flask.request.args.get("limit", '30')) # Unescape the incoming tree information query = json.loads(urllib2.unquote(tree).decode('utf-8')) # Parse the query obj = {} obj["query"] = {} obj["query"]["dataset"] = dataset obj["query"]["algo"] = algo obj["query"]["tree"] = query obj["query"]["treestr"] = json.dumps(query) tstart = time.time() # Process the tree here if algo == "scorefusion": # Browse through the tree engine = ScoreFusionQueryTree(query) elif algo == "rankfusion": engine = RankFusionQueryTree(query) else: obj["error"] = "Unknown algo" return flask.jsonify(obj) obj["sql"] = engine.sql() cur = sqlstore.connect() cur.execute(obj["sql"]) rows = cur.fetchall() obj["clips"] = [] for row in rows: obj["clips"].append(row[0]) sqlstore.free(cur) obj["count"] = len(obj["clips"]) # Send the results back tend = time.time() obj["query"]["time"] = (tend - tstart) return flask.jsonify(obj) cur = db[dataset].find(query, {"_id": 1}, skip=skip, limit=20) obj["count"] = cur.count() imgs = {} count = 0 iter = 0 while 1: cur = db[dataset].find(query, { "thumb": 0, "scores": { "$slice": [attr_id, 1] } }, skip=skip, limit=limit).sort("scores.%d" % (attr_id), pymongo.DESCENDING) iter = iter + 1 if count >= limit or iter > 5: break for animage in cur: # Append to the images v_id = "Ground truth" if "v_id" in animage: v_id = animage["v_id"] if v_id in imgs: imgs[v_id].append([str(animage["_id"]), animage["scores"][0]]) else: imgs[v_id] = [ [str(animage["_id"]), animage["scores"][0]], ] count = count + 1 skip = skip + limit cliplist = [] for akey in imgs.keys(): cliplist.append({ 'clip_id': akey, 'high_score': imgs[akey][0][1], 'images': imgs[akey] }) obj["clips"] = sorted(cliplist, key=lambda k: k['high_score'], reverse=True) tend = time.time() obj["query"] = { 'dataset': dataset, 'skip': skip, "time": (tend - tstart), "tree": query, "sort": sort } return jsonify(obj)
def query_fusion(): """ On submisison gets the query "algo" is avg by default "rank_fusion" to be supported soon """ algo = flask.request.args.get("algo", "scorefusion") dataset = flask.request.args.get("dataset", "ignored") tree = flask.request.args.get('tree', None) skip = int(flask.request.args.get('skip', '0')) limit = int(flask.request.args.get("limit", '30')) # Unescape the incoming tree information query = json.loads(urllib2.unquote(tree).decode('utf-8')) # Parse the query obj = {} obj["query"] = {} obj["query"]["dataset"] = dataset obj["query"]["algo"] = algo obj["query"]["tree"] = query obj["query"]["treestr"] = json.dumps(query) tstart = time.time() # Process the tree here if algo=="scorefusion": # Browse through the tree engine = ScoreFusionQueryTree(query) elif algo=="rankfusion": engine = RankFusionQueryTree(query) else: obj["error"] = "Unknown algo" return flask.jsonify(obj) obj["sql"] = engine.sql() cur = sqlstore.connect() cur.execute(obj["sql"]) rows = cur.fetchall() obj["clips"] = [] for row in rows: obj["clips"].append(row[0]) sqlstore.free(cur) obj["count"] = len(obj["clips"]) # Send the results back tend = time.time() obj["query"]["time"] = (tend - tstart) return flask.jsonify(obj) cur = db[dataset].find(query, { "_id" : 1 }, skip=skip, limit=20) obj["count"] = cur.count() imgs = {} count = 0 iter = 0 while 1: cur = db[dataset].find(query, { "thumb" : 0, "scores" : { "$slice" : [attr_id, 1]}}, skip=skip, limit=limit).sort("scores.%d" % (attr_id), pymongo.DESCENDING) iter = iter + 1 if count >= limit or iter > 5: break; for animage in cur: # Append to the images v_id = "Ground truth" if "v_id" in animage: v_id = animage["v_id"] if v_id in imgs: imgs[v_id].append([ str(animage["_id"]), animage["scores"][0]]) else: imgs[v_id] = [[ str(animage["_id"]), animage["scores"][0]], ] count = count + 1 skip = skip + limit cliplist = [] for akey in imgs.keys(): cliplist.append({'clip_id' : akey, 'high_score' : imgs[akey][0][1], 'images' : imgs[akey]}) obj["clips"] = sorted(cliplist, key=lambda k: k['high_score'], reverse=True) tend = time.time() obj["query"] = { 'dataset' : dataset, 'skip' : skip, "time" : (tend - tstart), "tree" : query, "sort" : sort } return jsonify(obj)