function search_without_context() { $user_found = new User(225); $user_not_found = new User(9999); $url_nf = 'http://www.plurk.com/p/6c5cdt#response-1777726347'; $webpage_nf = $this->webpage->create($url_nf); $url_f = 'http://www.plurk.com/p/67k6st'; $webpage_f = $this->webpage->create($url_f); $text = '話說回來,其實本篇主題是要講,目前階段是Search,加入了Collection概念,並強化應用Active Record的方式之後,應該是更強大,卻也複雜到一種境界。'; $target_scope_nf = new Annotation_scope_collection(); $target_scope_nf->add_scope($this->annotation_scope->create_scope(18, 33, $text, $webpage_f)); $target_scope_f = new Annotation_scope_collection(); $target_scope_f->add_scope($this->annotation_scope->create_scope(3, 20, $text, $webpage_f)); $target_scope_f->add_scope($this->annotation_scope->create_scope(26, 40, $text, $webpage_f)); $overlap_scope_nf = new Annotation_scope_collection(); $overlap_scope_nf->add_scope($this->annotation_scope->create_scope(23, 25, $text, $webpage_f)); $overlap_scope_f = new Annotation_scope_collection(); $overlap_scope_f->add_scope($this->annotation_scope->create_scope(23, 25, $text, $webpage_f)); $overlap_scope_f->add_scope($this->annotation_scope->create_scope(39, 40, $text, $webpage_f)); //----------------------------------------------------------- $search = new Search_annotation_collection(); $search->set_target_user($user_not_found); $this->unit->run($search->length(), 0, 'Search_annotation_collection,搜尋錯誤user_id,看length()'); $search = new Search_annotation_collection(); $search->set_target_user($user_found); $this->unit->run($search->length(), 2, 'Search_annotation_collection,搜尋正確的user_id,看length()'); $search = new Search_annotation_id_collection(); $search->set_target_user($user_found); $this->unit->run($search->length(), 2, 'Search_annotation_id_collection,搜尋正確的user_id,看length(),耗費時間應該比Search_annotation_collection還短'); $this->unit->run($search->get_item(0), 'is_string', 'Search_annotation_id_collection,搜尋正確的user_id,get_item(),值應該是id'); //---- $search = new Search_annotation_collection(); $search->set_target_webpage($webpage_nf); $this->unit->run($search->length(), 0, 'Search_annotation_collection,搜尋錯誤的webpage,看length()'); $this->unit->run($webpage_f->get_id(), 138, '先檢查webpage正確的id'); $search = new Search_annotation_collection(); $search->set_target_webpage($webpage_f); $this->unit->run($search->length(), 3, 'Search_annotation_collection,搜尋正確的webpage,看length()'); //---- $search = new Search_annotation_collection(); $search->set_target_scope($target_scope_nf); $this->unit->run($search->length(), 0, 'Search_annotation_collection,搜尋錯誤的target_scope,看length()'); $this->unit->run($target_scope_f->length(), 2, '先確定一下target_scope_f的數量沒錯'); $search = new Search_annotation_collection(); $search->set_target_scope($target_scope_f); $this->unit->run($search->length(), 2, 'Search_annotation_collection,搜尋正確的target_scope,看length()'); //---- $search = new Search_annotation_collection(); $search->set_exclude_scope($target_scope_nf); $this->unit->run($search->length(), 3, 'Search_annotation_collection,搜尋錯誤的exclude_scope,看length()'); $this->unit->run($search->get_item(0)->get_id(), 783, 'order scope之前'); $this->unit->run($search->get_item(0)->get_user()->get_name(), 'puddingchen.35', 'order scope之前,查看一下user name'); $search = new Search_annotation_collection(); $search->set_exclude_scope($target_scope_nf); $search->add_order(2, TRUE); $this->unit->run($search->get_item(0)->get_id(), 1017, 'order scope desc之後'); $search = new Search_annotation_collection(); $search->set_exclude_scope($target_scope_nf); $search->add_order(3); $this->unit->run($search->get_item(0)->get_id(), 1018, 'order like desc之後'); $search = new Search_annotation_collection(); $search->set_exclude_scope($target_scope_nf); $search->add_order(4); $this->unit->run($search->get_item(0)->get_id(), 1018, 'order respond desc之後'); $search = new Search_annotation_collection(); $search->set_exclude_scope($target_scope_nf); $search->add_order(5, TRUE); $this->unit->run($search->get_item(0)->get_user()->get_name(), 'pulipuli', 'order author desc之後'); $search = new Search_annotation_collection(); $search->set_exclude_scope($target_scope_nf); $search->add_order(6); $this->unit->run($search->get_item(0)->get_id(), 1018, 'order update desc之後'); $search = new Search_annotation_collection(); $search->set_exclude_scope($target_scope_nf); $search->add_order(7); $this->unit->run($search->get_item(0)->get_id(), 1018, 'order update desc之後'); $search = new Search_annotation_collection(); $search->set_exclude_scope($target_scope_f); $this->unit->run($search->length(), 1, 'Search_annotation_collection,搜尋正確的exclude_scope,看length(),應該是跟上上個測試剛好是相反地'); $this->unit->run($search->get_item(0)->get_id(), 783, 'Search_annotation_collection,搜尋正確的exclude_scope,get_item(0)並檢查id,應該是指定的784才對'); //---- $search = new Search_annotation_collection(); $search->set_overlap_scope($overlap_scope_nf); $this->unit->run($search->length(), 0, 'Search_annotation_collection,搜尋錯誤的overlap_scope,看length()'); $search = new Search_annotation_collection(); $search->set_overlap_scope($overlap_scope_f); $this->unit->run($search->length(), 2, 'Search_annotation_collection,搜尋正確的overlay_scope,看length()'); $this->unit->run($search->get_item(0)->get_id(), 1017, 'Search_annotation_collection,搜尋正確的overlay_scope,get_item() get_id()看看'); //---- $type_id_nf = 3; $type_id_f = 2; //$search = new Search_scope_collection(); $search = new Search_annotation_collection(); $search->set_target_type($type_id_nf); $this->unit->run($search->length(), 0, 'Search_annotation_collection,搜尋錯誤的target_id,看length()'); $search = new Search_annotation_collection(); $search->set_target_type($type_id_f); $this->unit->run($search->length(), 1, 'Search_annotation_collection,搜尋正確的target_id,看length()'); $this->unit->run($search->get_item(0)->get_id(), 1017, 'Search_annotation_collection,搜尋正確的type_id,get_item() get_id()看看'); //---- $search = new Search_annotation_collection(); $search->set_exclude_user($user_not_found); $this->unit->run($search->length(), 3, 'Search_annotation_collection,搜尋錯誤的exclude_user_id,看length()'); $search = new Search_annotation_collection(); $search->set_exclude_user($user_found); $this->unit->run($search->length(), 1, 'Search_annotation_collection,搜尋正確的exclude_user_id,看length()'); //---- $annotation_id_nf = 9999; $annotation_id_f = 1017; $search = new Search_annotation_collection(); $search->set_exclude_annotation($annotation_id_nf); $this->unit->run($search->length(), 3, 'Search_annotation_collection,搜尋錯誤的exclude_annotation_id,看length()'); $search = new Search_annotation_collection(); $search->set_exclude_annotation($annotation_id_f); $this->unit->run($search->length(), 2, 'Search_annotation_collection,搜尋正確的exclude_annotation_id,看length()'); $this->unit->run($search->get_item(0)->get_id(), 783, 'Search_annotation_collection,搜尋正確的exclude_annotation_id,get_item get_id'); //---- $note_nf = '搜尋錯誤'; $note_f = '變項回歸'; $search = new Search_annotation_id_collection(); $search->set_search_note($note_nf); $this->unit->run($search->length(), 0, 'Search_annotation_id_collection,搜尋錯誤的search_note,看length()'); $search = new Search_annotation_collection(); $search->set_search_note($note_f); $search->add_order(8); $this->unit->run($search->length(), 1, 'Search_annotation_collection,搜尋正確的search_note,看length()'); $this->unit->run($search->get_item(0)->get_id(), 783, 'Search_annotation_collection,搜尋正確的search_note,get_item get_id'); //---- $anchor_text_f = '冷氣電扇被子'; $search = new Search_scope_collection(); $search->set_search_anchor_text($note_nf); $this->unit->run($search->length(), 0, 'Search_annotation_id_collection,搜尋錯誤的search_anchor_text,看length()'); $search = new Search_annotation_collection(); $search->set_search_anchor_text($note_f); $search->add_order(9); $this->unit->run($search->length(), 2, 'Search_annotation_collection,搜尋正確的search_anchor_text,看length()'); $this->unit->run($search->get_item(0)->get_id(), 1017, 'Search_annotation_collection,搜尋正確的search_anchor_text,get_item get_id'); $search = new Search_annotation_collection(); $search->set_check_authorize(FALSE); $search->set_search_anchor_text($note_f); $this->unit->run($search->length(), 2, 'Search_annotation_collection,並關掉權限檢查,搜尋正確的search_anchor_text,看length()'); $this->unit->run($search->get_item(0)->get_id(), 1017, 'order score之前'); $search = new Search_annotation_collection(); $search->set_check_authorize(FALSE); $search->set_search_anchor_text($note_f); $search->add_order(1); $this->unit->run($search->get_item(0)->get_id(), 1018, 'order score之後'); $search = new Search_scope_collection(); $search->set_check_authorize(FALSE); $search->set_search_anchor_text($note_f); $this->unit->run($search->get_scope_length(), 20 - 3 + 1 + 40 - 26 + 1, 'Search_scope_collection,並關掉權限檢查,搜尋正確的search_anchor_text,看get_scope_length()'); //---- $score_over_nf = 3; $score_over_f = 2.1214435; $search = new Search_scope_collection(); $search->set_target_over_score($score_over_nf); $this->unit->run($search->length(), 0, 'Search_annotation_id_collection,搜尋錯誤的target_over_score,看length()'); $search = new Search_annotation_collection(); $search->set_target_over_score($score_over_f); $this->unit->run($search->length(), 1, 'Search_annotation_collection,搜尋正確的target_over_score,看length()'); $this->unit->run($search->get_item(0)->get_id(), 1018, 'Search_annotation_collection,搜尋正確的target_over_score,get_item get_id'); $search = new Search_annotation_user_collection(); $search->set_target_over_score($score_over_f); $this->unit->run($search->length(), 1, 'Search_annotation_user_collection,搜尋正確的target_over_score,length'); $this->unit->run($search->get_item(0)->get_id(), 225, 'Search_annotation_user_collection,搜尋正確的target_over_score,get_item get_id'); // //-------------------------------------------------------------------------------- // $search = new Search_annotation_collection(); // $search->set_check_authorize(FALSE); // $search->set_target_user($user_not_found); // $this->unit->run($search->length() // , 0 // , 'Search_annotation_collection,取消auth,搜尋錯誤user_id,看length()'); // // $search = new Search_annotation_collection(); // $search->set_check_authorize(FALSE); // $search->set_target_user($user_found); // $this->unit->run($search->length() // , 4 // , 'Search_annotation_collection,取消auth,搜尋正確的user_id,看length()'); // $this->unit->run($test_result // , $expected_result // , $test_name); // $this->unit->run($test_result // , $expected_result // , $test_name); //context_complete(); unit_test_report($this); }
/** * Action範例 * * @param Array $data 由KALS_controller傳入的資料,組成是關連式的陣列 * * [Controller的JSON格式] * _data = { * "field": "value" * }; * * //取用範例 * _data["field]; //回傳value * * [Model的Array格式] * $data = array( * "field" => "value" * ); * * $data["field"]; //回傳value * * @return Array 要回傳給KALS_controller的資料 * 一樣是以關聯式陣列組成 * */ public function get_heading_annotation($data) { $structure = $data["structure"]; // [14, 56, 70] $current_type = $data["current_type"]; //test_msg($data); // 1. 搜尋指定類型的標註 $search = new Search_annotation_collection(); // 1.1. 指定現在的網頁 $webpage = $this->get_current_webpage(); $search->set_target_webpage($webpage->get_id()); // 1.2. 指定現在要搜尋的標註類型 //test_msg("current_type", $current_type); //$current_type = intval($current_type); $search->set_target_type($current_type); // 2. 取得一個Annotation_collection $annotation_collection = $search; //test_msg("Data found?", $search->length() ); // 2.1. 準備一下待會要儲存標題與標註數量的陣列 $heading_list = array(); if (isset($data["order_by_article"]) && $data["order_by_article"] !== TRUE) { } else { for ($i = 0; $i < count($structure); $i++) { $heading_list[$i] = 0; } } // 3. 迴圈,一一檢查每一個Annotation $total_count = 0; foreach ($search as $index => $annotation) { // 4. 取出Annotation的位置,找出from_index $scope_coll = $annotation->get_scopes(); $from_index = $scope_coll->get_first_index(); //test_msg($from_index); // 5. 判斷他是位於哪一個章節 // [14, 56, 70] $current_heading_number = 0; foreach ($structure as $heading_number => $last_index) { //test_msg("foreach", array($from_index, $last_index, $heading_number)); if ($from_index < $last_index) { $current_heading_number = $heading_number; break; } } // 6. 組成回傳的資料 $count = 1; if (key_exists($current_heading_number, $heading_list) === TRUE) { $count = $heading_list[$current_heading_number]; $count = $count + 1; } //test_msg("heading_list", array($current_heading_number, $count)); $heading_list[$current_heading_number] = $count; $total_count++; } // array( // 1 => 4, // 5 => 9, // 12 => 1 // ) // 7. 排序 if (isset($data["order_by_article"]) && $data["order_by_article"] !== TRUE) { arsort($heading_list); } // array( // 5 => 9, // 1 => 4, // 12 => 1 // ) // 7.1. 排序之後,輸出成JavaScript要的data形式 $heading_data = array(); if (is_array($heading_list)) { foreach ($heading_list as $heading_number => $count) { $item = array("heading_number" => $heading_number, "type_count" => $count); //test_msg("item", $item); //$return_data[] = $item; array_push($heading_data, $item); } } $return_data = array('heading_data' => $heading_data, 'total_count' => $total_count); // 8. 回傳 //test_msg($return_data); return $return_data; //test_msg($data); //return $heading_list; }
/** * 搜尋標註 * @param string $json * @param type $callback * @return type */ function search_annotation($json, $callback = NULL) { /** * @author Pulipuli Chen 20141111 * 測試很長時間才回應搜尋結果用的 */ //sleep(3); /** * 檢查SQL用 * @author Pulipuli Chen <*****@*****.**> 20141114 */ //$enable_profiler = true; $enable_profiler = false; if ($enable_profiler == TRUE) { $this->output->enable_profiler(TRUE); } if (is_string($json)) { $data = json_to_object($json); //把js丟過來的資料(search)包成物件data,內含 // search_range,keyword,新增order_by //test_msg($json); //test_msg($data); } else { $data = $json; } $reuqest_scope_collection = isset($data->limit) && isset($data->offset) === false; //$reuqest_scope_collection = true; //test_msg("reuqest_scope_collection", array($reuqest_scope_collection) ); // $user = get_context_user(); $url = $this->url; //存放目前data來源的頁面連結 // $search = new Search_annotation_collection($url); //Search_annotation_collection→Search_engine $search = new Search_annotation_collection(); //Search_annotation_collection→Search_engine if ($reuqest_scope_collection) { $search_all = new Search_annotation_collection(); } /** * 限定搜尋範圍只在來源的網頁 */ $search->set_target_referer_webpage(); if ($reuqest_scope_collection) { $search_all->set_target_referer_webpage(); } //test_msg("輸入資料", $json); //$data->search_range = "annotation_anchor"; //測試用 if (isset($data->query_field) === FALSE) { $data->query_field = "note"; } switch ($data->query_field) { case "annotation_user_name": //示範用 //$search->set_target_user(new User(1701)); $search->set_search_user_name($data->query_value); if ($reuqest_scope_collection) { $search_all->set_search_user_name($data->query_value); } break; case "note": //標註內容 if ($data->query_value != "" && $data->query_value != "*") { $search->set_search_note($data->query_value); if ($reuqest_scope_collection) { $search_all->set_search_note($data->query_value); } } break; case "annotation_type": //標註類型 if ($data->query_value !== "custom") { $search->set_target_type($data->query_value); if ($reuqest_scope_collection) { $search_all->set_target_type($data->query_value); } } else { $exclude_type_list = $data->exclude_type_list; $search->set_exclude_type_list($exclude_type_list); if ($reuqest_scope_collection) { $search_all->set_exclude_type_list($exclude_type_list); } } break; case "annotation_anchor_text": $search->set_search_anchor_text($data->query_value); if ($reuqest_scope_collection) { $search_all->set_search_anchor_text($data->query_value); } break; } // 6 [ order by ] 設定排序方式(order_by_id,大小|小大 )-data內要有order_by的選項 //test_msg('6 [ order by ]', isset($data->order_by)); //order_by的typ類型e在Search_order_collection if (isset($data->order_by) === FALSE) { $data->order_by = "update"; } //test_msg($data->order_by); if ($data->order_by == 'update') { $search->add_order(6, TRUE); } else { if ($data->order_by == 'create') { $search->add_order(7); } else { if ($data->order_by == 'responded') { $search->add_order(4); $search->set_target_topic(true); } else { if ($data->order_by == 'liked') { $search->add_order(3); } else { if ($data->order_by == 'scope') { $search->add_order(2); } else { $search->add_order(2, TRUE); } } } } } // // if (isset($data->order_by) === FALSE OR $data->order_by != 'update') // { // $search->add_order (6, TRUE); // if (isset($search_id)) { // $search_id->add_order (6, TRUE); // } // } //輸出 $totally_loaded = TRUE; if (isset($data->limit)) { $totally_loaded = FALSE; } // ------------------------------------------------------- // 7 [ offset ] //test_msg('7 [ offset ]', isset($data->offset)); if (isset($data->offset)) { $search->set_offset($data->offset); } // 8 [ limit ] //test_msg('8 [ limit ]', array(isset($data->limit),$data->limit)); if (isset($data->limit)) { //test_msg("設定限制 limit", $data->limit); $search->set_limit($data->limit); //$search_id在此不作設限 } // ------------------------------------------ //不作limit的情況下讀完,表示完全讀取 if (isset($data->limit) && ($reuqest_scope_collection && $search->length() == $search_all->length() || $search->length() === 0)) { $totally_loaded = TRUE; } //test_msg('Search Length', $search->length()); //test_msg($url); //test_msg($this->webpage->filter_webpage_id($url)); $annotation_collection = array(); foreach ($search as $search_annotation) { $annotation_data = $search_annotation->export_webpage_data($url); //把Data export到目前的頁面上 array_push($annotation_collection, $annotation_data); } // $search_annotation = new Annotation(783); // $annotation_data = $search_annotation->export_webpage_data($url); //把Data export到目前的頁面上 // array_push($annotation_collection, $annotation_data); // -------------- // -------------- $output_data = array('annotation_collection' => $annotation_collection, 'totally_loaded' => $totally_loaded); /** * 取得搜尋結果的位置 */ if ($reuqest_scope_collection) { $scope_collection = $search_all->get_result_scope_coll(); $scope_collection_json = $scope_collection->export_webpage_data(get_context_webpage()); $output_data['scope_collection'] = $scope_collection_json; } if ($reuqest_scope_collection && isset($data->show_total_count) && $data->show_total_count === TRUE) { if ($reuqest_scope_collection) { $output_data['total_count'] = $search_all->length(); } else { if (count($annotation_collection) === 0) { $output_data['total_count'] = 0; } else { $output_data['total_count'] = count($annotation_collection); } } } //log區 $action = 30; switch ($data->query_field) { case "annotation_user_name": $action = 31; break; case "annotation_type": //標註類型 $action = 32; break; case "annotation_anchor_text": $action = 33; break; } if ($data->query_field == "note" && $data->query_value == "*" && $data->order_by == "update") { // 搜尋最新標註 $action = 34; } $log_message = array("query_value" => $data->query_value, "order_by" => $data->order_by); if (isset($output_data['total_count'])) { $log_message['total_count'] = $output_data['total_count']; } kals_log($this->db, $action, $log_message); context_complete(); if ($enable_profiler != TRUE) { return $this->_display_jsonp($output_data, $callback); } }