diff --git a/scripts/build_course_db.php b/scripts/build_course_db.php index 1071fcfd8ce60f4696dc701c81643be84d6a7798..491e85c00839a0e21248810495af6309095b3e0b 100755 --- a/scripts/build_course_db.php +++ b/scripts/build_course_db.php @@ -65,9 +65,17 @@ $edition = new Controller; $db->exec('ALTER TABLE `crosslistings` ADD INDEX ( `subjectArea` ) '); $db->exec('ALTER TABLE `crosslistings` ADD INDEX ( `courseNumber` ) '); + $db->exec('CREATE TABLE IF NOT EXISTS prereqs ( + course_id INT UNSIGNED NOT NULL , + subjectArea VARCHAR( 4 ) NOT NULL , + courseNumber VARCHAR( 4 ) NOT NULL + );'); + + $db->exec('CREATE INDEX IF NOT EXISTS IX_prereqs_subjectArea_courseNumber ON prereqs ( subjectArea, courseNumber );'); $course_stmt = $db->prepare('INSERT INTO courses (id,subjectArea,courseNumber,title,slo,prerequisite,credits,xml) VALUES (?,?,?,?,?,?,?,?);'); $cross_stmt = $db->prepare('INSERT INTO crosslistings (course_id, subjectArea, courseNumber) VALUES (?,?,?);'); + $prereq_stmt = $db->prepare('INSERT INTO prereqs (course_id, subjectArea, courseNumber) VALUES (?,?,?);'); foreach ($courses as $course) { $id++; @@ -90,6 +98,14 @@ $edition = new Controller; } $values[] = $course->prerequisite; + $prereqs = UNL_UndergraduateBulletin_EPUB_Utilities::findCourses($course->prerequisite); + foreach ($prereqs as $subj => $courseNums) { + foreach ($courseNums as $num) { + $prereq_stmt->execute(array($id, $subj, $num)); + } + } + unset($subj, $courseNums, $num, $prereqs); + $credits = $course->getCredits(); if (isset($credits['Single Value'])) { diff --git a/src/UNL/Catalog/CourseSearch/DBSearcher.php b/src/UNL/Catalog/CourseSearch/DBSearcher.php index ba3f173b9598997459f19cd16574997f37655846..31439368e72a7041caadd870a4478f9737e89e51 100644 --- a/src/UNL/Catalog/CourseSearch/DBSearcher.php +++ b/src/UNL/Catalog/CourseSearch/DBSearcher.php @@ -107,7 +107,14 @@ class DBSearcher extends \UNL_Services_CourseApproval_SearchInterface function prerequisiteQuery($prereq) { - return 'courses.prerequisite LIKE '.self::getDB()->quote('%'.$prereq.'%'); + $query = explode(' ', $prereq, 2); + $sql = ' +SELECT DISTINCT courses.id, courses.xml +FROM courses +INNER JOIN prereqs ON prereqs.course_id = courses.id +WHERE prereqs.subjectArea = ' . self::getDB()->quote($query[0]) . ' AND prereqs.courseNumber = ' . self::getDB()->quote($query[1] ?: ''); + + return new Select($sql); } function intersectQuery($query1, $query2) @@ -127,14 +134,18 @@ class DBSearcher extends \UNL_Services_CourseApproval_SearchInterface function getQueryResult($query, $offset = 0, $limit = -1) { - $query = 'SELECT DISTINCT courses.id, courses.xml - FROM courses INNER JOIN crosslistings ON courses.id=crosslistings.course_id - WHERE ( - LENGTH(crosslistings.courseNumber) >= 3 - AND crosslistings.courseNumber < "500" - OR LENGTH(crosslistings.courseNumber) < 3 - ) - AND (' . $query . ');'; + if ($query instanceof Select) { + $query = $query->__toString(); + } else { + $query = 'SELECT DISTINCT courses.id, courses.xml + FROM courses INNER JOIN crosslistings ON courses.id=crosslistings.course_id + WHERE ( + LENGTH(crosslistings.courseNumber) >= 3 + AND crosslistings.courseNumber < "500" + OR LENGTH(crosslistings.courseNumber) < 3 + ) + AND (' . $query . ');'; + } return new DBSearchResults($query, $offset, $limit); } } \ No newline at end of file diff --git a/src/UNL/Catalog/CourseSearch/Select.php b/src/UNL/Catalog/CourseSearch/Select.php new file mode 100644 index 0000000000000000000000000000000000000000..13554c7873a9862c8ceada4b8f2885fb27ae1a92 --- /dev/null +++ b/src/UNL/Catalog/CourseSearch/Select.php @@ -0,0 +1,18 @@ +<?php + +namespace UNL\Catalog\CourseSearch; + +class Select +{ + protected $sql; + + public function __construct($sql) + { + $this->sql = $sql; + } + + public function __toString() + { + return $this->sql; + } +}