예제 #1
0
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')
예제 #2
0
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')
예제 #3
0
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', '<>')
예제 #4
0
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 &#62; EXP")
        t[0] = Relacional(t[1], t[3], '>')
    elif t[2] == '<':
        listaBNF.append("EXP ::= EXP &#60; EXP")
        t[0] = Relacional(t[1], t[3], '<')
    elif t[2] == '>=':
        listaBNF.append("EXP ::= EXP &#62;&#61; EXP")
        t[0] = Relacional(t[1], t[3], '>=')
    elif t[2] == '<=':
        listaBNF.append("EXP ::= EXP &#60;&#61; EXP")
        t[0] = Relacional(t[1], t[3], '<=')
    elif t[2] == '<>' or t[2] == '!=':
        listaBNF.append("EXP ::= EXP &#60;&#62; EXP")
        t[0] = Relacional(t[1], t[3], '<>')
    elif t[2] == '=':
        listaBNF.append("EXP ::= EXP &#61; 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')
예제 #5
0
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')
예제 #6
0
    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)
예제 #7
0
파일: Delete.py 프로젝트: edgarJ91/tytus
    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)
예제 #8
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")
예제 #9
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'
예제 #10
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')