/** * 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 open($data) { // ----------------------- // 從現在的網頁來計算標註跟使用者 $webpage = $this->get_current_webpage(); $data["annotation_count"] = $webpage->get_written_annotations_count(); $data["user_count"] = $webpage->get_written_users_count(); // ------------------ // 取出最近的標註 $search = new Search_annotation_collection(); $search->set_target_webpage($webpage->get_id()); $search->set_check_authorize(FALSE); $limit = 5; $search->set_limit($limit); $order_type_id = 6; $desc = TRUE; $search->add_order($order_type_id, $desc); $data["last_annotation"] = array(); foreach ($search as $index => $annotation) { //$json = $annotation->export_data(); $json = $annotation; if ($index == 0) { //$last_annotation = $json; $data["last_annotation_id"] = $annotation->get_id(); $data["last_annotation_timestamp"] = $annotation->get_update_timestamp(); } // 一一加入標註 $data["last_annotation"][] = $json; } // 也可以最後一口氣取出所有標註 $data["last_annotation"] = $search; // ------------------- // 依照標註數量來判斷熱門程度 $activity = "bad"; if ($data["annotation_count"] > 20) { $activity = "good"; } else { if ($data["annotation_count"] > 5) { $activity = "normal"; } } $data["activity"] = "Good"; return $data; }
/** * 讀取RSS * * 範例:http://localhost/kals/web_apps/rss/webpage/1573 */ public function webpage($webpage_id = NULL) { if (is_null($webpage_id)) { $webpage = get_context_webpage(); $webpage_id = $webpage->get_id(); redirect("/web_apps/rss/webpage/" . $webpage_id); return; } $this->load->library('kals_resource/Webpage'); $this->load->library('kals_resource/Annotation'); $this->load->library('search/Search_annotation_collection'); $this->lang->load('kals_web_apps'); //語系 //echo $webpage_id; $webpage = new Webpage($webpage_id); //$search = $webpage->get_search_annotation(); $search = new Search_annotation_collection(); $search->set_target_webpage($webpage_id); $search->set_limit(10); $order_type_id = 6; $desc = TRUE; $search->add_order($order_type_id, $desc); // ------------------------------ // 以下開始建立RSS清單 // // 請使用php-rss-writer來建立 // // 專案首頁:https://github.com/suin/php-rss-writer // 程式碼位置:https://github.com/suin/php-rss-writer/tree/master/Source/Suin/RSSWriter // ------------------------------ $this->load->library("web_apps/Suin/RSSWriter/Feed"); $this->load->library("web_apps/Suin/RSSWriter/Channel"); $this->load->library("web_apps/Suin/RSSWriter/Item"); $feed = new Feed(); $webpage_title = $webpage->get_title(); //$webpage_topics_path = '/mobile_apps/annotation_topics/webpade_id/'.$webpage_id; //$webpage_topics_url = get_kals_base_url($webpage_topics_path); //$webpage_topics_url = site_url('/mobile_apps/annotation_topics/webpade_id/'.$webpage_id); //$webpage_topics_url = $webpage->get_url() . "#mobile=true"; $webpage_topics_url = get_kals_base_url("mobile_apps/redirect/load/" . $webpage_id); $channel = new Channel(); $channel->title($webpage_title)->description("Channel Description")->url($webpage_topics_url)->appendTo($feed); foreach ($search as $annotation) { $item = new Item(); $type = $annotation->get_type(); $type_name = $type->get_name(); $type_show; if ($type_name != 'annotation.type.custom') { //自定標註顯示 $type_show = $this->lang->line("web_apps." . $type_name); } else { $type_show = $type->get_custom_name(); } // anchor text // user name // date // annotation type // note $annotation_id = $annotation->get_id(); if (isset($annotation_id)) { //$topic_array = $this->db->query("SELECT topic_id // FROM annotation // WHERE annotation_id ='".$annotation_id."'"); $topic_array = $this->db->select("topic_id")->from("annotation")->where("annotation_id", $annotation_id)->where("deleted", "false")->get(); } foreach ($topic_array->result_array() as $row) { $topic_id = $row['topic_id']; } /** * @author Pulipuli Chen 20140429 * 要記得沒有topic的標註啊…… */ $topic_id = trim($topic_id); if ($topic_id == "") { $topic_id = $annotation_id; } //$item_url = 'http://140.119.61.137/kals/mobile/annotation_thread/'.$topic_id.'#annotation_'.$annotation_id; //$annotation_thread_path = "mobile_apps/annotation_thread/topic_id/".$topic_id."#annotation_".$annotation_id; //$item_url = site_url($annotation_thread_path); //$item_url = get_kals_base_url($annotation_thread_path); //$item_url = $webpage->get_url() . "#mobile=true&topic_id=" . $topic_id . "&annotation_id=" . $annotation_id; $item_url = get_kals_base_url("mobile_apps/redirect/load/" . $webpage_id . "/" . $topic_id . "/" . $annotation_id); //$item_url = $_SERVER["HTTP_HOST"] //test_msg($_SERVER["HTTP_HOST"]); $item->title("[" . $type_show . "] " . '"' . $annotation->get_anchor_text() . '"')->description("<div> " . $this->lang->line("web_apps.window.content.search.field.author") . ": " . $annotation->get_user()->get_name() . " </div>" . "<div> " . $this->lang->line("web_apps.window.content.search.field.author") . ": " . $annotation->get_user()->get_name() . " </div>" . "<div>" . $annotation->get_note() . " </div> \n ")->url($item_url)->appendTo($channel); } echo $feed; }
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); }
/** * * @param Search_order $order 排序設定,留空等於預設排序 * @return \Search_annotation_collection */ public function get_appended_annotation($order = NULL, $desc = NULL) { $this->_CI_load('library', 'search/Search_annotation_collection', 'search_annotation_collection'); $search = new Search_annotation_collection(); $search->set_target_webpage($this->get_id()); $search->set_check_authorize(FALSE); // 設定colllection的排序 if (isset($order)) { $search->add_order($order, $desc); } $search->disable_limit(); $search->disable_offset(); return $search; }
public function get_consensus_coll() { $this->_CI_load('library', 'search/Search_annotation_collection', 'search_annotation_collection'); $type = 'Search_annotation_collection'; $key = 'annotation_get_consensus_coll'; $value = $this->get_id(); $search = get_cache($type, $key, $value); if (is_null($search)) { $search = new Search_annotation_collection(); $search->set_check_authorize(false); $search->set_limit(NULL); $search->set_target_scope($this->scope_coll); $search->set_exclude_annotation($this->get_id()); $search->set_exclude_user($this->get_user()); $search->set_target_topic(TRUE); //只有topic才有分數 $search->add_order(1); set_cache($search, $key, $value); } return $search; }
/** * 回傳所有標註的範圍,以句子切割 * * @param Array $data 傳入sentence_structure * @return Array 要回傳給KALS_controller的資料 * 一樣是以關聯式陣列組成 */ public function whole_annotations_by_sentence($data) { $sentence_structure = $data["sentence_structure"]; $sentence_scopes = $this->_create_division_scopes($sentence_structure); // ------------------------- $webpage = $this->get_current_webpage(); $search = new Search_annotation_collection(); $search->set_target_webpage($webpage->get_id()); //$limit = 5; //$search->set_limit($limit); $order_type_id = 6; $desc = FALSE; $search->add_order($order_type_id, $desc); $is_topic = true; $search->set_target_topic($is_topic); //print_r($data["sentence_structure"]); // --------------------------- $from_index_array = array(); $steps = array(); foreach ($search as $index => $annotation) { $scopes = $annotation->get_scopes(); $from_index = $scopes->get_first_index(); $scope = $this->_match_division_scope_by_from_index($sentence_scopes, $from_index); $from_index_array[] = $from_index; // 比對是否跟上一個scope相同 if ($this->_match_last_scope($steps, $scope) === FALSE) { $steps[] = $scope; } } $data = array(); $data["steps"] = $steps; $data["from_index_array"] = $from_index_array; //$data["steps"] = $sentence_scopes; return $data; }
private function _find_recommend_annotation(Annotation $annotation) { $scope_coll = $annotation->get_scopes(); $user = $annotation->get_user(); $recommend_scope = $annotation->get_recommend_by_scopes(); if (is_null($recommend_scope)) { $recommend_scope = $scope_coll; } $target_over_score = $this->_get_recommend_by_threshold(); $this->_CI_load('library', 'search/Search_order_score', 'search_order_score'); $order_type_id = $this->CI->search_order_score->get_type_id(); $this->_CI_load('library', 'search/Search_annotation_collection', 'search_annotation_collection'); $search = new Search_annotation_collection(); $search->set_limit(1); $search->add_order($order_type_id, TRUE); $search->set_overlap_scope($recommend_scope); $search->set_exclude_scope($scope_coll); $search->set_exclude_user($user); $search->set_target_over_score($target_over_score); if ($search->length() == 1) { return $search->get_item(0); } else { return NULL; } }
/** * 取得tooltip指定的標註 * @param int $annotation_index 標註的位置 * @param string $callback */ public function tooltip($annotation_index, $callback) { // ------------- // 搜尋 //$annotation_index = 100000; $search = new Search_annotation_collection(); // 限定範圍 $search->set_overlap_scope_index($annotation_index, $annotation_index); // 依照分數排序,由高到低 $search->add_order(1, TRUE); // 只輸出一份 //$search->set_limit(1); // 限定該網頁 $search->set_target_referer_webpage(); //-------------- // 轉換資料 //$annotation = new Annotation(); //$annotation = null; $annotation = null; $output_data = array(); $result = null; foreach ($search as $search_annotation) { $annotation = $search_annotation; $result = $annotation->get_id(); $output_data["annotation"] = $annotation->export_data(); break; } $output_data["count"] = $search->length(); //-------------- // 記錄 $action = 35; $log_note = array('index' => $annotation_index, 'result' => $result); kals_log($this->db, $action, $log_note); context_complete(); // ------------- // 輸出 return $this->_display_jsonp($output_data, $callback); }