public static function search($term, $page = FALSE, $num_per_page = 10) { //IF WE ARE PAGINATING if ($page) { //NEED TO FIND OUT THE LAST TITLE PAGE AND THE TAG OFFSET $title_object = Logbook::getTitleSearchObjectForUser(Application::user(), $term, $page, $num_per_page); $title_count = $title_object->loadQuery()->getCount($title_object->tableName(), $title_object->primaryKeys()); if ($title_page = Logbook::fetchPageFromObject($title_object, $page, $num_per_page)) { $title_objects = $title_page->objects(); } else { $title_objects = array(); } Logbook::current()->excludeTitleFromTagSearch(); $tag_object = Logbook::getTagSearchObjectForUser(Application::user(), $term, $page, $num_per_page); $tag_count = $tag_object->loadQuery()->getCount($tag_object->tableName(), $tag_object->primaryKeys()); $last_title_page = ceil($title_count / $num_per_page); $tag_offset = $title_count % $num_per_page; $item_count = $title_count + $tag_count; $page_count = ceil($item_count / $num_per_page); $tag_objects = array(); //IF WE ARE ON THE LAST TITLE PAGE if ($page == $last_title_page) { $num_title = count($title_objects); //IF WE NEED TO GRAB SOME FROM THE FIRST PAGE OF THE TAG RESULTS if ($tag_offset) { //GET THE FIRST PAGE OF TAG RESULTS if ($tag_page = Logbook::doTagSearchForuser(Application::user(), $term, 1, $num_per_page)) { $tag_objects = $tag_page->objects(); } $num_tag = count($tag_objects); //IF WE HAVE MORE DOCUMENTS ON THE NEXT PAGE THAN REQUIRED BY THE OFFSET while ($num_title + $num_tag > $num_per_page && $num_tag) { ArrayUtility::keySafePop($tag_objects); $num_tag = count($tag_objects); } } } else { if ($page < $last_title_page) { //GET THE TITLE RESULTS, NO NEED FOR TAG RESULTS //if($title_page = Logbook::doTitleSearchForUser(Application::user(),$term,$page,$num_per_page)) // $title_objects = $title_page->objects(); //WE ALREADY HAVE THE TITLE OBJECTS FOR THIS PAGE } else { if ($page > $last_title_page || !$last_title_page) { //WHICH PAGE OF THE TAG RESULTS ARE WE ON? $tag_page_num = $page - $last_title_page; //GET THE TAG RESULTS FOR THIS PAGE if ($tag_page = Logbook::doTagSearchForUser(Application::user(), $term, $tag_page_num, $num_per_page)) { $tag_objects = $tag_page->objects(); } //IF WE USED UP SOME TAGS ON THE LAST TITLE PAGE, GET THE NEXT PAGE TO TOP US UP if ($tag_offset) { $tag_page_next = Logbook::doTagSearchForUser(Application::user(), $term, $tag_page_num + 1, $num_per_page); } else { $tag_page_next = FALSE; } //NOW SHIFT $tag_offset TIMES for ($i = 0; $i < $tag_offset; $i++) { if (count($tag_objects)) { ArrayUtility::keySafeShift($tag_objects); } else { $i = $tag_offset; } } $tag_page = new DataPage($tag_objects, 1, count($tag_objects), count($tag_objects)); //GRAB ANY MATCHING TAG DOCUMENTS //IF WE NEED TO GRAB ANY FROM THE NEXT PAGE if ($tag_page_next && count($tag_page->objects())) { $new_tag_objects = Logbook::combineEntryResults($tag_page, $tag_page_next)->objects(); //IF WE HAVE MORE DOCUMENTS ON THE NEXT PAGE THAN REQUIRED BY THE OFFSET while (count($new_tag_objects) > $num_per_page) { ArrayUtility::keySafePop($new_tag_objects); } $tag_objects = $new_tag_objects; } else { if ($tag_page) { $tag_objects = $tag_page->objects(); } } } } } $objects = Logbook::combineEntryResults($title_objects, $tag_objects)->objects(); $ret = new DataPage($objects, $page, $num_per_page, $item_count); } else { //NOW GET THE TAG AND TITLE RESULTS FOR THE CURRENT PAGE $title_results = Logbook::doTitleSearchForUser(Application::user(), $term, $page, $num_per_page); $tag_results = Logbook::doTagSearchForUser(Application::user(), $term, $page, $num_per_page); //IF WE GOT TITLE RESULTS ONLY if ($title_results && !$tag_results) { $ret = $title_results; } //OTHERWISE IF WE GOT TAG RESULTS ONLY if (!$title_results && $tag_results) { $ret = $tag_results; } else { if ($title_results && $tag_results) { $ret = Logbook::combineEntryResults($tag_results, $title_results); } else { if (!$title_results && !$tag_results) { $ret = new DataPage(array(), 1, $num_per_page, 0); } } } } return $ret; }