Skip to content

Commit

Permalink
Fix online search
Browse files Browse the repository at this point in the history
Add HistorySearch time query
  • Loading branch information
WavJaby committed Feb 29, 2024
1 parent e7ccbc0 commit 3b2a473
Show file tree
Hide file tree
Showing 2 changed files with 95 additions and 42 deletions.
89 changes: 71 additions & 18 deletions src/main/java/com/wavjaby/api/search/HistorySearch.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,7 @@
import java.net.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.sql.*;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;
Expand Down Expand Up @@ -92,7 +89,7 @@ credits FLOAT(1),
instructors INTEGER ARRAY,
selected INTEGER,
available INTEGER,
time VARCHAR(64) ARRAY
time VARCHAR(64) ARRAY ARRAY
) */
addCourseStat = connection.prepareStatement("INSERT INTO \"course_112_1\" (" +
"\"department_id\",\"serial_id\",\"attribute_code\",\"system_id\"," +
Expand All @@ -105,6 +102,9 @@ time VARCHAR(64) ARRAY
String arrayContains = getMethodFullPath(HistorySearch.class.getMethod("arrayContains", Integer.class, Integer[].class));
connection.createStatement().execute(
"CREATE ALIAS IF NOT EXISTS arrayContains FOR \"" + arrayContains + "\"");
String timeContains = getMethodFullPath(HistorySearch.class.getMethod("timeContains", String.class, Integer[].class, Array[].class));
connection.createStatement().execute(
"CREATE ALIAS IF NOT EXISTS timeContains FOR \"" + timeContains + "\"");
} catch (NoSuchMethodException e) {
logger.errTrace(e);
}
Expand All @@ -120,6 +120,7 @@ time VARCHAR(64) ARRAY
"(? IS NULL OR \"name_tw\" LIKE ? OR \"name_en\" LIKE ?) AND" +
"(? IS NULL OR arrayContains(?,\"tags\")) AND" +
"(? IS NULL OR arrayContains(?,\"instructors\")) AND" +
"(? OR timeContains(?,?,\"time\")) AND" +
"(? IS NULL OR \"for_grade\"=?)");

} catch (SQLException e) {
Expand Down Expand Up @@ -192,9 +193,9 @@ public static void main(String[] args) {
HistorySearch historySearch = new HistorySearch(proxyManager, robotCheck);
historySearch.start();

// historySearch.fetchCourse(historySearch, 112, 112);
// historySearch.writeDatabase();
historySearch.readDatabase();
// historySearch.fetchCourse(historySearch, 112, 112);
historySearch.stop();

robotCode.stop();
Expand Down Expand Up @@ -353,7 +354,15 @@ private void courseAdd(CourseData courseDataTW, CourseData courseDataEN) {
return;
}
for (int i = 0; i < timeArray.length; i++) {
timeArray[i] = courseDataTW.timeList[i].toStringShort();
CourseData.TimeData tim = courseDataTW.timeList[i];
if (tim.detailedTimeData != null)
timeArray[i] = new Object[]{tim.detailedTimeData};
else
timeArray[i] = new Object[]{
tim.dayOfWeek == null ? null : tim.dayOfWeek.toString(),
tim.sectionStart == null ? null : tim.sectionStart.toString(),
tim.sectionEnd == null ? null : tim.sectionEnd.toString(),
tim.buildingId, tim.roomId};
}

addCourseStat.setString(1, courseDataTW.departmentId); // department_id
Expand Down Expand Up @@ -386,21 +395,23 @@ private void courseAdd(CourseData courseDataTW, CourseData courseDataEN) {
addCourseStat.setArray(19, connection.createArrayOf("INTEGER", instructorIds)); // instructors
addCourseStat.setObject(20, courseDataTW.selected, Types.INTEGER); // selected
addCourseStat.setObject(21, courseDataTW.available, Types.INTEGER); // available
addCourseStat.setArray(22, connection.createArrayOf("TEXT", timeArray)); // time
addCourseStat.setArray(22, connection.createArrayOf("ARRAY", timeArray)); // time
addCourseStat.executeUpdate();
addCourseStat.clearParameters();
} catch (SQLException e) {
sqlDriver.printStackTrace(e);
}
}

private void courseGet(String deptId, Integer serialNumber, String courseName, String tagName, String instructorName, Integer grade) {
private void courseGet(String deptId, Integer serialNumber,
String courseName, String tagName, String instructorName, Integer grade,
Integer dayOfWeek, Integer[] sections) {
try {
if (deptId != null && deptId.isEmpty()) deptId = null;
if (courseName != null && courseName.isEmpty()) courseName = null;
if (tagName != null && tagName.isEmpty()) tagName = null;
if (instructorName != null && instructorName.isEmpty()) instructorName = null;
boolean withSerial = serialNumber != null;
if (sections != null && sections.length == 0) sections = null;
// Department id
getCourseStat.setString(1, deptId);
getCourseStat.setString(2, deptId);
Expand All @@ -424,20 +435,27 @@ private void courseGet(String deptId, Integer serialNumber, String courseName, S
getCourseStat.setObject(10, instructorId, Types.INTEGER);
getCourseStat.setObject(11, instructorId, Types.INTEGER);
// For grade
getCourseStat.setObject(12, grade, Types.INTEGER);
getCourseStat.setObject(13, grade, Types.INTEGER);
String dayOfWeekStr = dayOfWeek == null ? null : dayOfWeek.toString();
getCourseStat.setBoolean(12, dayOfWeekStr == null && sections == null);
getCourseStat.setString(13, dayOfWeekStr);
getCourseStat.setObject(14, sections, Types.ARRAY);
// For grade
getCourseStat.setObject(15, grade, Types.INTEGER);
getCourseStat.setObject(16, grade, Types.INTEGER);

ResultSet result = getCourseStat.executeQuery();
int count = 0;
while (result.next()) {
String name = result.getNString("name_tw");
Object[] time = (Object[]) result.getArray("time").getArray();
Object[] times = (Object[]) result.getArray("time").getArray();
Object[] instructors = (Object[]) result.getArray("instructors").getArray();
Object[] tags = (Object[]) result.getArray("tags").getArray();
logger.log(name);
logger.log(Arrays.toString(time));
logger.log(Arrays.toString(instructors));
logger.log(Arrays.toString(tags));
// logger.log(Arrays.toString(instructors));
// logger.log(Arrays.toString(tags));
for (Object time : times) {
logger.log(Arrays.toString((Object[]) ((Array) time).getArray()));
}
count++;
}
logger.log(count);
Expand All @@ -451,7 +469,7 @@ private void courseGet(String deptId, Integer serialNumber, String courseName, S
public void readDatabase() {
logger.log("Read database");
// courseGet("F7", 6, null, null, null, null);
courseGet(null, null, null, "英語授課", null, null);
courseGet(null, null, null, null, null, null, null, new Integer[]{1});
}

public void writeDatabase() {
Expand Down Expand Up @@ -1107,7 +1125,7 @@ private void getResources(CookieStore cookieStore) {
.timeout(30 * 1000)
.execute();
} catch (IOException e) {
logger.errTrace(e);
logger.warn(e);
}
// logger.log("get: " + url.substring(courseQueryNckuOrg.length()));
});
Expand Down Expand Up @@ -1188,4 +1206,39 @@ public static boolean arrayContains(Integer integer, Integer[] array) {
}
return false;
}

public static boolean timeContains(String dayOfWeek, Integer[] sections, Array[] array) {
for (Array time : array) {
Object[] timeArr;
try {
timeArr = (Object[]) time.getArray();
} catch (SQLException e) {
logger.errTrace(e);
break;
}
if (timeArr.length == 1)
continue;

boolean find = true;
if (dayOfWeek != null)
find = dayOfWeek.equals(timeArr[0]);
if (find && sections != null) {
find = false;
if (timeArr[1] != null) {
int start = Integer.parseInt((String) timeArr[1]);
int end = timeArr[2] == null ? start : Integer.parseInt((String) timeArr[2]);
// Check course section in range
for (int section : sections) {
if (section >= start && section <= end) {
find = true;
break;
}
}
}
}
if (find)
return true;
}
return false;
}
}
48 changes: 24 additions & 24 deletions src/main/java/com/wavjaby/api/search/Search.java
Original file line number Diff line number Diff line change
Expand Up @@ -814,7 +814,7 @@ public void getQueryCourseData(CourseSearchQuery searchQuery, SaveQueryToken sav

public SaveQueryToken createSaveQueryToken(CourseSearchQuery searchQuery, CookieStore cookieStore, SearchResult result) {
StringBuilder postData = new StringBuilder();
String baseUrl;
String baseUrl = courseNckuOrg;
CookieStore postCookieStore;
// Build query
try {
Expand Down Expand Up @@ -843,29 +843,29 @@ public SaveQueryToken createSaveQueryToken(CourseSearchQuery searchQuery, Cookie
// postData.append("id=").append(URLEncoder.encode(searchID, "UTF-8"));
// }

// Maybe temporary
Connection request = HttpConnection.connect(courseNckuOrg + "/index.php?c=qry11215&m=en_query")
.header("Connection", "keep-alive")
.cookieStore(cookieStore)
.ignoreContentType(true)
.userAgent(USER_AGENT)
.proxy(proxyManager.getProxy());
HttpResponseData httpResponseData = robotCheck.sendRequest(courseNckuOrg, request, cookieStore);
if (httpResponseData.state != ResponseState.SUCCESS) {
result.errorFetch("Failed to renew search id");
return null;
}
String resultHtml = processIframe(httpResponseData.data, cookieStore, proxyManager, robotCheck);
if (resultHtml == null) {
result.errorFetch("Failed to get renew cookie");
return null;
}
baseUrl = findStringBetween(resultHtml, "<base", "href=\"", "\"");
if (baseUrl == null) {
result.errorFetch("Base url not found");
return null;
}
cosPreCheck(baseUrl, resultHtml, cookieStore, null, proxyManager);
// // Maybe temporary
// Connection request = HttpConnection.connect(courseNckuOrg + "/index.php?c=qry11215&m=en_query")
// .header("Connection", "keep-alive")
// .cookieStore(cookieStore)
// .ignoreContentType(true)
// .userAgent(USER_AGENT)
// .proxy(proxyManager.getProxy());
// HttpResponseData httpResponseData = robotCheck.sendRequest(courseNckuOrg, request, cookieStore);
// if (httpResponseData.state != ResponseState.SUCCESS) {
// result.errorFetch("Failed to renew search id");
// return null;
// }
// String resultHtml = processIframe(httpResponseData.data, cookieStore, proxyManager, robotCheck);
// if (resultHtml == null) {
// result.errorFetch("Failed to get renew cookie");
// return null;
// }
// baseUrl = findStringBetween(resultHtml, "<base", "href=\"", "\"");
// if (baseUrl == null) {
// result.errorFetch("Base url not found");
// return null;
// }
// cosPreCheck(baseUrl, resultHtml, cookieStore, null, proxyManager);
// baseUrl = courseNckuOrg;

// Write post data
Expand Down

0 comments on commit 3b2a473

Please sign in to comment.