diff --git a/src/main/java/BookBob/Main.java b/src/main/java/BookBob/Main.java index 1d5191dd83..bb71645752 100644 --- a/src/main/java/BookBob/Main.java +++ b/src/main/java/BookBob/Main.java @@ -42,6 +42,10 @@ public static void main(String[] args) { } break; + case "find": + commandHandler.find(input, records); + break; + case "help": commandHandler.help(); break; diff --git a/src/main/java/BookBob/entity/Patient.java b/src/main/java/BookBob/entity/Patient.java index 8eab39f97a..eda5510af3 100644 --- a/src/main/java/BookBob/entity/Patient.java +++ b/src/main/java/BookBob/entity/Patient.java @@ -5,36 +5,37 @@ public class Patient { private String name; - private String NRIC; - private String diagnosis; - private ArrayList medication; - private int phoneNumber; + private String nric; private String dateOfBirth; + private String phoneNumber; private String homeAddress; + private String diagnosis; + private List medication; - //default constructor only takes in name and NRIC - public Patient(String name, String NRIC) { + // default constructor only takes in name and NRIC + public Patient(String name, String nric) { this.name = name; - this.NRIC = NRIC; - this.phoneNumber = 0; + this.nric = nric; + this.dateOfBirth = ""; + this.phoneNumber = ""; this.homeAddress = ""; - this.medication = new ArrayList<>(); this.diagnosis = ""; - this.dateOfBirth = ""; + this.medication = new ArrayList<>(); } - //constructor used in retrieving data - public Patient(String name, String NRIC, String phoneNumber, String dateOfBirth, String homeAddress, String diagnosis, ArrayList medications) { + // constructor used in retrieving data + public Patient(String name, String nric, String dateOfBirth, String phoneNumber, String homeAddress, + String diagnosis, List medications) { this.name = name; - this.NRIC = NRIC; - this.phoneNumber = Integer.parseInt(phoneNumber); + this.nric = nric; this.dateOfBirth = dateOfBirth; + this.phoneNumber = phoneNumber; this.homeAddress = homeAddress; this.diagnosis = diagnosis; this.medication = medications; } - //getters and setters + // getters and setters public String getName() { return name; } @@ -43,51 +44,58 @@ public void setName(String name) { this.name = name; } - public String getNRIC() { - return NRIC; + public String getNric() { + return nric; } - public void setNRIC(String NRIC) { - this.NRIC = NRIC; + public void setNric(String nric) { + this.nric = nric; } - public String getDiagnosis() { - return diagnosis; + public String getDateOfBirth() { + return dateOfBirth; } - public void setDiagnosis(String diagnosis) { - this.diagnosis = diagnosis; + public void setDateOfBirth(String dateOfBirth) { + this.dateOfBirth = dateOfBirth; } - public ArrayList getMedication() { - return medication; + public String getPhoneNumber() { + return phoneNumber; } - public void setMedication(ArrayList medication) { - this.medication = medication; + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; } - public int getPhoneNumber() { - return phoneNumber; + public String getHomeAddress() { + return homeAddress; } - public void setPhoneNumber(int phoneNumber) { - this.phoneNumber = phoneNumber; + public void setHomeAddress(String homeAddress) { + this.homeAddress = homeAddress; } - public String getDateOfBirth() { - return dateOfBirth; + public String getDiagnosis() { + return diagnosis; } - public void setDateOfBirth(String dateOfBirth) { - this.dateOfBirth = dateOfBirth; + public void setDiagnosis(String diagnosis) { + this.diagnosis = diagnosis; } - public String getHomeAddress() { - return homeAddress; + public List getMedication() { + return medication; } - public void setHomeAddress(String homeAddress) { - this.homeAddress = homeAddress; + public void setMedication(List medication) { + this.medication = medication; + } + + @Override + public String toString() { + return "Name: " + getName() + ", NRIC: " + getNric() + ", DOB: " + getDateOfBirth() + + ", Phone: " + getPhoneNumber() + ", Address: " + getHomeAddress() + + ", Diagnosis: " + getDiagnosis() + ", Medication: " + getMedication(); } } diff --git a/src/main/java/BookBob/entity/Records.java b/src/main/java/BookBob/entity/Records.java index c5b93a52e3..35344363c2 100644 --- a/src/main/java/BookBob/entity/Records.java +++ b/src/main/java/BookBob/entity/Records.java @@ -1,30 +1,27 @@ package BookBob.entity; import java.util.ArrayList; +import java.util.List; public class Records { + private List patients; - public ArrayList patients; - - //default constructor: empty + // default constructor: empty public Records() { - ArrayList patients = new ArrayList<>(); - this.patients = patients; + this.patients = new ArrayList<>(); } - //add a patient to records + // add a patient to records public void addPatient(Patient patient) { - ArrayList patients = this.getPatients(); patients.add(patient); - this.setPatients(patients); } - //setter and getters - public ArrayList getPatients() { + // setter and getters + public List getPatients() { return patients; } - public void setPatients(ArrayList patients) { + public void setPatients(List patients) { this.patients = patients; } } diff --git a/src/main/java/BookBob/functions/CommandAttributeType.java b/src/main/java/BookBob/functions/CommandAttributeType.java new file mode 100644 index 0000000000..83526afdaa --- /dev/null +++ b/src/main/java/BookBob/functions/CommandAttributeType.java @@ -0,0 +1,21 @@ +package BookBob.functions; + +public enum CommandAttributeType { + NAME("NAME"), + NRIC("NRIC"), + DATE_OF_BIRTH("DATE_OF_BIRTH"), + PHONE_NUMBER("PHONE_NUMBER"), + HOME_ADDRESS("HOME_ADDRESS"), + DIAGNOSIS("DIAGNOSIS"), + MEDICATION("MEDICATION"); + + private final String label; + + CommandAttributeType(String label) { + this.label = label; + } + + public String getLabel() { + return label; + } +} diff --git a/src/main/java/BookBob/functions/CommandHandler.java b/src/main/java/BookBob/functions/CommandHandler.java index 1d603769de..3872d60e5b 100644 --- a/src/main/java/BookBob/functions/CommandHandler.java +++ b/src/main/java/BookBob/functions/CommandHandler.java @@ -4,6 +4,7 @@ import BookBob.entity.Records; import java.util.ArrayList; +import java.util.List; public class CommandHandler { @@ -43,11 +44,11 @@ public void add(String input, Records records) { String[] inputParts = input.split(" "); String name = ""; String NRIC = ""; - int phoneNumber = 0; - String diagnosis = ""; - ArrayList medications = new ArrayList<>(); - String homeAddress = ""; String dateOfBirth = ""; + String phoneNumber = ""; + String homeAddress = ""; + String diagnosis = ""; + List medications = new ArrayList<>(); for (String part : inputParts) { if (part.startsWith("n/")) { @@ -55,7 +56,7 @@ public void add(String input, Records records) { } else if (part.startsWith("ic/")) { NRIC = part.substring(3); } else if (part.startsWith("p/")) { - phoneNumber = Integer.parseInt(part.substring(2)); + phoneNumber = part.substring(2); } else if (part.startsWith("d/")) { diagnosis = part.substring(2); } else if (part.startsWith("m/")) { @@ -79,21 +80,21 @@ public void add(String input, Records records) { } public void list(Records records) { - ArrayList patients = records.getPatients(); + List patients = records.getPatients(); if (patients.isEmpty()) { System.out.println("No patients found."); return; } for (Patient patient : patients) { - System.out.println("Name: " + patient.getName() + ", NRIC: " + patient.getNRIC() + + System.out.println("Name: " + patient.getName() + ", NRIC: " + patient.getNric() + ", Phone: " + patient.getPhoneNumber() + ", Diagnosis: " + patient.getDiagnosis() + ", Medication: " + patient.getMedication() + ", Address: " + patient.getHomeAddress() + ", DOB: " + patient.getDateOfBirth()); } } - public void delete(String NRIC, Records records) { - ArrayList patients = records.patients; + public void delete(String nric, Records records) { + List patients = records.getPatients(); int initialPatientSize = patients.size(); if (initialPatientSize == 0) { System.out.println("There are no patients in the record currently."); @@ -101,15 +102,46 @@ public void delete(String NRIC, Records records) { } for (int i = 0; i < patients.size(); i++) { Patient currentPatient = patients.get(i); - String patientNRIC = currentPatient.getNRIC(); - if (patientNRIC.equals(NRIC)) { + String patientNRIC = currentPatient.getNric(); + if (patientNRIC.equals(nric)) { patients.remove(i); System.out.println("Patient " + currentPatient.getName() + ", " + patientNRIC + ", has been deleted."); break; } } if (patients.size() == initialPatientSize) { - System.out.println("Patient " + NRIC + " not found"); + System.out.println("Patient " + nric + " not found"); + } + } + + public void find(String input, Records records) { + String[] inputArr = input.split("\\s+", 3); + + CommandAttributeType commandAttributeType = null; + + for (CommandAttributeType t : CommandAttributeType.values()) { + if (t.getLabel().equals(inputArr[1])) { + commandAttributeType = t; + break; + } + } + + if (commandAttributeType == null) { + System.out.println("Invalid find"); + return; + } + + String[] keywords = inputArr[2].split("\\s+"); + + List findList = Find.findPatients(commandAttributeType, records, keywords); + + if (findList.isEmpty()) { + System.out.println("No patients found"); + return; + } + + for (Patient patient : findList) { + System.out.println(patient); } } diff --git a/src/main/java/BookBob/functions/Find.java b/src/main/java/BookBob/functions/Find.java new file mode 100644 index 0000000000..8f9d883c46 --- /dev/null +++ b/src/main/java/BookBob/functions/Find.java @@ -0,0 +1,78 @@ +package BookBob.functions; + +import BookBob.entity.Patient; +import BookBob.entity.Records; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +public class Find { + public static List findPatients(CommandAttributeType commandAttributeType, + Records records, String[] keywords) { + return switch (commandAttributeType) { + case NAME -> findPatientsByName(records, keywords); + case NRIC -> findPatientsByNric(records, keywords); + case DATE_OF_BIRTH -> findPatientsByDateOfBirth(records, keywords); + case PHONE_NUMBER -> findPatientsByPhoneNumber(records, keywords); + case HOME_ADDRESS -> findPatientsByHomeAddress(records, keywords); + case DIAGNOSIS -> findPatientsByDiagnosis(records, keywords); + case MEDICATION -> findPatientsByMedication(records, keywords); + }; + } + + public static List findPatientsByName(Records records, String[] keywords) { + return findPatientsByAttribute(records, keywords, (p, keyword) -> + p.getName().toLowerCase().contains(keyword.toLowerCase())); + } + + public static List findPatientsByNric(Records records, String[] keywords) { + return findPatientsByAttribute(records, keywords, (p, keyword) -> + p.getNric().toLowerCase().contains(keyword.toLowerCase())); + } + + public static List findPatientsByDateOfBirth(Records records, String[] keywords) { + return findPatientsByAttribute(records, keywords, (p, keyword) -> { + DateTimeFormatter dateInputFormatter = DateTimeFormatter.ofPattern("ddMMyyyy"); + LocalDate searchDate = LocalDate.parse(keyword, dateInputFormatter); + LocalDate patientDateOfBirth = LocalDate.parse(p.getDateOfBirth(), dateInputFormatter); + return patientDateOfBirth.equals(searchDate); + }); + } + + public static List findPatientsByPhoneNumber(Records records, String[] keywords) { + return findPatientsByAttribute(records, keywords, (p, keyword) -> + p.getPhoneNumber().toLowerCase().contains(keyword.toLowerCase())); + } + + public static List findPatientsByHomeAddress(Records records, String[] keywords) { + return findPatientsByAttribute(records, keywords, (p, keyword) -> + p.getHomeAddress().toLowerCase().contains(keyword.toLowerCase())); + } + + public static List findPatientsByDiagnosis(Records records, String[] keywords) { + return findPatientsByAttribute(records, keywords, (p, keyword) -> + p.getDiagnosis().toLowerCase().contains(keyword.toLowerCase())); + } + + public static List findPatientsByMedication(Records records, String[] keywords) { + return findPatientsByAttribute(records, keywords, (p, keyword) -> p.getMedication().contains(keyword)); + } + + public static List findPatientsByAttribute(Records records, String[] keywords, + FindAttributeCheck attributeCheck) { + List findList = new ArrayList<>(); + + for (Patient p : records.getPatients()) { + for (String keyword : keywords) { + if (attributeCheck.test(p, keyword)) { + findList.add(p); + break; // To avoid adding the same patient multiple times + } + } + } + + return findList; + } +} diff --git a/src/main/java/BookBob/functions/FindAttributeCheck.java b/src/main/java/BookBob/functions/FindAttributeCheck.java new file mode 100644 index 0000000000..5175cd6d4b --- /dev/null +++ b/src/main/java/BookBob/functions/FindAttributeCheck.java @@ -0,0 +1,8 @@ +package BookBob.functions; + +import BookBob.entity.Patient; + +@FunctionalInterface +public interface FindAttributeCheck { + boolean test(Patient patient, String keyword); +} diff --git a/src/main/java/BookBob/functions/FindPatientAttributeCheck.java b/src/main/java/BookBob/functions/FindPatientAttributeCheck.java new file mode 100644 index 0000000000..41aa814fe0 --- /dev/null +++ b/src/main/java/BookBob/functions/FindPatientAttributeCheck.java @@ -0,0 +1,8 @@ +package BookBob.functions; + +import BookBob.entity.Patient; + +@FunctionalInterface +public interface FindPatientAttributeCheck { + boolean test(Patient patient, String keyword); +} diff --git a/src/main/java/BookBob/functions/SaveAndRetrieve.java b/src/main/java/BookBob/functions/SaveAndRetrieve.java index c0cf3efe7b..f633a6ec51 100644 --- a/src/main/java/BookBob/functions/SaveAndRetrieve.java +++ b/src/main/java/BookBob/functions/SaveAndRetrieve.java @@ -8,6 +8,7 @@ import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; +import java.util.List; import java.util.Scanner; public class SaveAndRetrieve { @@ -29,10 +30,10 @@ public static void initFile(Records records){ private static String convertPatientToOutputText(Patient patient) { String output = ""; - output += "Name: " + patient.getName() + " | " + "NRIC: " + patient.getNRIC() + " | " + "Phone Number: " + patient.getPhoneNumber() + " | " + output += "Name: " + patient.getName() + " | " + "NRIC: " + patient.getNric() + " | " + "Phone Number: " + patient.getPhoneNumber() + " | " + "Date_Of_Birth: " + patient.getDateOfBirth() + " | " + "Home Address: " + patient.getHomeAddress() + " | " + "Diagnosis: " + patient.getDiagnosis() + " | " + "Medication: "; - ArrayList medications = patient.getMedication(); + List medications = patient.getMedication(); for(int i = 0; i < medications.size(); i++) { output += medications.get(i) + ";"; } @@ -40,7 +41,7 @@ private static String convertPatientToOutputText(Patient patient) { } public static void autosave(Records records) throws IOException { - ArrayList patients = records.getPatients(); + List patients = records.getPatients(); FileWriter fw = new FileWriter("bookbob_data.txt"); for(int i = 0; i < patients.size(); i++) { Patient currPatient = patients.get(i); @@ -62,7 +63,7 @@ public static void retrieveData(Records records){ String line = reader.nextLine(); String[] data = line.split("\\|"); String name = data[0].trim(); - String NRIC = data[1].trim(); + String nric = data[1].trim(); String phoneNumber = data[2].trim(); String dateOfBirth = data[3].trim(); String homeAddress = data[4].trim(); @@ -72,7 +73,7 @@ public static void retrieveData(Records records){ for(int i = 0; i < rawMedications.length; i++) { medications.add(rawMedications[i].trim()); } - Patient patient = new Patient(name, NRIC, phoneNumber, dateOfBirth, homeAddress, diagnosis, medications); + Patient patient = new Patient(name, nric, phoneNumber, dateOfBirth, homeAddress, diagnosis, medications); records.addPatient(patient); } } catch (FileNotFoundException e) {