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 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 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')