Skip to content

Commit

Permalink
Update "find" implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
kaboomzxc committed Oct 2, 2024
1 parent 38bf4da commit 984a406
Show file tree
Hide file tree
Showing 7 changed files with 115 additions and 30 deletions.
4 changes: 4 additions & 0 deletions src/main/java/BookBob/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ public static void main(String[] args) {
}
break;

case "find":
commandHandler.find(input, records);
break;

case "help":
commandHandler.help();
break;
Expand Down
7 changes: 7 additions & 0 deletions src/main/java/BookBob/entity/Patient.java
Original file line number Diff line number Diff line change
Expand Up @@ -91,4 +91,11 @@ public List<String> getMedication() {
public void setMedication(List<String> medication) {
this.medication = medication;
}

@Override
public String toString() {
return "Name: " + getName() + ", NRIC: " + getNric() + ", DOB: " + getDateOfBirth() +
", Phone: " + getPhoneNumber() + ", Address: " + getHomeAddress() +
", Diagnosis: " + getDiagnosis() + ", Medication: " + getMedication();
}
}
2 changes: 0 additions & 2 deletions src/main/java/BookBob/entity/Records.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,7 @@ public Records() {

// add a patient to records
public void addPatient(Patient patient) {
List<Patient> patients = this.getPatients();
patients.add(patient);
this.setPatients(patients);
}

// setter and getters
Expand Down
21 changes: 21 additions & 0 deletions src/main/java/BookBob/functions/CommandAttributeType.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
31 changes: 31 additions & 0 deletions src/main/java/BookBob/functions/CommandHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,37 @@ public void delete(String nric, Records records) {
}
}

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<Patient> findList = Find.findPatients(commandAttributeType, records, keywords);

if (findList.isEmpty()) {
System.out.println("No patients found");
return;
}

for (Patient patient : findList) {
System.out.println(patient);
}
}

// Takes in an input string and determines whether to exit the program
public void exit(String input) {
if(input.equalsIgnoreCase("exit")) {
Expand Down
72 changes: 44 additions & 28 deletions src/main/java/BookBob/functions/Find.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,53 +9,69 @@
import java.util.List;

public class Find {
public List<Patient> findPatientsByAttribute(Records records, String[] keywords,
FindPatientAttributeCheck attributeCheck) {
List<Patient> 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;
public static List<Patient> 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 List<Patient> findPatientsByName(Records records, String[] keywords) {
return findPatientsByAttribute(records, keywords, (p, keyword) -> p.getName().contains(keyword));
public static List<Patient> findPatientsByName(Records records, String[] keywords) {
return findPatientsByAttribute(records, keywords, (p, keyword) ->
p.getName().toLowerCase().contains(keyword.toLowerCase()));
}

public List<Patient> findPatientsByNric(Records records, String[] keywords) {
return findPatientsByAttribute(records, keywords, (p, keyword) -> p.getNric().contains(keyword));
public static List<Patient> findPatientsByNric(Records records, String[] keywords) {
return findPatientsByAttribute(records, keywords, (p, keyword) ->
p.getNric().toLowerCase().contains(keyword.toLowerCase()));
}

public List<Patient> findPatientsByDateOfBirth(Records records, String[] keywords) {
public static List<Patient> 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 List<Patient> findPatientsByPhoneNumber(Records records, String[] keywords) {
return findPatientsByAttribute(records, keywords, (p, keyword) -> p.getPhoneNumber().contains(keyword));
public static List<Patient> findPatientsByPhoneNumber(Records records, String[] keywords) {
return findPatientsByAttribute(records, keywords, (p, keyword) ->
p.getPhoneNumber().toLowerCase().contains(keyword.toLowerCase()));
}

public List<Patient> findPatientsByHomeAddress(Records records, String[] keywords) {
return findPatientsByAttribute(records, keywords, (p, keyword) -> p.getHomeAddress().contains(keyword));
public static List<Patient> findPatientsByHomeAddress(Records records, String[] keywords) {
return findPatientsByAttribute(records, keywords, (p, keyword) ->
p.getHomeAddress().toLowerCase().contains(keyword.toLowerCase()));
}

public List<Patient> findPatientsByDiagnosis(Records records, String[] keywords) {
return findPatientsByAttribute(records, keywords, (p, keyword) -> p.getDiagnosis().contains(keyword));
public static List<Patient> findPatientsByDiagnosis(Records records, String[] keywords) {
return findPatientsByAttribute(records, keywords, (p, keyword) ->
p.getDiagnosis().toLowerCase().contains(keyword.toLowerCase()));
}

public List<Patient> findPatientsByMedication(Records records, String[] keywords) {
return findPatientsByAttribute(records,keywords, (p, keyword) -> p.getMedication().contains(keyword));
public static List<Patient> findPatientsByMedication(Records records, String[] keywords) {
return findPatientsByAttribute(records, keywords, (p, keyword) -> p.getMedication().contains(keyword));
}

public static List<Patient> findPatientsByAttribute(Records records, String[] keywords,
FindAttributeCheck attributeCheck) {
List<Patient> 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;
}
}
8 changes: 8 additions & 0 deletions src/main/java/BookBob/functions/FindAttributeCheck.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package BookBob.functions;

import BookBob.entity.Patient;

@FunctionalInterface
public interface FindAttributeCheck {
boolean test(Patient patient, String keyword);
}

0 comments on commit 984a406

Please sign in to comment.