Advertisement
Guest User

Untitled

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