Advertisement
Guest User

Untitled

a guest
May 10th, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 18.80 KB | None | 0 0
  1. import java.io.InputStreamReader;
  2. import java.sql.*;
  3. import java.util.ArrayList;
  4. import java.util.LinkedList;
  5. import java.io.BufferedReader;
  6. import java.io.FileReader;
  7. import java.util.Scanner;
  8.  
  9. public class Diagnostico {
  10.  
  11.     private final String DATAFILE = "data/disease_data.data";
  12.     private Connection connection = null;
  13.  
  14.     private void showMenu() {
  15.  
  16.         int option = -1;
  17.         do {
  18.             System.out.println("Bienvenido a sistema de diagnóstico\n");
  19.             System.out.println("Selecciona una opción:\n");
  20.             System.out.println("\t1. Creación de base de datos y carga de datos.");
  21.             System.out.println("\t2. Realizar diagnóstico.");
  22.             System.out.println("\t3. Listar síntomas de una enfermedad.");
  23.             System.out.println("\t4. Listar enfermedades y sus códigos asociados.");
  24.             System.out.println("\t5. Listar síntomas existentes en la BD y su tipo semántico.");
  25.             System.out.println("\t6. Mostrar estadísticas de la base de datos.");
  26.             System.out.println("\t7. Salir.");
  27.             try {
  28.                 option = readInt();
  29.                 switch (option) {
  30.                     case 1:
  31.                         crearBD();
  32.                         break;
  33.                     case 2:
  34.                         realizarDiagnostico();
  35.                         break;
  36.                     case 3:
  37.                         listarSintomasEnfermedad();
  38.                         break;
  39.                     case 4:
  40.                         listarEnfermedadesYCodigosAsociados();
  41.                         break;
  42.                     case 5:
  43.                         listarSintomasYTiposSemanticos();
  44.                         break;
  45.                     case 6:
  46.                         mostrarEstadisticasBD();
  47.                         break;
  48.                     case 7:
  49.                         exit();
  50.                         break;
  51.                 }
  52.             } catch (Exception e) {
  53.                 System.err.println("Opción introducida no válida!");
  54.                 e.printStackTrace();
  55.             }
  56.         } while (option != 7);
  57.         exit();
  58.     }
  59.  
  60.     private void exit() {
  61.         try {
  62.             connection.close();
  63.             System.out.println("Saliendo... ¡hasta otra!");
  64.         } catch (SQLException e) {
  65.             e.printStackTrace();
  66.         }
  67.         System.exit(0);
  68.     }
  69.  
  70.     /**
  71.      * Método para establecer conexión con la base de datos.
  72.      *
  73.      * @throws Exception Puede lanzar excepción.
  74.      */
  75.     private void conectar(String database) throws Exception {
  76.         if (connection == null) {
  77.             try {
  78.                 Class.forName("com.mysql.jdbc.Driver");
  79.                 connection = DriverManager.getConnection(
  80.                         "jdbc:mysql://localhost:3306/" + database,
  81.                         "root",
  82.                         "");
  83.             } catch (Exception e) {
  84.                 System.out.println("Error al conectarse a la base de datos: ");
  85.                 e.printStackTrace();
  86.             }
  87.         }
  88.     }
  89.  
  90.     /**
  91.      * Método para comprobar si la base de datos "diagnostico" existe.
  92.      *
  93.      * @throws Exception Puede lanzar excepción.
  94.      */
  95.     private boolean existeDB() throws Exception {
  96.         boolean ret = false;
  97.         ResultSet r = connection.getMetaData().getCatalogs();
  98.         while (r.next()) {
  99.             if (r.getString(1).equalsIgnoreCase("diagnostico")) {
  100.                 ret = true;
  101.             }
  102.         }
  103.         return ret;
  104.     }
  105.  
  106.     /**
  107.      * Método para crear la base de datos, tablas e importar datos.
  108.      *
  109.      * @throws Exception Puede lanzar alguna excepción, en cuyo caso,
  110.      *                   hace ROLLBACK y elimina las tablas y base de datos creadas.
  111.      */
  112.     private void crearBD() {
  113.  
  114.         /*
  115.          * Se conecta con JDBC a través del método conectar(). Acto seguido,
  116.          * se procede a crear la base de datos y las tablas para dejar paso
  117.          * a importación de datos posteriormente.
  118.          */
  119.         try {
  120.             conectar("");
  121.             if (!existeDB()) {
  122.                 LinkedList<String> archivo = readData();
  123.                 ArrayList<String> sentenciasSQL = new ArrayList<>();
  124.                 sentenciasSQL.add("CREATE DATABASE diagnostico;");
  125.                 sentenciasSQL.add("USE diagnostico;");
  126.                 sentenciasSQL.add("CREATE TABLE disease (" +
  127.                         "disease_id INT AUTO_INCREMENT, " +
  128.                         "name VARCHAR(255), " +
  129.                         "PRIMARY KEY (disease_id)" +
  130.                         ");");
  131.                 sentenciasSQL.add("CREATE TABLE source (" +
  132.                         "source_id INT AUTO_INCREMENT, " +
  133.                         "name VARCHAR(255) UNIQUE, " +
  134.                         "PRIMARY KEY (source_id)" +
  135.                         ");");
  136.                 sentenciasSQL.add("CREATE TABLE symptom (" +
  137.                         "cui VARCHAR(25), " +
  138.                         "name VARCHAR(255), " +
  139.                         "st VARCHAR(45), " +
  140.                         "PRIMARY KEY (cui)" +
  141.                         ");");
  142.                 sentenciasSQL.add("CREATE TABLE disease_symptom (" +
  143.                         "disease_id INT, " +
  144.                         "cui VARCHAR(25), " +
  145.                         "FOREIGN KEY (disease_id) REFERENCES disease(disease_id), " +
  146.                         "FOREIGN KEY (cui) REFERENCES symptom(cui)" +
  147.                         ");");
  148.                 sentenciasSQL.add("CREATE TABLE code (" +
  149.                         "code VARCHAR(255) UNIQUE, " +
  150.                         "source_id INT, " +
  151.                         "PRIMARY KEY (code), " +
  152.                         "FOREIGN KEY (source_id) REFERENCES source(source_id)" +
  153.                         ");");
  154.                 sentenciasSQL.add("CREATE TABLE disease_has_code (" +
  155.                         "disease_id INT, " +
  156.                         "code VARCHAR(255), " +
  157.                         "source_id INT, " +
  158.                         "FOREIGN KEY (disease_id) REFERENCES disease(disease_id), " +
  159.                         "FOREIGN KEY (code) REFERENCES code(code), " +
  160.                         "FOREIGN KEY (source_id) REFERENCES `source`(source_id)" +
  161.                         ");");
  162.  
  163.                 /*
  164.                  * Dado que las sentencias CREATE implican un COMMIT automático, comenzaremos la
  165.                  * transacción antes de las sentencias INSERT. Ahora se interpretan y segmentan los
  166.                  * datos de disease_data.data y se crean las sentencias de importación.
  167.                  */
  168.                 sentenciasSQL.add("START TRANSACTION;");
  169.                 for (String linea : archivo) {
  170.                     String[] d1 = linea.split("=");
  171.                     String[] e1 = d1[0].split(":");
  172.                     String nombreEnfermedad = e1[0];
  173.                     sentenciasSQL.add("INSERT INTO disease (name) VALUES ('" + nombreEnfermedad.replaceAll("'", "''") + "');");
  174.                     String[] datosEnfermedad = e1[1].split(";");
  175.                     for (String dato : datosEnfermedad) {
  176.                         String[] e2 = dato.split("@");
  177.                         String codigoE = e2[0];
  178.                         String sourceE = e2[1];
  179.                         sentenciasSQL.add("INSERT IGNORE INTO source (name) VALUES ('" + sourceE + "');");
  180.                         sentenciasSQL.add("INSERT IGNORE INTO code VALUES ('" + codigoE.replaceAll("'", "''") + "', " +
  181.                                 "(SELECT source_id FROM source WHERE `name`='" + sourceE + "'));");
  182.                         sentenciasSQL.add("INSERT INTO disease_has_code VALUES (" +
  183.                                 "(SELECT disease_id FROM disease WHERE `name`='" + nombreEnfermedad.replaceAll("'", "''") + "'), " +
  184.                                 "'" + codigoE.replaceAll("'", "''") + "', " +
  185.                                 "(SELECT source_id FROM code WHERE `code`='" + codigoE.replaceAll("'", "''") + "')" +
  186.                                 ");");
  187.                     }
  188.                     String[] s1 = d1[1].split(";");
  189.                     for (String dato : s1) {
  190.                         String[] datosSintoma = dato.split(":");
  191.                         String nombreSintoma = datosSintoma[0];
  192.                         String codigoSintoma = datosSintoma[1];
  193.                         String semanticaSintoma = datosSintoma[2];
  194.                         sentenciasSQL.add("INSERT IGNORE INTO symptom VALUES (" +
  195.                                 "'" + codigoSintoma.replaceAll("'", "''") + "', " +
  196.                                 "'" + nombreSintoma.replaceAll("'", "''") + "', " +
  197.                                 "'" + semanticaSintoma + "'" +
  198.                                 ");");
  199.                         sentenciasSQL.add("INSERT INTO disease_symptom VALUES (" +
  200.                                 "(SELECT disease_id FROM disease WHERE `name` = '" + nombreEnfermedad.replaceAll("'", "''") + "'), " +
  201.                                 "'" + codigoSintoma.replaceAll("'", "''") + "')" +
  202.                                 ";");
  203.                     }
  204.                 }
  205.  
  206.                 /*
  207.                  * Una vez termino el proceso de segmentar e interpretar los datos de disease_data.data, y
  208.                  * colectar todas las sentencias de importación correspondientes, se añade al final de esta
  209.                  * colección la sentencia COMMIT. Finalmente se procede a ejecutar en orden las sentencias.
  210.                  */
  211.                 sentenciasSQL.add("COMMIT;");
  212.                 for (String sentencia : sentenciasSQL) {
  213.                     PreparedStatement ps = connection.prepareStatement(sentencia);
  214.                     ps.execute();
  215.                 }
  216.                 connection.setCatalog("diagnostico");
  217.             } else {
  218.                 System.out.println("¡La base de datos diagnóstico ya existe!\n");
  219.             }
  220.         } catch (Exception e) {
  221.             e.printStackTrace();
  222.  
  223.             /*
  224.              * En caso de un error en el proceso anterior, se parará el progreso y se optará por eliminar totalmente
  225.              * la base de datos, deshaciendo así todos los cambios. Esto ocurre porque se presume que siempre que se
  226.              * ejecute el método crearDB(), no existe la base de datos.
  227.              */
  228.             try {
  229.                 PreparedStatement ps = connection.prepareStatement("DROP DATABASE IF EXISTS diagnostico;");
  230.                 ps.execute();
  231.             } catch (SQLException ex) {
  232.                 System.out.println("No pudo borrarse la base de datos.");
  233.             }
  234.         }
  235.     }
  236.  
  237.     private void realizarDiagnostico() {
  238.         /*try {
  239.             conectar("diagnostico");
  240.             PreparedStatement asktodb = connection.prepareStatement("SELECT cui,name FROM symptom");
  241.             asktodb.execute();
  242.  
  243.             int[] sympthoms = null;
  244.             sympthoms[0] = -1;
  245.             for (int i = 0; i < sympthoms.length; i++) {
  246.                 System.out.println(sympthoms[i]);
  247.             }
  248.  
  249.             String[] sympcode = readString();
  250.  
  251.             String[] listofsympthoms = new String[sympcode.length];
  252.             nsymp = sympcode.split(",");
  253.             for (int i = 0; i < nsymp.length; i++) {
  254.                 sympcode[i] = "cui= '" + nsymp[i].trim() + "'";
  255.             }
  256.             String query = "SELECT disease_symptom.disease_id,name FROM disease_symptom INNER JOIN disease ON " +
  257.                     "(disease_symptom.disease_id=disease.disease_id) WHERE " + String.join(" OR ", queryList) +
  258.                     " GROUP BY disease_id HAVING count(*)=" + nsymp.length + ";";
  259.             preparedquery = (PreparedStatement) conn.prepareStatement(query);
  260.             System.out.println("Enfermedades para los códigos:" + sympcode + "\n" + executeQuery(query));
  261.         } catch (Exception e) {
  262.             // holi
  263.         }*/
  264.     }
  265.  
  266.     /**
  267.      * Método para crear imprimir la lista de síntomas de una enfermedad.
  268.      *
  269.      * @throws Exception Puede lanzar excepción si el proceso de consulta en
  270.      *                   SQL ha fallado o la ID de enfermedad introducida es inválida.
  271.      */
  272.     private void listarSintomasEnfermedad() {
  273.         System.out.println("Escoge una de las siguientes enfermedades introduciendo su ID:");
  274.  
  275.         /*
  276.          * Se consulta a la base de datos las enfermedades almacenadas y sus IDs correspondientes.
  277.          */
  278.         try {
  279.             conectar("diagnostico");
  280.             PreparedStatement ps = connection.prepareStatement("SELECT disease_id,name FROM disease;");
  281.             ResultSet listadoEnfermedades = ps.executeQuery();
  282.             while (listadoEnfermedades.next()) {
  283.                 System.out.println(listadoEnfermedades.getInt("disease_id") + "  |  " +
  284.                         listadoEnfermedades.getString("name"));
  285.             }
  286.  
  287.             /*
  288.              * A través de un Scanner, se pide al usuario que introduzca una
  289.              * ID. Acto seguido, se consulta y lista los síntomas de la enfermedad correspondiente.
  290.              */
  291.             Scanner sc = new Scanner(System.in);
  292.             int ID = sc.nextInt();
  293.             PreparedStatement ps2 = connection.prepareStatement(
  294.                     "SELECT cui FROM disease_symptom WHERE `disease_id`='" + ID + "';");
  295.             ResultSet codigosSintomas = ps2.executeQuery();
  296.  
  297.             while (codigosSintomas.next()) {
  298.                 PreparedStatement ps3 = connection.prepareStatement(
  299.                         "SELECT name FROM symptom WHERE `cui`='" + codigosSintomas.getString("cui") + "'");
  300.                 ResultSet sintomas = ps3.executeQuery();
  301.                 sintomas.next();
  302.                 System.out.println("* " + sintomas.getString("name"));
  303.             }
  304.         } catch (Exception e) {
  305.             System.out.println("Error al ejecutar la opción 4.");
  306.             e.printStackTrace();
  307.         }
  308.     }
  309.  
  310.     /**
  311.      * Método para crear imprimir las enfermedades con sus códigos y vocabularios.
  312.      *
  313.      * @throws Exception Puede lanzar excepción si el proceso de consulta en SQL ha fallado.
  314.      */
  315.     private void listarEnfermedadesYCodigosAsociados() {
  316.         System.out.println("Las enfermedades guardadas en la base de datos y sus códigos asociados son:\n");
  317.  
  318.         /*
  319.          * Se realiza una consulta a través de la cual se diseña un ResultSet cuya primera columna posee
  320.          * el nombre de la enfermedad, segunda columna el código y tercera columna el vocabulario del código.
  321.          */
  322.         try {
  323.             PreparedStatement ps = connection.prepareStatement(
  324.                     "SELECT disease.name,disease_has_code.code,source.name FROM disease_has_code " +
  325.                             "INNER JOIN disease ON disease_has_code.disease_id=disease.disease_id " +
  326.                             "INNER JOIN source ON disease_has_code.source_id=source.source_id;");
  327.             ResultSet resultados = ps.executeQuery();
  328.             while (resultados.next()) {
  329.                 System.out.println(resultados.getString(1) +
  330.                         " | " + resultados.getString(2) +
  331.                         " - " + resultados.getString(3));
  332.             }
  333.         } catch (Exception e) {
  334.             System.out.println("Ha ocurrido un error al listar las enfermedades y sus códigos.");
  335.             e.printStackTrace();
  336.         }
  337.     }
  338.  
  339.     /**
  340.      * Método para crear imprimir los síntomas y sus tipos semánticos.
  341.      *
  342.      * @throws Exception Puede lanzar excepción si el proceso de consulta en SQL ha fallado.
  343.      */
  344.     private void listarSintomasYTiposSemanticos() {
  345.         System.out.println("Los síntomas guardados en la base de datos y sus tipos semanticos son:");
  346.  
  347.         /*
  348.          * Se realiza una consulta para obtener todos los síntomas y sus tipos semánticos.
  349.          */
  350.         try {
  351.             PreparedStatement ps = connection.prepareStatement("SELECT name,st FROM symptom;");
  352.             ResultSet resultados = ps.executeQuery();
  353.             while (resultados.next()) {
  354.                 System.out.println(resultados.getString("name") +
  355.                         " - " + resultados.getString("st"));
  356.             }
  357.         } catch (SQLException e) {
  358.             System.out.println("Ha ocurrido un error al listar los síntomas y sus tipos semánticos.");
  359.             e.printStackTrace();
  360.         }
  361.     }
  362.  
  363.     private void mostrarEstadisticasBD() {
  364.         try {
  365.             conectar("diagnostico");
  366.             PreparedStatement ps = connection.prepareStatement("SELECT COUNT(name) FROM disease;");
  367.             PreparedStatement ps2 = connection.prepareStatement("SELECT COUNT(name) FROM symptom;");
  368.             PreparedStatement ps3 = connection.prepareStatement("SELECT disease.name,symptom.name FROM disease_symptom " +
  369.                     "INNER JOIN symptom ON disease_symptom.cui=symptom.cui " +
  370.                     "INNER JOIN disease ON disease_symptom.disease_id=disease.disease_id");
  371.             System.out.println("Número enfermedades: " + ps.executeQuery().next());
  372.             System.out.println("Número de síntomas: " + ps2.executeQuery().next());
  373.         } catch (Exception e) {
  374.             System.out.println("Ha ocurrido un error al mostrar las estadísticas.");
  375.             e.printStackTrace();
  376.         }
  377.     }
  378.  
  379.     /**
  380.      * Método para leer números enteros de teclado.
  381.      *
  382.      * @return Devuelve el número leído.
  383.      * @throws Exception Puede lanzar excepción.
  384.      */
  385.     private int readInt() throws Exception {
  386.         try {
  387.             System.out.print("> ");
  388.             return Integer.parseInt(new BufferedReader(new InputStreamReader(System.in)).readLine());
  389.         } catch (Exception e) {
  390.             throw new Exception("Not number.");
  391.         }
  392.     }
  393.  
  394.     /**
  395.      * Método para leer cadenas de teclado.
  396.      *
  397.      * @return Devuelve la cadena leída.
  398.      * @throws Exception Puede lanzar excepción.
  399.      */
  400.     private String readString() throws Exception {
  401.         try {
  402.             System.out.print("> ");
  403.             return new BufferedReader(new InputStreamReader(System.in)).readLine();
  404.         } catch (Exception e) {
  405.             throw new Exception("Error reading line.");
  406.         }
  407.     }
  408.  
  409.     /**
  410.      * Método para leer el fichero que contiene los datos.
  411.      *
  412.      * @return Devuelve una lista de String con el contenido.
  413.      * @throws Exception Puede lanzar excepción.
  414.      */
  415.     private LinkedList<String> readData() throws Exception {
  416.         LinkedList<String> data = new LinkedList<String>();
  417.         BufferedReader bL = new BufferedReader(new FileReader(DATAFILE));
  418.         while (bL.ready()) {
  419.             data.add(bL.readLine());
  420.         }
  421.         bL.close();
  422.         return data;
  423.     }
  424.  
  425.     public static void main(String args[]) {
  426.         new Diagnostico().showMenu();
  427.     }
  428. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement