def where2id(self, entorno, tablas,result): 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 if val1 == nombre: encontrado1 += 1 tipo1 = columna.tipo nomtabla1 = tabla.nombre nomtabla1 = nomtabla1.replace('_' + entorno.getDataBase(), '') i = i + 1 continue if val2 == nombre: encontrado2 += 1 tipo2 = columna.tipo nomtabla2 = tabla.nombre nomtabla2 = nomtabla2.replace('_' + entorno.getDataBase(), '') i = i + 1 continue i = i + 1 for i in range(0,len(self.encabezado)): nombrediv=self.encabezado[i].split('_') nombrecol=nombrediv[0] if val1 == nombrecol: nocol1=i i=i+1 continue if val2==nombrecol: nocol2=i i = i + 1 continue if encontrado1 == 1 and encontrado2 == 1: for i in range(0, len(result)): dato1 = result[i][nocol1] dato2 = result[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(result[i]) elif op in ('or', 'and', 'not'): nuevaop = Logica(expi, expd, op); if nuevaop.getval(entorno): 'Agrego la fila al resultado' filtrado.append(result[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')
def execwhere(self, entorno, tablas,result): 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 isinstance(exp1, Terminal) and isinstance(exp2, Terminal): if exp1.tipo.tipo == 'identificador' and exp2.tipo.tipo == 'identificador': return self.where2id(entorno, tablas,result) if isinstance(exp1, Terminal): if (exp1.tipo.tipo == 'identificador'): val = exp1.getval(entorno) posid = 1 if isinstance(exp2, Terminal): if (exp2.tipo.tipo == 'identificador'): val = exp2.getval(entorno) posid = 2 for tabla in tablas: columnas = tabla.valor i = 0 for columna in columnas: nombre = columna.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: for i in range(0, len(result)): dato = result[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(result[i]) elif op in ('or', 'and', 'not'): nuevaop = Logica(expi, expd, op); if nuevaop.getval(entorno): 'Agrego la fila al resultado' filtrado.append(result[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 p_EXPT16(t): 'EXP : default' listaBNF.append("EXP ::= " + str(t[1]).lower()) tipo = Tipo('default', t[1], len(t[1]), -1) tipo.getTipo() t[0] = Terminal(tipo, t[1])
def p_EXPT17(t): 'EXP : idPunto' listaBNF.append("EXP ::= " + str(t[1])) tipo = Tipo('acceso', t[1], len(t[1]), -1) tipo.getTipo() t[0] = Terminal(tipo, t[1])
def p_EXPT13(t): 'EXP : interval cadena' listaBNF.append("EXP ::= interval '" + str(t[2]) + "'") tipo = Tipo('interval', t[2], len(t[2]), -1) tipo.getTipo() t[0] = Terminal(tipo, t[2])
def p_EXPT14(t): 'EXP : cadena as TIPO' listaBNF.append("EXP ::= '" + str(t[1]) + "' as TIPO") # aqui es en donde va el convert t[0] = Terminal(t[3], t[1])
def p_EXPT11(t): 'EXP : current_date' listaBNF.append("EXP ::= " + str(t[1]).lower()) tipo = Tipo('date', t[1], len(t[1]), -1) tipo.getTipo() t[0] = Terminal(tipo, t[1])
def p_EXPT4(t): 'EXP : cadenaString' listaBNF.append("EXP ::= \"" + str(t[1]) + "\"") tipo = Tipo('varchar', t[1], len(t[1]), -1) tipo.getTipo() t[0] = Terminal(tipo, t[1])
def p_EXPT9(t): 'EXP : null' listaBNF.append("EXP ::= " + str(t[1]).lower()) tipo = Tipo('indefinido', t[1], len(t[1]), -1) tipo.getTipo() t[0] = Terminal(tipo, t[1])
def p_EXPT10(t): 'EXP : current_time' listaBNF.append("EXP ::= " + str(t[1]).lower()) tipo = Tipo('time without time zone', t[1], len(t[1]), -1) tipo.getTipo() t[0] = Terminal(tipo, t[1])
def p_EXPT8(t): 'EXP : multiplicacion %prec lsel' listaBNF.append("EXP ::= * ") tipo = Tipo('todo', t[1], len(t[1]), -1) tipo.getTipo() t[0] = Terminal(tipo, t[1])
def p_EXPT7(t): 'EXP : id' listaBNF.append("EXP ::= " + str(t[1]).lower()) tipo = Tipo('identificador', t[1], len(t[1]), -1) tipo.getTipo() t[0] = Terminal(tipo, t[1])
def p_EXPT6(t): 'EXP : false' listaBNF.append("EXP ::= " + str(t[1]).lower()) tipo = Tipo('boolean', t[1], len(t[1]), -1) tipo.getTipo() t[0] = Terminal(tipo, t[1])
def p_EXPT1(t): 'EXP : int' listaBNF.append("EXP ::= " + str(t[1])) tipo = Tipo('int', t[1], len(str(t[1])), -1) tipo.getTipo() t[0] = Terminal(tipo, t[1])
def p_EXPT12(t): 'EXP : timestamp cadena' listaBNF.append("EXP ::= timestamp '" + str(t[2]) + "'") tipo = Tipo('timestamp without time zone', t[2], len(t[2]), -1) tipo.getTipo() t[0] = Terminal(tipo, t[2])
def p_EXPT2(t): 'EXP : decimales' listaBNF.append("EXP ::= " + str(t[1])) tipo = Tipo('decimal', t[1], len(str(t[1])), -1) tipo.getTipo() t[0] = Terminal(tipo, t[1])
def p_EXPT3(t): 'EXP : cadena' listaBNF.append("EXP ::= '" + str(t[1]) + "'") tipo = Tipo('varchar', t[1], len(t[1]), -1) tipo.getTipo() t[0] = Terminal(tipo, t[1])