def virtualizar_tabla_subquery(self, index: indexador_auxiliar, entorno: Tabla_de_simbolos, arbol: Arbol): print("virtualiza subquery") tablaVirtualizada: Valor = index.origen.execute(entorno, arbol) nombreTabla = self.definidorDeNombre_deTabla_basadoEnIndexador(index) tablaVirtualizada.consola_imprimirMatriz_NERY() newSimbolo: Simbolo = Simbolo(nombreTabla, TIPO.MATRIZ, tablaVirtualizada) entorno.insertar_variable(newSimbolo)
def ruta_SelectComplejo(self, entorno: Tabla_de_simbolos, arbol: Arbol): print("[Select] ruta_SelectComplejo (Go on)") V_TablaSelect = Valor(TIPO.MATRIZ, "TablaSelect") for i in self.listatablas: self.virtualizar_tabla(i, entorno, arbol) # ------------------ j = 0 for i in self.listavalores: if self.obtener_multi(i, entorno, arbol, j): break j = j + 1 # ------------------ V_TablaSelect.inicializarMatrix_boring(self.tamFilaTablaSelect, len(self.listavalores)) index = 0 for i in self.listavalores: lista: list = self.obtener_columnas(i, entorno, arbol) for m in range(len(lista)): V_TablaSelect.matriz[m][index] = lista[m] index = index + 1 self.TablaSelect = V_TablaSelect # ---------------------------------------------------------------------------------- TablaSe:Simbolo = Simbolo("TablaResult", 0, self.TablaSelect) entorno.insertar_variable(TablaSe) for i in self.listawhere: i.execute(entorno, arbol)
def virtualizar_tabla(self, index:indexador_auxiliar, entorno: Tabla_de_simbolos, arbol:Arbol): # ----------------------------------------------- # Codigo para acceder a estructuras de EDD (estan quemados por el momento) # basado en el index.origen body = j.extractTable(entorno.getBD(),index.origen) x = Meta.getNameColumns(body[0]) body[0] = x # body = [['Cod', 'estado', 'ciudad', 'zona'], [1, 'Guatemala', 'Guatemala', 'GTM'], [2, 'Cuilapa', 'Santa Rosa', 'GTM'], [3, 'San Salvador', 'San Salvador', 'SLV']] tamFila = len(body) tamColumna = len(body[0]) if tamFila > self.tamFilaTablaSelect: self.tamFilaTablaSelect = tamFila '''headers:list = ['C_1', 'C_2', 'C_3', 'C_4', 'C_5'] body:list = [ '1.1', '2.1', '3.1', '4.1', '5.1', '1.2', '2.2', '3.2', '4.2', '5.2', '1.3', '2.3', '3.3', '4.3', '5.3' ]''' # ----------------------------------------------- nombreTabla = self. definidorDeNombre_deTabla_basadoEnIndexador(index) tablaVirtualizada:Valor = Valor(TIPO.MATRIZ, nombreTabla) tablaVirtualizada.inicializarMatrix_boring(tamFila, tamColumna) tablaVirtualizada.setearMatriz_byJespino(body) #tablaVirtualizada.establecer_encabezados(headers) #tablaVirtualizada.setear_body_byList_MATRIZ(body) # self.consolaInterna = tablaVirtualizada.consola_imprimirMatriz_NERY() tablaVirtualizada.consola_imprimirMatriz_NERY() newSimbolo:Simbolo = Simbolo(nombreTabla, TIPO.MATRIZ, tablaVirtualizada) entorno.insertar_variable(newSimbolo) TSreport = ReporteTS( nombreTabla, "Tabla", "Select", 1, 1 ) arbol.ReporteTS.append(TSreport)
def execute(self, entorno: Tabla_de_simbolos, arbol: Arbol): indentificador = self.indentificador value: Valor = Valor(TIPO.LISTA, indentificador) lista = [] for i in self.ListaTipos: val: Valor = i.execute(entorno, arbol) value.insert_tipo_toType(str(val.data)) lista.append(str(val.data)) simbol: Simbolo = Simbolo(indentificador, TIPO.LISTA, value) entorno.insertar_variable(simbol) arbol.console.append("\n" + "Type: " + indentificador + " --> Valores: " + str(lista) + "\n") return
def execute(self, entorno: Tabla_de_simbolos, arbol: Arbol): if self.tipocondicionante == "where": self.condicionante.execute(entorno, arbol) return if self.tipocondicionante == "ORDER": TablaResult: Valor = entorno.obtener_varibale("TablaResult") TablaResult.inicializarPrettybabe() consola = TablaResult.order(str(self.condicionante.referencia), str(self.extra1)) simbol: Simbolo = Simbolo("TablaResult", 0, TablaResult) entorno.insertar_variable(simbol) arbol.console.append("\n" + consola + "\n") if self.tipocondicionante == "LIMIT": limitador = self.condicionante.execute(entorno, arbol) TablaResult: Valor = entorno.obtener_varibale("TablaResult") TablaResult.inicializarPrettybabe() consola = TablaResult.limit(int(limitador.data)) simbol: Simbolo = Simbolo("TablaResult", 0, TablaResult) entorno.insertar_variable(simbol) arbol.console.append("\n" + consola + "\n") val: Valor = Valor(3, False) return val
def NuevoAmbito(self): nuevoAmito = [Simbolo("VACIO", 2, Valor(2, "VACIO"))] self.Pila_de_tablas.append(nuevoAmito)
def execute(self, entorno: Tabla_de_simbolos, arbol: Arbol): izquierdo: indexador_auxiliar = self.izq derecho: Valor = self.der.execute(entorno, arbol) if self.tipoOperaRelacional == "=": if entorno.varibaleExiste("TablaResult"): TablaResult: Valor = entorno.obtener_varibale("TablaResult") TablaResult.inicializarPrettybabe() TablaResult.filtrarWhere("=", izquierdo.referencia, derecho.data) simbol: Simbolo = Simbolo("TablaResult", 0, TablaResult) entorno.insertar_variable(simbol) retorno: bool = not (TablaResult.matriResult_isEmpty()) arbol.console.append("\n" + TablaResult.inicializarPrettybabe() + "\n") print(str(retorno) + " <--------------") return Valor(3, retorno) else: # Codigo de Pablo # Se crea una lista que contendra o no las llaves primarias que cumplan la condicion registers = [] ''' Se obtiene la tabla, el indice de la columna que especifica el lado izquierdo de la operacion relacional y las llaves primarias ''' table = entorno.gettable() pks = Meta.getPksIndex(table[0]) column = Meta.getNumberColumnByName(izquierdo.get_origen(), table[0]) # Si la columna existe if column != -1: # Se recorre cada uno de los registros de la tabla for row in range(len(table)): # Si el registro coincide con el valor if table[row][column] == derecho.data: # Si no hay llaves primarias en la tabla if not pks: registers.append(str([row])) # Si hay llaves primarias en la tabla else: inner = [] for pk in pks: inner.append(str(table[row][pk]) + '|') registers.append(inner) # Se devuelven los valores de las llaves primarias de las filas que cumplen la condicion o es vacia return registers # Si la columna no existe else: ''' ______ _____ _____ ____ _____ | ____| __ \| __ \ / __ \| __ \ | |__ | |__) | |__) | | | | |__) | | __| | _ /| _ /| | | | _ / | |____| | \ \| | \ \| |__| | | \ \ |______|_| \_\_| \_\\____/|_| \_\ Descripcion: La columna especificada izquierdo.get_origen() no existe. ''' Error: ErroresSemanticos = ErroresSemanticos( "XX01: La columna especificada izquierdo.get_origen() no existe", self.linea, self.columna, 'Operaciones Relacionales') arbol.ErroresSemanticos.append(Error) print( 'La columna especificada izquierdo.get_origen() no existe' ) return None elif self.tipoOperaRelacional == "u:=": return {izquierdo: self.der}