예제 #1
0
 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;
 }