게시글 검색시 division을 적용하여 5000개 단위로 검색하고 계속 검색하도록 하여 속도 증가

git-svn-id: http://xe-core.googlecode.com/svn/sandbox@3155 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
zero 2007-12-05 03:04:31 +00:00
parent 539c32082e
commit 1d4191e9ba
17 changed files with 148 additions and 21 deletions

View file

@ -139,10 +139,13 @@
$args->page_count = $obj->page_count?$obj->page_count:10;
$args->start_date = $obj->start_date?$obj->start_date:null;
$args->end_date = $obj->end_date?$obj->end_date:null;
//if($except_notice) $args->s_is_notice = 'N';
// 기본으로 사용할 query id 지정 (몇가지 검색 옵션에 따라 query id가 변경됨)
$query_id = 'document.getDocumentList';
// 내용검색일 경우 document division을 지정하여 검색하기 위한 처리
$use_division = false;
// 검색 옵션 정리
$search_target = $obj->search_target;
$search_keyword = $obj->search_keyword;
@ -151,15 +154,18 @@
case 'title' :
if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword);
$args->s_title = $search_keyword;
$use_division = true;
break;
case 'content' :
if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword);
$args->s_content = $search_keyword;
$use_division = true;
break;
case 'title_content' :
if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword);
$args->s_title = $search_keyword;
$args->s_content = $search_keyword;
$use_division = true;
break;
case 'user_id' :
if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword);
@ -225,16 +231,73 @@
$args->s_comment = $search_keyword;
$args->sort_index = 'documents.'.$args->sort_index;
$query_id = 'document.getDocumentListWithinComment';
$use_division = true;
break;
default :
preg_match('/^extra_vars([0-9]+)$/',$search_target,$matches);
if($matches[1]) {
$args->{"s_extra_vars".$matches[1]} = $search_keyword;
$use_division = true;
}
break;
}
}
/**
* 만약 use_division이 true일 경우 document division을 이용하도록 변경
**/
if($use_division) {
// 시작 division
$division = (int)Context::get('division');
// division값이 없다면 제일 상위
if(!$division) {
$division_args->module_srl = $args->module_srl;
$division_args->list_count = 1;
$division_args->sort_index = $args->sort_index;
$division_args->order_type = $args->order_type;
$output = executeQuery("document.getDocumentList", $division_args);
if($output->data) {
$item = array_pop($output->data);
$division = $item->list_order;
}
$division_args = null;
}
// 마지막 division
$last_division = (int)Context::get('last_division');
// 지정된 division에서부터 5000개 후의 division값을 구함
if(!$last_division) {
$last_division_args->module_srl = $args->module_srl;
$last_division_args->list_count = 1;
$last_division_args->sort_index = $args->sort_index;
$last_division_args->order_type = $args->order_type;
$last_division_args->list_order = $division;
$last_division_args->page = 5001;
$output = executeQuery("document.getDocumentDivision", $last_division_args);
if($output->data) {
$item = array_pop($output->data);
$last_division = $item->list_order;
}
}
// last_division 이후로 글이 있는지 확인
if($last_division) {
$last_division_args = null;
$last_division_args->module_srl = $args->module_srl;
$last_division_args->list_order = $last_division;
$output = executeQuery("document.getDocumentDivisionCount", $last_division_args);
if($output->data->count<1) $last_division = null;
}
$args->division = $division;
$args->last_division = $last_division;
Context::set('division', $division);
Context::set('last_division', $last_division);
}
// document.getDocumentList 쿼리 실행
$output = executeQueryArray($query_id, $args);