|
|
@@ -9,17 +9,20 @@ import me.blackphreak.Student.Types.OverseaStudent;
|
|
|
|
|
|
import java.sql.ResultSet;
|
|
|
import java.sql.SQLException;
|
|
|
-import java.util.*;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
|
|
|
|
import static me.blackphreak.Lib.promptQuestion;
|
|
|
import static me.blackphreak.Lib.tryParseUInt;
|
|
|
|
|
|
-public class SearchCommand extends AbstractCommandHandler {
|
|
|
+public class SearchStudentCommand extends AbstractCommandHandler {
|
|
|
private List<String> colNames = new ArrayList<>();
|
|
|
- private HashMap</*colName*/String, /*searchCondition*/String> selectedCols = new HashMap<>();
|
|
|
+ private HashMap</*colName*/String, /*searchCondition*/String> selectedCols;
|
|
|
|
|
|
- public SearchCommand(String desc) {
|
|
|
+ public SearchStudentCommand(String desc) {
|
|
|
super(desc);
|
|
|
|
|
|
Database db = Database.getInstance();
|
|
|
@@ -35,7 +38,7 @@ public class SearchCommand extends AbstractCommandHandler {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void handle() {
|
|
|
+ public boolean handle() {
|
|
|
boolean nextFlag;
|
|
|
do
|
|
|
{
|
|
|
@@ -45,14 +48,80 @@ public class SearchCommand extends AbstractCommandHandler {
|
|
|
System.out.println("Please select at least one column to search.");
|
|
|
} while (!nextFlag);
|
|
|
|
|
|
+
|
|
|
conditionEntryMenu();
|
|
|
|
|
|
+ queryAndPrintMatchedStudent();
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean selectColumnMenu() {
|
|
|
+ String inp;
|
|
|
+
|
|
|
+ System.out.println("Search student by (multiple):");
|
|
|
+
|
|
|
+ AtomicInteger i = new AtomicInteger();
|
|
|
+ // print keys only (display col name)
|
|
|
+ colNames.forEach(colName -> System.out.println(String.format(
|
|
|
+ " %2s. %s",
|
|
|
+ i.incrementAndGet() + "",
|
|
|
+ colName
|
|
|
+ )));
|
|
|
+
|
|
|
+ System.out.println("\n** use comma to separate columns **");
|
|
|
+ inp = promptQuestion(String.format(
|
|
|
+ "Select search column(s) (1 - %d): ",
|
|
|
+ colNames.size()
|
|
|
+ ));
|
|
|
+
|
|
|
+ // input validation & parsing
|
|
|
+ List<String> tmp_selectedCols = new ArrayList<>(Arrays.asList(
|
|
|
+ inp.replaceAll("\\s+", "")
|
|
|
+ .split(",")));
|
|
|
+
|
|
|
+ // remove duplicated & validate column options
|
|
|
+ selectedCols = new HashMap<>();
|
|
|
+ tmp_selectedCols.stream()
|
|
|
+ .distinct()
|
|
|
+ .filter(targetCol ->
|
|
|
+ !targetCol.isBlank()
|
|
|
+ && !targetCol.isEmpty()
|
|
|
+ && targetCol.matches("\\d+")
|
|
|
+ )
|
|
|
+ .sorted()
|
|
|
+ .forEach(targetCol ->
|
|
|
+ selectedCols.put(colNames.get(
|
|
|
+ tryParseUInt(targetCol)-1
|
|
|
+ ), ""));
|
|
|
+
|
|
|
+ return selectedCols.size() > 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void conditionEntryMenu() {
|
|
|
+ selectedCols.keySet().forEach(col -> {
|
|
|
+ System.out.println("\n** use \"_\" as a wildcard character **");
|
|
|
+ System.out.println("** use \"%\" to represent any wildcard character(s) **");
|
|
|
+ System.out.println("** leave it blank to not consider as a condition **");
|
|
|
+
|
|
|
+ String inp = promptQuestion(String.format(
|
|
|
+ "Search \"%s\" with: ",
|
|
|
+ col
|
|
|
+ ));
|
|
|
+
|
|
|
+ if (!inp.isEmpty() && !inp.isBlank())
|
|
|
+ selectedCols.put(col, inp);
|
|
|
+ else
|
|
|
+ selectedCols.remove(col);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ private void queryAndPrintMatchedStudent() {
|
|
|
// build SQL statement
|
|
|
StringBuilder sql = new StringBuilder("SELECT * FROM Student WHERE ");
|
|
|
AtomicInteger i = new AtomicInteger();
|
|
|
selectedCols.forEach((k, v) -> {
|
|
|
if (i.getAndIncrement() > 0) {
|
|
|
- sql.append(" AND ");
|
|
|
+ sql.append(" OR ");
|
|
|
}
|
|
|
|
|
|
sql.append("`").append(k).append("`");
|
|
|
@@ -95,8 +164,9 @@ public class SearchCommand extends AbstractCommandHandler {
|
|
|
} while (rs.next());
|
|
|
}
|
|
|
catch (SQLException e) {
|
|
|
- // TODO: handling
|
|
|
+ Debug.err("Failed to search. Error:");
|
|
|
e.printStackTrace();
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
System.out.println(String.format(
|
|
|
@@ -116,15 +186,15 @@ public class SearchCommand extends AbstractCommandHandler {
|
|
|
|
|
|
students.forEach((k, v) -> System.out.println(
|
|
|
String.format("+ %-13s | %-13s | %-13s | %-"+(20-v.getChtName().length())+"s | %-30s | %-10s | %s",
|
|
|
- v.getStudentID(),
|
|
|
- (v instanceof LocalStudent) ?
|
|
|
- ((LocalStudent)v).getHKID()
|
|
|
- : ((OverseaStudent)v).getVisa(),
|
|
|
- v.getNationality(),
|
|
|
- v.getChtName(),
|
|
|
- v.getEngName(),
|
|
|
- v.getMobileNumber(),
|
|
|
- v.getHomeAddress()
|
|
|
+ k,
|
|
|
+ (v instanceof LocalStudent)
|
|
|
+ ? ((LocalStudent)v).getHKID()
|
|
|
+ : ((OverseaStudent)v).getVisa(),
|
|
|
+ v.getNationality(),
|
|
|
+ v.getChtName(),
|
|
|
+ v.getEngName(),
|
|
|
+ v.getMobileNumber(),
|
|
|
+ v.getHomeAddress()
|
|
|
)
|
|
|
));
|
|
|
|
|
|
@@ -133,76 +203,9 @@ public class SearchCommand extends AbstractCommandHandler {
|
|
|
// ChtName + EngName + mobile + addr
|
|
|
System.out.println("----------------------+--------------------------------+------------+-->");
|
|
|
|
|
|
-
|
|
|
- // TODO: allow selection
|
|
|
- }
|
|
|
-
|
|
|
- private boolean selectColumnMenu() {
|
|
|
- String inp;
|
|
|
-
|
|
|
- System.out.println("Search student by (multiple):");
|
|
|
-
|
|
|
- AtomicInteger i = new AtomicInteger();
|
|
|
- // print keys only (display col name)
|
|
|
- colNames.forEach(colName -> System.out.println(String.format(
|
|
|
- " %2s. %s",
|
|
|
- i.incrementAndGet() + "",
|
|
|
- colName
|
|
|
- )));
|
|
|
-
|
|
|
- System.out.println("\n** use comma to separate columns **");
|
|
|
- inp = promptQuestion(String.format(
|
|
|
- "Select search column(s) (1 - %d): ",
|
|
|
- colNames.size()
|
|
|
- ));
|
|
|
-
|
|
|
- // input validation & parsing
|
|
|
- List<String> tmp_selectedCols = new ArrayList<>(Arrays.asList(
|
|
|
- inp.replaceAll("\\s+", "")
|
|
|
- .split(",")));
|
|
|
-
|
|
|
- // remove duplicated & validate column options
|
|
|
- tmp_selectedCols.stream()
|
|
|
- .distinct()
|
|
|
- .filter(targetCol ->
|
|
|
- !targetCol.isBlank()
|
|
|
- && !targetCol.isEmpty()
|
|
|
- && targetCol.matches("\\d+")
|
|
|
- )
|
|
|
- .sorted()
|
|
|
- .forEach(targetCol ->
|
|
|
- selectedCols.put(colNames.get(
|
|
|
- tryParseUInt(targetCol)-1
|
|
|
- ), ""));
|
|
|
-
|
|
|
- return selectedCols.size() > 0;
|
|
|
- }
|
|
|
-
|
|
|
- private void conditionEntryMenu() {
|
|
|
-
|
|
|
- selectedCols.keySet().forEach(col -> {
|
|
|
- System.out.println("\n** use \"_\" as a wildcard character **");
|
|
|
- System.out.println("** use \"%\" to represent any wildcard character(s) **");
|
|
|
- System.out.println("** leave it blank to not consider as a condition **");
|
|
|
-
|
|
|
- String inp = promptQuestion(String.format(
|
|
|
- "Search \"%s\" with: ",
|
|
|
- col
|
|
|
- ));
|
|
|
-
|
|
|
- if (!inp.isEmpty() && !inp.isBlank())
|
|
|
- selectedCols.put(col, inp);
|
|
|
- else
|
|
|
- selectedCols.remove(col);
|
|
|
- });
|
|
|
}
|
|
|
|
|
|
private void undo() {
|
|
|
|
|
|
}
|
|
|
-
|
|
|
- @Override
|
|
|
- protected void doneAndReset() {
|
|
|
- selectedCols.clear();
|
|
|
- }
|
|
|
}
|