SQL Rustico
Taller de Programación I
Cátedra Deymonnaz - 2C2024
El trabajo consiste en basicamente realizar un motor sencillo de bases de datos, basados en SQL. Debe soportar consultas del tipo SELECT, INSERT, UPDATE, DELETE con posibilidad de tener consultas con condiciones (= , !=, operadores de mayor y menor), y permitir el ordenamiento si es que se desea.
No se da soporte a operadores tipo LENGHT o JOINs
El formato de ejecución del trabajo practico está dado por
cargo run -- <ruta_a_directorio_con_tablas> <CONSULTA>
Donde:
-
Las consultas tipo SELECT, serán mostradas por la terminal, y su contenido puede ser redireccionable. Ejemplo:
cargo run -- ./tables "SELECT * FROM clientes WHERE Edad >= 45;" # o bien cargo run -- ./tables "SELECT * FROM clientes WHERE Edad>=45;"
Mostrará por terminal
Nombre,Apellido,Edad,Correo electronico,Profesion Carlos,Sánchez,45,csanchez@gmail.com,ingeniero
Si se desea redireccionar su contenido:
cargo run -- ./tables "SELECT * FROM clientes WHERE Edad >= 45;" > result_select.csv
Se generará un archivo result_select del tipo CSV con los resultados de la búsqueda.
-
Las consultas UPDATE, INSERT, DELETE son ejecutadas sobre el archivo que se está trabajando Ejemplos
## esta consulta generará un update sobre todos los clientes con Edad = 31 cargo run -- ./tables "UPDATE clientes SET Nombre = 'Github', Edad = 45 WHERE Edad=31;" ## esta consulta eliminará por completo la database cargo run -- ./tables "DELETE FROM clientes;" ## Esta consulta insertará (Juan, 20), y el resto de los espacios serán NULL (blank) cargo run -- ./tables "INSERT INTO clientes (Nombre, Edad) VALUES ('Juan', 20);" #Se inserta un valor en la base de datos ## Esta consulta insertara (Juan, 20) y (Marcelo, 20) y para ambas el resto de los espacios seran NULL cargo run -- ./tables "INSERT INTO clientes (Nombre, Edad) VALUES ('Juan', 20), ('Marcelo', 20); ## Esta consulta insertara por completo (55, Lucas, nodox, 80, test@gmail.com, informatico) cargo run -- ./tables "INSERT into clientes VALUES (55, Lucas, nodox, 80, test@gmail.com, informatico)
Aclaración: Por defecto, hay 2 archivos los cuales puede usar adentro de ./tables, usá el que mas te gusta!
Note
No tocar el archivo database.csv que está en ./tests/test_tables dado que los tests unitarios lo utilizan para las pruebas.
Para correr TODAS las pruebas, se deberá correr el comando
cargo test
Para solo correr las pruebas de integración, se deberá correr el comando
cargo test --test '*'
- Cambio de lectura de archivos a ruta de carpeta
- Cada estructura tiene su propia carpeta creada.
- Limpieza de comentarios inecesarios
- Refactor run en ./src para hacer bloques de código mas cortos
- Soporte de paréntesis en condicionales
- Error con condiciones pegadas, programa quedaba colgado, ahora se lanza un error correspondiente.
- Caso particular con operacion AND a veces fallaba.
- Agregado por mi parte (no es parte de la corrección): Se agregó un struct Sorter.
- SELECT: Las consultas ahora se devuelven en el orden ingresado de las columnas.
- SELECT: Las consultas ahora permiten condicionales que no estén ingresadas en la query (Ejemplo SELECT Edad FROM table WHERE Nombre = 'Luis')
- INSERT: Solucionado problema de ingreso de un valor nuevo
- DELETE: Solucionado problema de la eliminación de un elemento de la tabla.
- TODAS LAS CONSULTAS: Fix en columnas que tenian nombre espaciado.
- Test agregados para estas nuevas features mencionadas previamente
- Separación de integration_test a clases para cada tipo de consulta.
- Rework completo sobre los tests, utilizando ahora un mock para evitar lecturas de archivo directas y evitar problemas a la hora de correr tests
- Fix condiciones sin terminar dejaban el programa colgado
- ORDER BY por columnas que no estaban en la query fallaba (agregados tests para esto)
- Soporte para condiciones pegadas (Generé varios test para esto, y mixeando condiciones no pegadas y pegadas)
- Fix usos de unwrap en algunos casos bordes y uso de std::process::exit
- Arreglado error en returns de Table y FolderTables para matchear la funcion de retorno de creacion en vez de crear un nuevo error
- IMPORTANTE: fix con comparaciones con espacios en los strings (agregadas pruebas tambien)
- IMPORTANTE: Agregado soporte de operaciones con columnas como condiciones (SELECT * FROM clientes WHERE Id > Edad por ejemplo, agregado test también)
- IMPORTANTE: Agregado soporte para operaciones con constantes como condicionales (Ejemplo: SELECT * FROM clientes WHERE 1=1;) esto obviamente devolveria true por ende todas las filas.