예제 #1
0
    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')
예제 #2
0
    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'
예제 #3
0
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])
예제 #4
0
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])
예제 #5
0
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])
예제 #6
0
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])
예제 #7
0
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])
예제 #8
0
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])
예제 #9
0
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])
예제 #10
0
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])
예제 #11
0
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])
예제 #12
0
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])
예제 #13
0
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])
예제 #14
0
파일: Gramatica2.py 프로젝트: vkslax/tytus
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])
예제 #15
0
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])
예제 #16
0
파일: Gramatica2.py 프로젝트: vkslax/tytus
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])
예제 #17
0
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])