def p_EXPV1(t): 'EXP : EXP like cadena %prec predicates' tipo = Tipo('varchar', t[3], -1, -1) tipo.getTipo() ter = Terminal(tipo, t[3]) t[0] = Relacional(t[1], ter, 'like')
def p_EXPV2(t): 'EXP : EXP not like cadena %prec predicates ' tipo = Tipo('varchar', t[4], -1, -1) tipo.getTipo() ter = Terminal(tipo, t[4]) rel = Relacional(t[1], ter, 'like') t[0] = Unaria(rel, 'not')
def p_EXP2(t): '''EXP : EXP is not null %prec predicates | EXP is null %prec predicates | EXP isnull %prec predicates | EXP notnull %prec predicates | EXP is true %prec predicates | EXP is not true %prec predicates | EXP is false %prec predicates | EXP is not false %prec predicates | EXP is unknown %prec predicates | EXP is not unknown %prec predicates''' if len(t) == 5: t[0] = Relacional(t[1], t[4], '<>') elif len(t) == 4: t[0] = Relacional(t[1], t[3], '=') elif len(t) == 3: if t[2].lower() == 'isnull': t[0] = Relacional(t[1], 'null', '=') else: t[0] = Relacional(t[1], 'null', '<>')
def p_EXP3(t): '''EXP : EXP mas EXP | EXP menos EXP | EXP multiplicacion EXP | EXP division EXP | EXP modulo EXP | EXP elevado EXP | EXP and EXP | EXP or EXP | EXP mayor EXP | EXP menor EXP | EXP mayor_igual EXP | EXP menor_igual EXP | EXP igual EXP | EXP diferente1 EXP | EXP diferente2 EXP | EXP between EXP %prec predicates''' if t[2] == '+': listaBNF.append("EXP ::= EXP " + str(t[2]) + " EXP") t[0] = Aritmetica(t[1], t[3], '+') elif t[2] == '-': listaBNF.append("EXP ::= EXP " + str(t[2]) + " EXP") t[0] = Aritmetica(t[1], t[3], '-') elif t[2] == '*': listaBNF.append("EXP ::= EXP " + str(t[2]) + " EXP") t[0] = Aritmetica(t[1], t[3], '*') elif t[2] == '/': listaBNF.append("EXP ::= EXP " + str(t[2]) + " EXP") t[0] = Aritmetica(t[1], t[3], '/') elif t[2] == '>': listaBNF.append("EXP ::= EXP > EXP") t[0] = Relacional(t[1], t[3], '>') elif t[2] == '<': listaBNF.append("EXP ::= EXP < EXP") t[0] = Relacional(t[1], t[3], '<') elif t[2] == '>=': listaBNF.append("EXP ::= EXP >= EXP") t[0] = Relacional(t[1], t[3], '>=') elif t[2] == '<=': listaBNF.append("EXP ::= EXP <= EXP") t[0] = Relacional(t[1], t[3], '<=') elif t[2] == '<>' or t[2] == '!=': listaBNF.append("EXP ::= EXP <> EXP") t[0] = Relacional(t[1], t[3], '<>') elif t[2] == '=': listaBNF.append("EXP ::= EXP = EXP") t[0] = Relacional(t[1], t[3], '=') elif t[2] == 'or': listaBNF.append("EXP ::= EXP " + str(t[2]) + " EXP") t[0] = Logica(t[1], t[3], 'or') elif t[2] == 'and': listaBNF.append("EXP ::= EXP " + str(t[2]) + " EXP") t[0] = Logica(t[1], t[3], 'and')
def p_EXP3(t): '''EXP : EXP mas EXP | EXP menos EXP | EXP multiplicacion EXP | EXP division EXP | EXP modulo EXP | EXP elevado EXP | EXP and EXP | EXP or EXP | EXP mayor EXP | EXP menor EXP | EXP mayor_igual EXP | EXP menor_igual EXP | EXP igual EXP | EXP diferente1 EXP | EXP diferente2 EXP | EXP punto EXP | EXP between EXP %prec predicates''' if t[2] == '+': t[0] = Aritmetica(t[1], t[3], '+') elif t[2] == '-': t[0] = Aritmetica(t[1], t[3], '-') elif t[2] == '*': t[0] = Aritmetica(t[1], t[3], '*') elif t[2] == '/': t[0] = Aritmetica(t[1], t[3], '/') elif t[2] == '>': t[0] = Relacional(t[1], t[3], '>') elif t[2] == '<': t[0] = Relacional(t[1], t[3], '<') elif t[2] == '>=': t[0] = Relacional(t[1], t[3], '>=') elif t[2] == '<=': t[0] = Relacional(t[1], t[3], '<=') elif t[2] == '<>' or t[2] == '!=': t[0] = Relacional(t[1], t[3], '<>') elif t[2] == '==': t[0] = Relacional(t[1], t[3], '==') elif t[2] == 'or': t[0] = Logica(t[1], t[3], 'or') elif t[2] == 'and': t[0] = Logica(t[1], t[3], 'and')
def resolver(self,expresion,entorno,result,tablas,fila): #para expresion binaria if not isinstance(expresion,Terminal) and not isinstance(expresion,Unaria) and not isinstance(expresion,FuncionesNativas) and not isinstance(expresion,Identificador): 'resuelvo logicas,aritmeticas y relacionales' exp1=expresion.exp1 exp2=expresion.exp2 res1=self.resolver(exp1,entorno,result,tablas,fila) res2=self.resolver(exp2,entorno,result,tablas,fila) op=None if isinstance(expresion,Logica): op=Logica(res1, res2, expresion.operador) if isinstance(expresion,Relacional): op =Relacional(res1, res2, expresion.operador) if isinstance(expresion,Aritmetica): op =Aritmetica(res1, res2, expresion.operador) return op.getval(entorno) elif isinstance(expresion,Unaria): #para expresion unaria exp=expresion.exp1 res= self.resolver(exp,entorno,result,tablas,fila) op = Unaria(res,expresion.operador) return op.getval(entorno) else: 'aqui resuelvo los terminales y funciones' if isinstance(expresion,Identificador): '' term=expresion.getval(entorno) if term!= None: return term else: for i in range(0, len(self.encabezado)): nombrediv = self.encabezado[i].split('.') nombrecol = nombrediv[0] if expresion.nombre == nombrecol: dato=result[fila][i] tipo = None if len(nombrediv) > 1: tipo = self.gettipo(entorno, tablas, nombrediv[0], nombrediv[1]) else: tipo = self.gettipo(entorno, tablas, nombrediv[0]) term=Terminal(tipo,dato) return term elif isinstance(expresion,Terminal): if expresion.tipo.tipo=='acceso': return self.getacceso(entorno,expresion,result,fila,tablas) else: return expresion elif isinstance(expresion,FuncionesNativas): if expresion.identificador.lower()=='count': t=Tipo('integer',None,-1,-1) self.agregacion=1 return Terminal(t,len(result)) tempexp=[] for exp in expresion.expresiones: tempexp.append(exp) for j in range(0, len(expresion.expresiones)): if isinstance(expresion.expresiones[j],Identificador): val = expresion.expresiones[j].nombre for i in range(0, len(self.encabezado)): nombrediv = self.encabezado[i].split('.') nombrecol = nombrediv[0] if val == nombrecol: tipo=None if len(nombrediv)>1: tipo = self.gettipo(entorno, tablas, val,nombrediv[1]) else: tipo = self.gettipo(entorno, tablas, val) dato = result[fila][i] tempexp[j]=Terminal(tipo,dato) func=FuncionesNativas(expresion.identificador, tempexp) return func.getval(entorno)
def resolver(self, expresion, entorno, result, tabla, fila): # para expresion binaria if not isinstance(expresion, Terminal) and not isinstance( expresion, Unaria) and not isinstance(expresion, FuncionesNativas): 'resuelvo logicas,aritmeticas y relacionales' exp1 = expresion.exp1 exp2 = expresion.exp2 res1 = self.resolver(exp1, entorno, result, tabla, fila) res2 = self.resolver(exp2, entorno, result, tabla, fila) op = None if isinstance(expresion, Logica): op = Logica(res1, res2, expresion.operador) if isinstance(expresion, Relacional): op = Relacional(res1, res2, expresion.operador) if isinstance(expresion, Aritmetica): op = Aritmetica(res1, res2, expresion.operador) return op.getval(entorno) elif isinstance(expresion, Unaria): # para expresion unaria exp = expresion.exp1 res = self.resolver(exp, entorno, result, tabla, fila) op = Unaria(res, expresion.operador) return op.getval(entorno) else: 'aqui resuelvo los terminales y funciones' if isinstance(expresion, Terminal): if expresion.tipo.tipo == 'identificador': for i in range(0, len(self.encabezado)): nombrediv = self.encabezado[i].split('.') nombrecol = nombrediv[0] if expresion.getval(entorno).valor == nombrecol: dato = result[fila][i] tipo = None tipo = self.gettipo(entorno, tabla, nombrediv[0]) term = Terminal(tipo, dato) return term elif expresion.tipo.tipo == 'acceso': for i in range(0, len(self.encabezado)): nombrediv = self.encabezado[i].split('.') nombrecol = nombrediv[0] nombretabla = nombrediv[1] nombrecol = nombretabla + '.' + nombrecol if expresion.getval(entorno).valor == nombrecol: dato = result[fila][i] tipo = None tipo = self.gettipo(entorno, tabla, nombrediv[0]) term = Terminal(tipo, dato) return term.getval(entorno) else: return expresion elif isinstance(expresion, FuncionesNativas): tempexp = [] for exp in expresion.expresiones: tempexp.append(exp) for j in range(0, len(expresion.expresiones)): if expresion.expresiones[j].tipo.tipo == 'identificador': val = expresion.expresiones[j].getval(entorno).valor for i in range(0, len(self.encabezado)): nombrediv = self.encabezado[i].split('.') nombrecol = nombrediv[0] if val == nombrecol: tipo = None tipo = self.gettipo(entorno, tabla, val) dato = result[fila][i] tempexp[j] = Terminal(tipo, dato) func = FuncionesNativas(expresion.identificador, tempexp) return func.getval(entorno)
def wheredelete(self,entorno,tablas): filtrado=[] exp1:Expresion exp2:Expresion colres=[] tipo='' isid=False posid=-1 if isinstance(self.exps, Relacional) or isinstance(self.exps,Logica): encontrado=0 nocol=-1 nomtabla='' 'realizar operacion' exp1=self.exps.exp1 exp2=self.exps.exp2 op=self.exps.operador if (op==">"): op="<" elif (op=="<"): op=">" elif (op=="!="): op="=" elif (op=="="): op="!=" elif (op==">="): op="<=" elif (op=="<="): op=">=" else: print("") val='' if (exp1.tipo.tipo=='identificador'): val = exp1.getval(entorno) posid = 1 else: return ("ERROR >> En la instrucción Delete hay problema con la expresión, debe ingresar un identificador antes del operador") for tabla in tablas: columnas=tabla.valor i=0 for columna in columnas: nombre = columna.nombre self.encabezados.append(nombre) if val == nombre: encontrado+=1 tipo=columna.tipo nocol=i nomtabla=tabla.nombre nomtabla=nomtabla.replace('_'+entorno.getDataBase(),'') continue i=i+1 if encontrado==1 and nocol>-1: datos=DBMS.extractTable(entorno.getDataBase(),nomtabla) if datos!= None: self.nombreres = nomtabla for i in range(0,len(datos)): dato=datos[i][nocol] expi = Terminal(tipo, dato) expd = exp2 if op in ('>','<','>=','<=','='): nuevaop = Relacional(expi,expd,op); if nuevaop.getval(entorno): 'Agrego la fila al resultado' filtrado.append(datos[i]) elif op in ('or','and','not'): nuevaop = Logica(expi,expd,op); if nuevaop.getval(entorno): 'Agrego la fila al resultado' filtrado.append(datos[i]) else: return ('ERROR >> En la instrucción Delete, el resultado del where no es booleano') return filtrado else: return ("ERROR >> En la instrucción Delete, el nombre de las columnas es ambiguo") else: return ("ERROR >> En la instrucción Delete, no ingreso una expresión relacional")
def execwhere(self,entorno,tablas): filtrado=[] exp1:Expresion exp2:Expresion colres=[] tipo='' isid=False posid=-1 if isinstance(self.where, Relacional) or isinstance(self.where,Logica): encontrado=0 nocol=-1 nomtabla='' 'realizar operacion' exp1=self.where.exp1 exp2=self.where.exp2 op=self.where.operador val='' if(exp1.tipo.tipo=='identificador') and exp2.tipo.tipo=='identificador': return self.where2id(entorno,tablas) elif (exp1.tipo.tipo=='identificador'): val = exp1.getval(entorno) posid = 1 else: val = exp2.getval(entorno) posid=2 for tabla in tablas: columnas=tabla.valor i=0 for columna in columnas: nombre = columna.nombre self.encabezado.append(nombre) if val == nombre: encontrado+=1 tipo=columna.tipo nocol=i nomtabla=tabla.nombre nomtabla=nomtabla.replace('_'+entorno.getDataBase(),'') continue i=i+1 if encontrado==1 and nocol>-1: datos=DBMS.extractTable(entorno.getDataBase(),nomtabla) if datos!= None: self.nombreres = nomtabla for i in range(0,len(datos)): dato=datos[i][nocol] expi = None expd = None if posid == 1: expi = Terminal(tipo, dato) expd = exp2 else: expi = exp1 expd = Terminal(tipo, dato) if op in ('>','<','>=','<=','='): nuevaop = Relacional(expi,expd,op); if nuevaop.getval(entorno): 'Agrego la fila al resultado' filtrado.append(datos[i]) elif op in ('or','and','not'): nuevaop = Logica(expi,expd,op); if nuevaop.getval(entorno): 'Agrego la fila al resultado' filtrado.append(datos[i]) else: variables.consola.insert('Error el resultado del where no es booleano \n') return filtrado else: variables.consola.insert('Error el nombre de las columnas es ambiguo \n') elif isinstance(self.where,Unaria): 'busco columna y resulvo unaria' else: 'ya veremos dijo el ciego'
def where2id(self,entorno,tablas): filtrado=[] exp1:Expresion exp2:Expresion colres=[] tipo1='' tipo2= '' encontrado1=0 encontrado2= 0 nocol1 = -1 nocol2 = -1 nomtabla1 = '' nomtabla2 = '' 'realizar operacion' exp1=self.where.exp1 exp2=self.where.exp2 val1=exp1.getval(entorno) val2=exp2.getval(entorno) op=self.where.operador for tabla in tablas: columnas=tabla.valor i=0 for columna in columnas: nombre = columna.nombre self.encabezado.append(nombre) if val1 == nombre: encontrado1+=1 tipo1=columna.tipo nocol1=i nomtabla1=tabla.nombre nomtabla1=nomtabla1.replace('_'+entorno.getDataBase(),'') i=i+1 continue if val2 == nombre: encontrado2+=1 tipo2=columna.tipo nocol2 = i nomtabla2=tabla.nombre nomtabla2=nomtabla2.replace('_'+entorno.getDataBase(),'') i=i+1 continue i=i+1 if encontrado1 == 1 and encontrado2 == 1: datos1 = DBMS.extractTable(entorno.getDataBase(),nomtabla1) datos2 = DBMS.extractTable(entorno.getDataBase(), nomtabla2) if datos1 == datos2: self.nombreres=nomtabla1 for i in range(0,len(datos1)): dato1=datos1[i][nocol1] dato2=datos1[i][nocol2] expi = Terminal(tipo1, dato1) expd = Terminal(tipo2, dato2) if op in ('>','<','>=','<=','='): nuevaop = Relacional(expi,expd,op); if nuevaop.getval(entorno): 'Agrego la fila al resultado' filtrado.append(datos1[i]) elif op in ('or','and','not'): nuevaop = Logica(expi,expd,op); if nuevaop.getval(entorno): 'Agrego la fila al resultado' filtrado.append(datos1[i]) else: variables.consola.insert('Error el resultado del where no es booleano \n') return filtrado else: variables.consola.insert('Error el nombre de las columnas es ambiguo \n')