Skip to content

Conversation

@noahmasri
Copy link

No description provided.

germandouce and others added 30 commits August 27, 2024 14:33
… dios no juegas dados, quiza esta a mi favor??

no compila
…omo hago xa q solo se printee por STDOUT el select y no los demas. xc ahora queda asi...

+facilito manejo de errores
(agrego conmdiciones del where al update y corrijo el parseo para que los strings se guarden sin comillas)
…S (ya se qxq). Mucho menos tengo la menor de idea de como meter parentesis
Copy link
Author

@noahmasri noahmasri left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

El ejercicio está aprobado. En líneas generales se encuentra bien, el código está basatnte prolijo. Algunos comentarios:

  • hay muuucho codigo repetido, literalmente copypasteado.
  • no anda insertar menos columnas que las totales, cuando deberia poderse rellenando el resto con espacios vacios
  • la precedencia no anda del todo bien en ciertos casos en donde incluímos todos los operadores, como x ejemplo SELECT * FROM materias WHERE NOT nombre = 'Desarrollo' and departamento = 71 or codigo > 71; no toma las materias que solo cumplan la condicion 2 (codigo > 71)
  • no está implementada la comparación entre dos columnas
  • no anda el ordenamiento por una columna que no es parte de las respuestas ya que las filtras antes
    Dado que considero que no son realmente lo importante del ejercicio, lo dejamos pasar. Buen finde!

pub fn imprimir_resultados(&self, results: &[Vec<String>]) {
match self {
Comando::Select(_select) => Select::imprimir_resultados(results),
Comando::Update(_update) => {
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no hace falta poner en los 3 algo vacío, podes poner

pub fn imprimir_resultados(&self, results: &[Vec<String>]) {
        match self {
            Comando::Select(_select) => Select::imprimir_resultados(results),
            _ => {
                // establece default que no hace nada
            }
        }
    }

) -> Result<String, Result<Vec<Vec<String>>, SqlError>> {
let encabezados = match lineas.next() {
Some(Ok(line)) => line,
Some(Err(_err)) => {
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

si dos casos dan el mismo resultado y devolves lo mismo, podes meterlos en el mismo brazo con caso | otro_caso

None
}

fn armar_vector_encabezados(encabezados: String) -> Vec<String> {
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

si todas las lineas las parseas asi, no seria mejor tener una funcion aux general que se llame tipo parsear linea?

let vector_encabezados = Self::armar_vector_encabezados(encabezados);

if let Some(value) = Self::escribir_encabezados(&mut archivo_temporal, &vector_encabezados)
{
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

una boludez, pero mantene el estilo d '{}' elegido

}

//Tokeniza las restricciones
fn tokenizar(&self, restricciones: &str) -> Vec<String> {
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

esto debería estar en algun archivo de útiles en general, porque las condiciones del where también están para el select. Tenés todo este código (tokenizar, infix_a_postfix, etc) repetido

let mut columnas = Vec::new();
let mut valores = Vec::new();

for asignacion in parte_set.split(',') {
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

al correr la query "UPDATE clientes SET name = 'Diego', email = 'diego.gomez@email.com' WHERE id = 3;" se te rompe esto porque por algun motivo el split te da 3 objetos, siendo el tercero un string vacio. printeadno obtengo
+asignacion name = 'Diego' +asignacion email = 'diego.gomez@email.com' +asignacion +INVALID_SYNTAX: Hay un error en la sintaxis de la consulta

};

let tabla = tabla_y_columnas[..paos_parentesis_abre].trim();
let columnas_str = &tabla_y_columnas[paos_parentesis_abre + 1..pos_parentesis_cierra].trim();
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

y si aparece ) antes que (?


let columnas = mapear_columnas(columnas_str);

let values_str = &resto[pos_values + 6..].trim();
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+6?

)?;
//Ordenamiento (ORDER BY)
if let Some(ref ordenamiento) = self.ordenamiento {
self.aplicar_ordenamiento(&mut resultado, ordenamiento, &encabezados_select)?;
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

esto no anda si el parametro de ordenamiento no es parte de lo que se debe devolver, ejemplo "SELECT apellido FROM clientes ORDER BY nombre DESC;"

if let Some(indice) = encabezados.iter().position(|enc| enc == columna) {
let valor_registro = &registro[indice];
let resultado = match operador {
"=" => valor_registro.as_str() == valor,
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

esto anda únicamente cuando se pasan valores para comparar, es decir, no permite comparar los valores de dos columnas. ej SELECT nombre FROM materias WHERE departamento = codigo;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants