-
Notifications
You must be signed in to change notification settings - Fork 1
/
rest.py
110 lines (96 loc) · 3.97 KB
/
rest.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#!/usr/bin/env python
from flask import Flask, jsonify
import flask,json
from main import dollarEscape, dollarUnescape, dollarSeparate, dollarAdd,perr,pout, ElandraCube
import httplib,re #for init
#globals
app=Flask(__name__)
cubes={}
init_done=False
@app.route("/cubes",methods=['GET','PUT','POST'])
def handleGetCubeNames():
return json.dumps(cubes.keys())
@app.route("/",methods=['GET'])
def handleDefault():
if not init_done: return init()
#perr(cubes)
return jsonify({"status":"ok"})
# /makecube/?keyspace=k1&tablename=t1
@app.route("/makecube",methods=['PUT','POST'])
def handleMakeCube():
global cubes
keyspace=flask.request.args.get('keyspace','')
table=flask.request.args.get('tablename','')
if not table or not keyspace:
perr("Invalid request")
return jsonify({"status":"failed","error":"No tablename or keyspace"})
newcubename=(dollarAdd(dollarEscape(keyspace),table))
if cubes.has_key(newcubename):
return jsonify({"status":"failed","error":"Cube already exists"})
cubes[newcubename]=ElandraCube(keyspace=keyspace, tablename=table)
return jsonify({"status":"success"})
def init():
global cubes,init_done
cubes={}
conn = httplib.HTTPConnection("localhost:9200") #TODO connections to remote setups
conn.request('GET', '/_status', '')
resp = conn.getresponse()
content = json.loads(resp.read())
for indexdetail in content["indices"]: #TODO check out if better search method exists
tname=indexdetail
fresult=re.findall("[^$]*\$[^$]*",tname)
if fresult and (tname in fresult):
params=dollarSeparate(tname)
try:
cubes[tname]=ElandraCube(keyspace=params[0],tablename=params[1])
perr( "loaded cube "+unicode( tname));perr('\n')
except:
perr( "cube creation failed for "+unicode( tname));perr('\n')
init_done=True
print cubes
return {"status":"ok"}
# /insert/?keyspace=k1&tablename=t1 -d{"c1":val1,"c2":val2",..}
@app.route("/insert",methods=['POST','PUT'])
def handleInsert():
keyspace=flask.request.args.get('keyspace','')
table=flask.request.args.get('tablename','')
data=json.loads(flask.request.get_data(as_text=True))
if not table or not keyspace:
perr("Invalid request")
return jsonify({"status":"failed","error":"No tablename or keyspace"})
cubename=(dollarAdd(dollarEscape(keyspace),table))
if(cubes.has_key(cubename)):
ecobj=cubes[cubename]
if ecobj.insert(data):
return jsonify({"status":"ok"})
return jsonify({"status":"failed","error":"Unknown error in ElandraCube insert"})
else: return jsonify({"status":"failed","error":"Cube does not exist"})
# /query/?keyspace=k1&tablename=t1 -d{"c1":val1,"c2":val2",..}
@app.route('/query',methods=['POST','PUT'])
def query():
keyspace=flask.request.args.get('keyspace','')
table=flask.request.args.get('tablename','')
data=json.loads(flask.request.get_data(as_text=True))
if not table or not keyspace:
perr("Invalid request")
return jsonify({"status":"failed","error":"No tablename or keyspace"})
cubename=(dollarAdd(dollarEscape(keyspace),table))
if(cubes.has_key(cubename)):
ecobj=cubes[cubename]
queryret=ecobj.query(data);
if queryret:
return (json.dumps(queryret))
return jsonify({"status":"failed","error":"Your Search %s did not match any index"%(json.dumps(data))})
else: return jsonify({"status":"failed","error":"Cube does not exist"})
init()
app.run(debug=True )
#####notes########
# rest api does not support custom column order, default order is used . ignore this sentence
### usage guide ###
# insert
# curl -XPUT <url>/insert/?keyspace=k1&tablename=t1 -d{"c1":val1,"c2":val2",..}
# makecube
# curl -XPUT /makecube/?keyspace=k1&tablename=t1
# query
# specify columns for only restricted ones, rest are unbounded
# curl -XPUT /query/?keyspace=k1&tablename=t1 -d{"c1":val1,"c2":val2",..}