def extractTable(self, name: str, noLine, noColumn) -> list: """ Method to get a list of records from a table :param name: The name of table :param noLine: The instruction line :param noColumn: The instruction column :return: Returns a list of records """ database = SymbolTable().useDatabase if not database: desc = f": Database not selected" ErrorController().add(4, 'Execution', desc, noLine, noColumn) return None if not TypeChecker().searchTable(database, name): desc = f": Table {name} does not exist" ErrorController().add(27, 'Execution', desc, noLine, noColumn) return None # TODO Revisar Esto didier, que con lower me da problema al buscar tablas y base de datos data = data_mode(database.mode).extractTable(database.name.lower(), name.lower()) if data == None: ErrorController().add(34, 'Execution', '', noLine, noColumn) return None return data
def deleteDatabase(self, name: str, line, column): """ Method to remove a database in type checker :param name: The name of the database :param line: The instruction line :param column: The instruction column :return: Returns nothing """ database = self.searchDatabase(name) if not database: desc = f": Database {name} does not exist" ErrorController().add(35, 'Execution', desc, line, column) return dbStatement = data_mode(database.mode).dropDatabase(name.lower()) if dbStatement == 0: self._typeCheckerList.remove(database) self.writeFile() SymbolTable().delete(database) DataWindow().consoleText( 'Query returned successfully: Database deleted') elif dbStatement == 1: desc = f": Can't drop database {name}" ErrorController().add(34, 'Execution', desc, line, column) elif dbStatement == 2: desc = f": Database {name} does not exist" ErrorController().add(35, 'Execution', desc, line, column)
def extractRow(self, name: str, columns: list, noLine, noColumn) -> list: """ Method to extract a record from a table :param name: The name of table :param columns: List with number of columns of primary keys :param noLine: The instruction line :param noColumn: The instruction column :return: Returns nothing """ database = SymbolTable().useDatabase if not database: desc = f": Database not selected" ErrorController().add(4, 'Execution', desc, noLine, noColumn) return None if not TypeChecker().searchTable(database, name): desc = f": Table {name} does not exist" ErrorController().add(27, 'Execution', desc, noLine, noColumn) return None data = data_mode(database.mode).extractRow(database.name.lower(), name.lower(), columns) if data == None: ErrorController().add(34, 'Execution', '', noLine, noColumn) return None return data
def compile(self, environment): value1 = self.value1.compile(environment) value2 = self.value2.compile(environment) if isinstance(value1, PrimitiveData): if value1.data_type == DATA_TYPE.STRING: value1.value = f"\'{value1.value}\'" if isinstance(value1, PrimitiveData): if value2.data_type == DATA_TYPE.STRING: value2.value = f"\'{value2.value}\'" try: temporal = ThreeAddressCode().newTemp() ThreeAddressCode().addCode( f"{temporal} = {value1.value} {getOperador(self.operator)} {value2.value}" ) return PrimitiveData(DATA_TYPE.NUMBER, temporal, self.line, self.column) except TypeError: desc = "Error de tipo" ErrorController().add(34, 'Execution', desc, self.line, self.column) except: desc = "FATAL ERROR, Relop, no acepta ids" ErrorController().add(34, 'Execution', desc, self.line, self.column)
def createDatabase(self, database: Database, line, column): """ Method to create a database in type checker :param database: Database object :param line: The instruction line :param column: The instruction column :return: Returns nothing """ if self.searchDatabase(database.name): desc = f": Database {database.name} already exists" ErrorController().add(30, 'Execution', desc, line, column) return dbStatement = data_mode(database.mode).createDatabase( database.name.lower()) if dbStatement == 0: self._typeCheckerList.append(database) self.writeFile() SymbolTable().add(database, 'New Database', 'Database', 'Global', None, line, column) DataWindow().consoleText( 'Query returned successfully: Database created') elif dbStatement == 1: desc = f": Can't create database {database.name}" ErrorController().add(34, 'Execution', desc, line, column) elif dbStatement == 2: desc = f": Database {database.name} already exists" ErrorController().add(30, 'Execution', desc, line, column)
def process(self, environment): try: val = None result = 0 lista1 = [] i = self.down.process(environment).value j = self.up.process(environment).value if isinstance(self.value, Identifiers): val = self.value.process(environment) result = [columns[i:j] for columns in val[0]] lista1.append(result) lista1.append(self.alias) return lista1 else: cadena = self.value.process(environment).value substr = cadena[i:j] return PrimitiveData(DATA_TYPE.STRING, substr, self.line, self.column) except TypeError: desc = "Tipo de dato invalido para Substring" ErrorController().add(37, 'Execution', desc, self.line, self.column) return except: desc = "FATAL ERROR --- StringFuncs" ErrorController().add(34, 'Execution', desc, self.line, self.column)
def process(self, environment): try: if self.data_type.lower() == "integer": if isinstance(self.value, Identifiers): lista1 = [] val = self.value.process(environment) result = [int(columns) for columns in val[0]] lista1.append(result) lista1.append(self.alias) return lista1 else: cadena = self.value.process(environment).value return PrimitiveData(DATA_TYPE.NUMBER, int(cadena), self.line, self.column) else: if isinstance(self.value, Identifiers): lista1 = [] val = self.value.process(environment) result = [str(columns) for columns in val[0]] lista1.append(result) lista1.append(self.alias) return lista1 else: cadena = self.value.process(environment).value return PrimitiveData(DATA_TYPE.STRING, cadena, self.line, self.column) except TypeError: desc = "Tipo de dato invalido para Convert" ErrorController().add(37, 'Execution', desc, self.line, self.column) return except: desc = "FATAL ERROR --- StringFuncs" ErrorController().add(34, 'Execution', desc, self.line, self.column)
def addCheck(self, conditionColumn): # L (L|D)* whatColumnIs = re.search('[a-zA-z]([a-zA-z]|[0-9])*', conditionColumn.alias) bandera = False if whatColumnIs != None: whatColumnIs = whatColumnIs.group(0) for columna in self._column_list: if isinstance(columna, CreateCol): if (columna._column_name == whatColumnIs): if columna._properties != None: bandera = True columna._properties[0][ 'check_condition'] = conditionColumn break if not bandera: desc = f": Undefined column in check ()" ErrorController().add(26, 'Execution', desc, 0, 0) self._can_create_flag = False return bandera = False else: desc = f": column not given in check()" ErrorController().add(26, 'Execution', desc, 0, 0) self._can_create_flag = False return
def process(self, environment): try: index = self.pos.process(environment).value char = self.no_char.process(environment).value if isinstance(self.value, Identifiers): lista1 = [] val = self.value.process(environment) result = [(columns[:index] + chr(char) + columns[index + 1:]) for columns in val[0]] lista1.append(result) lista1.append(self.alias) return lista1 else: cadena = self.value.process(environment).value result = cadena[:index] + chr(char) + cadena[index + 1:] return PrimitiveData(DATA_TYPE.STRING, result, self.line, self.column) except TypeError: desc = "Tipo de dato invalido para SetByte" ErrorController().add(37, 'Execution', desc, self.line, self.column) return except: desc = "FATAL ERROR --- StringFuncs" ErrorController().add(34, 'Execution', desc, self.line, self.column)
def agregarCheck(self, conditionColumn, tablaId): typeChecker = TypeChecker() bandera = False tableToAlter = typeChecker.searchTable(SymbolTable().useDatabase, tablaId) # L (L|D)* whatColumnIs = re.search('[a-zA-z]([a-zA-z]|[0-9])*', conditionColumn.alias) if whatColumnIs != None: whatColumnIs = whatColumnIs.group(0) for columna in tableToAlter.columns: if (columna._name == whatColumnIs): bandera = True columna._check = conditionColumn.alias break if not bandera: desc = f": Undefined column in alter check ()" ErrorController().add(26, 'Execution', desc, 0, 0) return bandera = False else: desc = f": column not given in check()" ErrorController().add(26, 'Execution', desc, 0, 0) return typeChecker.writeFile()
def process(self, environment): try: if isinstance(self.value, Identifiers): lista1 = [] val = self.value.process(environment) result = [ hashlib.sha256(columns.encode()).hexdigest() for columns in val[0] ] lista1.append(result) lista1.append(self.alias) return lista1 else: cadena = self.value.process(environment).value result = hashlib.sha256(cadena.encode()) return PrimitiveData(DATA_TYPE.STRING, result.hexdigest(), self.line, self.column) except TypeError: desc = "Tipo de dato invalido para sha256" ErrorController().add(37, 'Execution', desc, self.line, self.column) return except: desc = "FATAL ERROR --- StringFuncs" ErrorController().add(34, 'Execution', desc, self.line, self.column)
def process(self, environment): try: val = None result = 0 lista1 = [] if isinstance(self.value, Identifiers): val = self.value.process(environment) result = [len(columns) for columns in val[0]] lista1.append(result) lista1.append(self.alias) return lista1 else: val = self.value.process(environment).value l = len(val) return PrimitiveData(DATA_TYPE.NUMBER, l, self.line, self.column) except TypeError: desc = "Tipo de dato invalido para Length" ErrorController().add(37, 'Execution', desc, self.line, self.column) return except: desc = "FATAL ERROR --- StringFuncs" ErrorController().add(34, 'Execution', desc, self.line, self.column)
def execution(input): querys = [] messages = [] DataWindow().clearProperties() result = parse(input) errors = ErrorController().getList() if len(ErrorController().getList()) == 0: for inst in result: if isinstance(inst, Select): result = inst.process(0) if isinstance(result, DataFrame): DataWindow().format_df(result) querys.append([DataWindow().headers, DataWindow().rows]) elif isinstance(result, list): DataWindow().format_table_list(result) querys.append([DataWindow().headers, [DataWindow().rows]]) else: inst.process(0) querys.append([DataWindow().headers, DataWindow().rows]) messages.append(DataWindow().data) obj = { "messages": messages, "querys": querys, "lexical": errors } return obj
def process(self, expression): value1 = self.value1.process(expression) value2 = self.value2.process(expression) operator = self.operator try: value = 0 if isinstance(value1, PrimitiveData) and isinstance( value2, PrimitiveData): if operator.lower() == "and": value = value1.value and value2.value elif operator.lower() == "or": value = value1.value or value2.value else: print("Operador no valido: " + operator) return return PrimitiveData(DATA_TYPE.BOOLEANO, value, self.line, self.column) else: data = "" if isinstance(value1, list) and isinstance(value2, list): if operator.lower() == 'and': lista_temp = [] lista_temp.append(value1[2]) lista_temp.append(value2[2]) lista_temp = self.convert_unic_list2(lista_temp) name_list = self.convert_unic_list( value1[0], value2[0]) data = f'({value1[1]}) and ({value2[1]})' return [name_list, data, lista_temp] elif operator.lower() == 'or': lista_temp = [] lista_temp.append(value1[2]) lista_temp.append(value2[2]) lista_temp = self.convert_unic_list2(lista_temp) name_list = self.convert_unic_list( value1[0], value2[0]) data = f'({value1[1]}) or ({value2[1]})' return [name_list, data, lista_temp] else: print("Operador no valido: " + operator) return else: if operator.lower() == 'and': data = f'({value1}) and ({value2})' return data elif operator.lower() == 'or': data = f'({value1}) or ({value2})' return data else: print("Operador no valido: " + operator) return except TypeError: desc = "FATAL ERROR --- LogicalOperators" ErrorController().add(34, 'Execution', desc, self.line, self.column) except: desc = "FATAL ERROR --- LogicalOperators" ErrorController().add(34, 'Execution', desc, self.line, self.column)
def p_error(p): try: # print(str(p.value)) description = ' or near ' + str(p.value) column = find_column(p) ErrorController().add(33, 'Syntactic', description, p.lineno, column) except AttributeError: # print(number_error, description) ErrorController().add(1, 'Syntactic', '', 'EOF', 'EOF')
def agregarNuevoTipo(self, tablaAMod, colAMod, nuevoTipo): typeChecker = TypeChecker() bandera = False tableToAlter = typeChecker.searchTable(SymbolTable().useDatabase, tablaAMod) tipoFinal = { '_tipoColumna': str(nuevoTipo._tipoColumna), '_paramOne': nuevoTipo._paramOne, '_paramTwo': nuevoTipo._paramTwo } for columna in tableToAlter.columns: if (columna._name == colAMod): bandera = True columna._dataType = tipoFinal break if not bandera: desc = f": Undefined column in alter type ()" ErrorController().add(26, 'Execution', desc, 0, 0) return bandera = False typeChecker.writeFile() pass
def compile(self, environment): try: i = self.down.compile(environment).value j = self.up.compile(environment).value temp = ThreeAddressCode().newTemp() val = self.value.compile(environment).value dataTemp = f"{temp} = '{val}'" cambio = False if val[0] == 't': sub = val[1:] if sub.isnumeric(): # ES UN TEMPORAL dataTemp = f"{temp} = {val}" cambio = True if cambio is False: dataTemp = f"{temp} = '{val}'" tempi = ThreeAddressCode().newTemp() tempj = ThreeAddressCode().newTemp() dataTempi = f"{tempi} = {i}" dataTempj = f"{tempj} = {j}" ThreeAddressCode().addCode(dataTemp) ThreeAddressCode().addCode(dataTempi) ThreeAddressCode().addCode(dataTempj) temporal = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temporal} = {temp}[{tempi}:{tempj}]") return PrimitiveData(DATA_TYPE.STRING, temporal, self.line, self.column) except: desc = "FATAL ERROR --- StringFuncs" ErrorController().add(34, 'Execution', desc, self.line, self.column)
def compile(self, expression): expression1 = self.value.compile(expression) type_unary_or_other = self.sign temporal = ThreeAddressCode().newTemp() try: if expression1.data_type != DATA_TYPE.NUMBER: print('error') return dataTemp = f"{temporal} = 0" if type_unary_or_other == SymbolsUnaryOrOthers.UMINUS or type_unary_or_other == SymbolsUnaryOrOthers.BITWISE_NOT: dataTemp = f"{temporal} = -{expression1.value}" elif type_unary_or_other == SymbolsUnaryOrOthers.UPLUS: dataTemp = f"{temporal} = {expression1.value}" elif type_unary_or_other == SymbolsUnaryOrOthers.SQUARE_ROOT: dataTemp = f"{temporal} = sqrt({expression1.value}) # |/" elif type_unary_or_other == SymbolsUnaryOrOthers.CUBE_ROOT: temporal1 = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temporal1} = 1 / 3") dataTemp = f"{temporal} = {expression1.value} ** {temporal1} # ||/" ThreeAddressCode().addCode(dataTemp) return PrimitiveData(DATA_TYPE.NUMBER, temporal, self.line, self.column) except: desc = "FATAL ERROR --- UnaryOrSquareExpressions" ErrorController().add(34, 'Execution', desc, self.line, self.column)
def compile(self, environment): try: temp = ThreeAddressCode().newTemp() val = self.value.compile(environment).value tempPos = ThreeAddressCode().newTemp() index = self.pos.compile(environment).value dataTemp = f"{temp} = '{val}'" cambio = False if val[0] == 't': sub = val[1:] if sub.isnumeric(): # ES UN TEMPORAL dataTemp = f"{temp} = {val}" cambio = True if cambio is False: dataTemp = f"{temp} = '{val}'" dataPos = f'{tempPos} = {index}' ThreeAddressCode().addCode(dataTemp) ThreeAddressCode().addCode(dataPos) temporal = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temporal} = ord({temp}[{tempPos}])") return PrimitiveData(DATA_TYPE.STRING, temporal, self.line, self.column) except: desc = "FATAL ERROR --- StringFuncs" ErrorController().add(34, 'Execution', desc, self.line, self.column)
def compile(self, environment): try: if self.data_type.lower() == 'integer': temp = ThreeAddressCode().newTemp() val = self.value.compile(environment).value dataTemp = f"{temp} = '{val}'" cambio = False if val[0] == 't': sub = val[1:] if sub.isnumeric(): # ES UN TEMPORAL dataTemp = f"{temp} = {val}" cambio = True if cambio is False: dataTemp = f"{temp} = '{val}'" ThreeAddressCode().addCode(dataTemp) temporal = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temporal} = int({temp})") return PrimitiveData(DATA_TYPE.STRING, temporal, self.line, self.column) else: temp = ThreeAddressCode().newTemp() val = self.value.compile(environment).value dataTemp = f"{temp} = '{val}'" ThreeAddressCode().addCode(dataTemp) temporal = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temporal} = {temp}") return PrimitiveData(DATA_TYPE.STRING, temporal, self.line, self.column) except: desc = "FATAL ERROR --- StringFuncs" ErrorController().add(34, 'Execution', desc, self.line, self.column)
def ejecutar_sql(self): global report_error global report_ast DataWindow().clearConsole() SymbolTable().destroy() ThreeAddressCode().destroy() texto = self.entrada.get('1.0', END) result = parse(texto) # jsonStr = json.dumps(result, default=lambda o: o.__dict__) #Convierte el AST a formato JSON para poder saber como se esta formando # print(result) # Imprime el AST report_error = ReportError() if len(ErrorController().getList()) > 0: messagebox.showerror('ERRORES', 'Se encontraron errores') else: result2 = parse2(texto) report_ast = result2 # ---------- TEST --------- for inst in result: # esto es por los select anidados (subquerys), no encontre otra menera # de retornar la tabla dibujada, lo hacia en mi clase # pero si lo dejaba ahi me tronaban las subquery, # prueben que no les de problema if isinstance(inst, Select): result = inst.process(0) if isinstance(result, DataFrame): DataWindow().consoleText(format_df(result)) elif isinstance(result, list): DataWindow().consoleText(format_table_list(result)) else: inst.process(0)
def generar_tac(self): global report_error global report_ast DataWindow().clearConsole() SymbolTable().destroy() ThreeAddressCode().destroy() texto = self.entrada.get('1.0', END) result = parse(texto) print(result) # Imprime el AST report_error = ReportError() if len(ErrorController().getList()) > 0: messagebox.showerror('ERRORES', 'Se encontraron errores') else: ambito = Ambito(None) for inst in result: inst.compile(ambito) DataWindow().consoleText(ThreeAddressCode().getCode()) ThreeAddressCode().writeFile() result2 = parse2(texto) # AST GRAFICO report_ast = result2
def generar_optimization(self): global report_error global report_ast global report_optimization DataWindow().clearConsole() OptimizationController().destroy() texto = self.entrada.get('1.0', END) list_instrucciones = parse_optimizacion(texto) # print(result) # Imprime el AST report_error = ReportError() report_optimization = ReportOfOptimization() if len(ErrorController().getList()) > 0: messagebox.showerror('ERRORES', 'Se encontraron errores') else: for index, inst in enumerate(list_instrucciones): if inst != None: result = inst.process(0) regla1(result, list_instrucciones, index) regla2(result, list_instrucciones, index) regla3(result, list_instrucciones, index) regla4y5(result, list_instrucciones, index) regla6(result, list_instrucciones, index) regla7(result, list_instrucciones, index) DataWindow().consoleText('CD3 RETURNED: Optimization Finished')
def addForeignKey(self, listaCols, nombreTabla, listaTablasCols): # the len of the cols must be de same if len(listaCols) != len(listaTablasCols): desc = f": cant of params in foreign() != " ErrorController().add(36, 'Execution', desc, 0, 0) self._can_create_flag = False return typeChecker = TypeChecker() existForeingTable = typeChecker.searchTable(SymbolTable().useDatabase, nombreTabla) # validate if the foreign table exists if existForeingTable == None: desc = f": Undefined table in foreign key ()" ErrorController().add(27, 'Execution', desc, 0, 0) self._can_create_flag = False return # validate if the columns exists in the foreign table for coli in listaTablasCols: if typeChecker.searchColumn(existForeingTable, coli) == None: desc = f": Undefined col in table in foreign key ()" ErrorController().add(26, 'Execution', desc, 0, 0) self._can_create_flag = False return bandera = False for x in range(0, len(listaCols)): for columna in self._column_list: if isinstance(columna, CreateCol): if (columna._column_name == listaCols[x]): if columna._properties != None: bandera = True columna._properties[0]['fk_references_to'] = { '_refTable': nombreTabla, '_refColumn': listaTablasCols[x] } break if not bandera: desc = f": Undefined column in foreign key ()" ErrorController().add(26, 'Execution', desc, 0, 0) self._can_create_flag = False return bandera = False
def process(self, environment): for name in self.id: name = name['value'] drop = Procedures().dropProcedure(name, self.line, self.column) if not drop and not self.ifExists: desc = f": Function {name} does not exist" ErrorController().add(39, 'Execution', desc, self.line, self.column)
def createColumnTable(self, table: Table, column: Column, noLine, noColumn): """ Method to create a column in table :param table: The name of table :param column: Number of columns :param noLine: The instruction line :param noColumn: The instruction column :return: Returns nothing """ database = SymbolTable().useDatabase if not database: desc = f": Database not selected" ErrorController().add(4, 'Execution', desc, noLine, noColumn) return if self.searchColumn(table, column.name): desc = f": Column {column.name} already exists" ErrorController().add(29, 'Execution', desc, noLine, noColumn) return dbStatement = data_mode(database.mode).alterAddColumn( database.name.lower(), table.name.lower(), column.default) if dbStatement == 0: if len(table.columns) > 0: column.number = table.columns[-1].number + 1 table.columns.append(column) self.writeFile() DataWindow().consoleText( 'Query returned successfully: Table updated') return True elif dbStatement == 1: desc = f": Can't update table {table.name}" ErrorController().add(34, 'Execution', desc, noLine, noColumn) elif dbStatement == 2: desc = f": Database {database.name} does not exist" ErrorController().add(35, 'Execution', desc, noLine, noColumn) elif dbStatement == 3: desc = f": Table {table.name} does not exist" ErrorController().add(27, 'Execution', desc, noLine, noColumn)
def agregarFk(self, listaCols, nombreTabla, listaTablasCols, tablaAAlter): typeChecker = TypeChecker() # the len of the cols must be de same if len(listaCols) != len(listaTablasCols): desc = f": cantidad of params in foreign() != " ErrorController().add(36, 'Execution', desc, 0, 0) return existForeingTable = typeChecker.searchTable(SymbolTable().useDatabase, nombreTabla) tableToAlter = typeChecker.searchTable(SymbolTable().useDatabase, tablaAAlter) # validate if the foreign table exists if existForeingTable == None: desc = f": Undefined table in foreign key ()" ErrorController().add(27, 'Execution', desc, 0, 0) return # validate if the columns exists in the foreign table for coli in listaTablasCols: if typeChecker.searchColumn(existForeingTable, coli) == None: desc = f": Undefined col in table in foreign key ()" ErrorController().add(26, 'Execution', desc, 0, 0) return bandera = False for x in range(0, len(listaCols)): for columna in tableToAlter.columns: if (columna._name == listaCols[x]): bandera = True columna._foreignKey = { '_refTable': nombreTabla, '_refColumn': listaTablasCols[x] } break if not bandera: desc = f": Undefined column in alter foreign key ()" ErrorController().add(26, 'Execution', desc, 0, 0) return bandera = False typeChecker.writeFile()
def process(self, enviroment): for name in self.name_index: isDropIndex = self.search_index(name) if isDropIndex: DataWindow().consoleText('Query returned successfully: Drop Index') else: desc = f": Name of Index not Exists" ErrorController().add(4, 'Execution', desc, self.line, self.column) # manejar linea y columna
def process(self, enviroment): if self.isColumn: isChangeName = self.rename_column( self.name_index, self.new_name, self.index_specific) if isChangeName: DataWindow().consoleText('Query returned successfully: Alter Index') else: desc = f": Name of Index not Exists" ErrorController().add(4, 'Execution', desc, self.line, self.column) # manejar linea y columna else: isChangeName = self.search_index(self.name_index, self.new_name) if isChangeName: DataWindow().consoleText('Query returned successfully: Alter Index') else: desc = f": Name of Index not Exists" ErrorController().add(4, 'Execution', desc, self.line, self.column) # manejar linea y columna
def parse_optimizacion(inpu): global input, contador_instr contador_instr = 0 ErrorController().destroy() lexer = lex.lex() lexer.lineno = 1 input = inpu get_text(input) return parser.parse(inpu, lexer=lexer)