defp_compare_expresion(t): ''' compare : NAME BIGGER NAME | NAME SMALLER NAME | NAME EQUAL NAME''' t[0]=node('[COMPARE]') t[0].add(node(t[2])) t[0].add(node(t[1])) t[0].add(node(t[3]))
defp_compare_expresion_query(t): ''' compare : NAME BIGGER query | NAME SMALLER query | NAME EQUAL query''' t[0]=node('[COMPARE]') t[0].add(node(t[2])) t[0].add(node(t[1])) t[0].add(t[3])
defQuery_sql_set(node): st, dataset, condition = [], [], [] Flag = 0# 是查询集合还是查询满足条件的数字 ordered = [0,"NONE"] for ch in node.getchildren(): if ch.getdata() == "[FIELD]": st=ch.getchildren() if ch.getdata() == "[NUMBER]": st = ch.getchildren()[0].getchildren()[0].getdata() Flag, type = 1, ch.getchildren()[0].getdata()[1:-1] if ch.getdata() == "[TABLE]": dataset = ch.getchildren()[0].getdata() if ch.getdata() == "[ORDER]": ordered = [1,ch.getchildren()] if ch.getdata() == "[WHERE]": now=ch.getchildren()[0] for Or in now.getchildren(): # 合取范式的每一个极小项 Insert=[] # 每一个元素是一个三元组,表示一个运算表达式,元素之间是或的关系 for compare in Or.getchildren(): ins, val = [], compare.getchildren() name, val_to_compare = val[1].getdata(),get_val(val[2]) if val[0].getdata() == "=": ins = [name,val_to_compare,val_to_compare] elif val[0].getdata() == ">": ins = [name,val_to_compare+EPS,INF] else : ins = [name,-INF,val_to_compare-EPS] Insert.append(ins) condition.append(Insert) name = dataset + '.csv' # dtSet = pd.DataFrame(csv.reader(open(name, 'r'))) # if Flag == 0: return naive_find(st,dtSet,condition,ordered) else : return naive_find_num(st,dtSet,condition,type)
在表中对信息的查找与筛选
只要注意主析取范式中对条件的交并之间的细节处理,这一块并不是很难写的内容,这里不再过多展示
关键字排序
按需模拟即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
defOrder(data,Key): val = [] for key in Key: # print(key.getdata(),key.getorder()) for i inrange(0, len(data[0])): if data[0][i] == key.getdata(): if key.getorder() == 0: # 这里直接取负的话,0是保持不变的,所以需要整体平移一下 val.append(i+1) else: val.append(-(i+1)) break defsort_key(item): returntuple(int(item[k-1]) if k>=0else -int(item[k+1]) for k in val) data[1:] = sorted(data[1:], key=sort_key) return data
如此我们就实现了一个简易的sql编译器
结果展示
1
SELECTAVERAGE(Math) FROM st
7
1
SELECTNoFROM st WHERE Chinese=(SELECT MAX(Chinese) FROM st)
1
SELECT * FROM st ORDERBY Chinese , NoDESC
5
1
SELECT * FROM st WHERE Chinese < 100 OR Math<100 AND English>100 AND Total>100 OR Math >120