Пример #1
0
    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'
Пример #2
0
    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")
Пример #3
0
    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')