From 3516f0a9ce7ac1dfa03d729924a8c63b2c315cdf Mon Sep 17 00:00:00 2001 From: flyskyko Date: Tue, 24 Jul 2012 04:37:13 +0000 Subject: [PATCH] issue 1925, Fixed a bug that calculates a wrong page when no page variable. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.3.1@10928 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/document/document.model.php | 490 +++++++++--------- ...cumentPage.xml => getDocumentListPage.xml} | 41 +- .../getDocumentListWithExtraVarsPage.xml | 24 + .../getDocumentListWithinCommentPage.xml | 28 + .../queries/getDocumentListWithinTag.xml | 3 + .../queries/getDocumentListWithinTagPage.xml | 23 + 6 files changed, 341 insertions(+), 268 deletions(-) rename modules/document/queries/{getDocumentPage.xml => getDocumentListPage.xml} (51%) create mode 100644 modules/document/queries/getDocumentListWithExtraVarsPage.xml create mode 100644 modules/document/queries/getDocumentListWithinCommentPage.xml create mode 100644 modules/document/queries/getDocumentListWithinTagPage.xml diff --git a/modules/document/document.model.php b/modules/document/document.model.php index b1e9e88a0..ff6cf7050 100644 --- a/modules/document/document.model.php +++ b/modules/document/document.model.php @@ -199,218 +199,93 @@ if($oCacheHandler->isSupport()){ $object_key = 'object:'.$obj->module_srl.'_category_srl:'.$obj->category_srl.'_list_count:'.$obj->list_count.'_search_target:'.$obj->search_target.'_search_keyword:'.$obj->search_keyword.'_page'.$obj->page.'_sort_index:'.$obj->sort_index.'_order_type:'.$obj->order_type; $cache_key = $oCacheHandler->getGroupKey('documentList', $object_key); - $output = $oCacheHandler->get($cache_key); + $output = $oCacheHandler->get($cache_key); + + return $output; } - if(!$output){ - $logged_info = Context::get('logged_info'); - $sort_check = $this->_setSortIndex($obj, $load_extra_vars); + $this->_setSearchOption($obj, $args, $query_id, $use_division); - $obj->sort_index = $sort_check->sort_index; - // Check the target and sequence alignment - if(!in_array($obj->order_type, array('desc','asc'))) $obj->order_type = 'asc'; - // If that came across mid module_srl instead of a direct module_srl guhaejum - if($obj->mid) { - $oModuleModel = &getModel('module'); - $obj->module_srl = $oModuleModel->getModuleSrlByMid($obj->mid); - unset($obj->mid); - } - // Module_srl passed the array may be a check whether the array - if(is_array($obj->module_srl)) $args->module_srl = implode(',', $obj->module_srl); - else $args->module_srl = $obj->module_srl; - // Except for the test module_srl - if(is_array($obj->exclude_module_srl)) $args->exclude_module_srl = implode(',', $obj->exclude_module_srl); - else $args->exclude_module_srl = $obj->exclude_module_srl; - // Variable check - $args->category_srl = $obj->category_srl?$obj->category_srl:null; - $args->sort_index = $obj->sort_index; - $args->order_type = $obj->order_type; - $args->page = $obj->page?$obj->page:1; - $args->list_count = $obj->list_count?$obj->list_count:20; - $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; - $args->member_srl = $obj->member_srl; + if ($sort_check->isExtraVars) + { + $output = executeQueryArray($query_id, $args); + } + else + { + // document.getDocumentList query execution + // Query_id if you have a group by clause getDocumentListWithinTag getDocumentListWithinComment or used again to perform the query because + $groupByQuery = array('document.getDocumentListWithinComment' => 1, 'document.getDocumentListWithinTag' => 1); + if(isset($groupByQuery[$query_id])) { + $group_args = clone($args); + $group_args->sort_index = 'documents.'.$args->sort_index; + $output = executeQueryArray($query_id, $group_args); + if(!$output->toBool()||!count($output->data)) return $output; - // only admin document list, temp document showing - if($obj->statusList) $args->statusList = $obj->statusList; - else - { - if($logged_info->is_admin == 'Y' && !$obj->module_srl) - $args->statusList = array($this->getConfigStatus('secret'), $this->getConfigStatus('public'), $this->getConfigStatus('temp')); - else - $args->statusList = array($this->getConfigStatus('secret'), $this->getConfigStatus('public')); - } - - // Category is selected, further sub-categories until all conditions - if($args->category_srl) { - $category_list = $this->getCategoryList($args->module_srl); - $category_info = $category_list[$args->category_srl]; - $category_info->childs[] = $args->category_srl; - $args->category_srl = implode(',',$category_info->childs); - } - // Used to specify the default query id (based on several search options to query id modified) - $query_id = 'document.getDocumentList'; - // If the search by specifying the document division naeyonggeomsaekil processed for - $use_division = false; - - // Search options - $searchOpt->search_target = $obj->search_target; - $searchOpt->search_keyword = $obj->search_keyword; - $this->_setSearchOption($searchOpt, $args, $query_id, $use_division); - - if ($sort_check->isExtraVars) - { - $query_id = 'document.getDocumentListExtraSort'; - $output = executeQueryArray($query_id, $args); - } - else - { - /** - * list_order asc sort of division that can be used only when - */ - if($args->sort_index != 'list_order' || $args->order_type != 'asc') $use_division = false; - - /** - * If it is true, use_division changed to use the document division - */ - if($use_division) { - // Division begins - $division = (int)Context::get('division'); - - // order by list_order and (module_srl===0 or module_srl many count), therefore case table full scan - if($args->sort_index == 'list_order' && ($args->exclude_module_srl === '0' || count(explode(',', $args->module_srl)) > 5)) - { - $listSqlID = 'document.getDocumentListUseIndex'; - $divisionSqlID = 'document.getDocumentDivisionUseIndex'; - } - else - { - $listSqlID = 'document.getDocumentList'; - $divisionSqlID = 'document.getDocumentDivision'; - } - - // If you do not value the best division top - if(!$division) { - $division_args->module_srl = $args->module_srl; - $division_args->exclude_module_srl = $args->exclude_module_srl; - $division_args->list_count = 1; - $division_args->sort_index = $args->sort_index; - $division_args->order_type = $args->order_type; - $division_args->statusList = $args->statusList; - $output = executeQuery($listSqlID, $division_args, $columnList); - if($output->data) { - $item = array_pop($output->data); - $division = $item->list_order; - } - $division_args = null; - } - // The last division - $last_division = (int)Context::get('last_division'); - // Division after division from the 5000 value of the specified Wanted - if(!$last_division) { - $last_division_args->module_srl = $args->module_srl; - $last_division_args->exclude_module_srl = $args->exclude_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($divisionSqlID, $last_division_args, $columnList); - if($output->data) { - $item = array_pop($output->data); - $last_division = $item->list_order; - } - } - // Make sure that after last_division article - if($last_division) { - $last_division_args = null; - $last_division_args->module_srl = $args->module_srl; - $last_division_args->exclude_module_srl = $args->exclude_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); + foreach($output->data as $key => $val) { + if($val->document_srl) $target_srls[] = $val->document_srl; } - // document.getDocumentList query execution - // Query_id if you have a group by clause getDocumentListWithinTag getDocumentListWithinComment or used again to perform the query because - if(in_array($query_id, array('document.getDocumentListWithinComment', 'document.getDocumentListWithinTag'))) { - $group_args = clone($args); - $group_args->sort_index = 'documents.'.$args->sort_index; - $output = executeQueryArray($query_id, $group_args); - if(!$output->toBool()||!count($output->data)) return $output; - foreach($output->data as $key => $val) { - if($val->document_srl) $target_srls[] = $val->document_srl; - } - - $page_navigation = $output->page_navigation; - $keys = array_keys($output->data); - $virtual_number = $keys[0]; - - $target_args->document_srls = implode(',',$target_srls); - $target_args->list_order = $args->sort_index; - $target_args->order_type = $args->order_type; - $target_args->list_count = $args->list_count; - $target_args->page = 1; - $output = executeQueryArray('document.getDocuments', $target_args); - $output->page_navigation = $page_navigation; - $output->total_count = $page_navigation->total_count; - $output->total_page = $page_navigation->total_page; - $output->page = $page_navigation->cur_page; - } else { - $output = executeQueryArray($query_id, $args, $columnList); - } - } - // Return if no result or an error occurs - if(!$output->toBool()||!count($output->data)) return $output; - $idx = 0; - $data = $output->data; - unset($output->data); - - if(!isset($virtual_number)) - { - $keys = array_keys($data); + $page_navigation = $output->page_navigation; + $keys = array_keys($output->data); $virtual_number = $keys[0]; + + $target_args->document_srls = implode(',',$target_srls); + $target_args->list_order = $args->sort_index; + $target_args->order_type = $args->order_type; + $target_args->list_count = $args->list_count; + $target_args->page = 1; + $output = executeQueryArray('document.getDocuments', $target_args); + $output->page_navigation = $page_navigation; + $output->total_count = $page_navigation->total_count; + $output->total_page = $page_navigation->total_page; + $output->page = $page_navigation->cur_page; + } else { + $output = executeQueryArray($query_id, $args, $columnList); } - - if($except_notice) { - foreach($data as $key => $attribute) { - if($attribute->is_notice == 'Y') $virtual_number --; - } - } - - foreach($data as $key => $attribute) { - if($except_notice && $attribute->is_notice == 'Y') continue; - $document_srl = $attribute->document_srl; - if(!$GLOBALS['XE_DOCUMENT_LIST'][$document_srl]) { - $oDocument = null; - $oDocument = new documentItem(); - $oDocument->setAttribute($attribute, false); - if($is_admin) $oDocument->setGrant(); - $GLOBALS['XE_DOCUMENT_LIST'][$document_srl] = $oDocument; - } - - $output->data[$virtual_number] = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]; - $virtual_number --; - - } - - if($load_extra_vars) $this->setToAllDocumentExtraVars(); - - if(count($output->data)) { - foreach($output->data as $number => $document) { - $output->data[$number] = $GLOBALS['XE_DOCUMENT_LIST'][$document->document_srl]; - } - } - //insert in cache - if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key,$output); } + // Return if no result or an error occurs + if(!$output->toBool()||!count($output->data)) return $output; + $idx = 0; + $data = $output->data; + unset($output->data); + + if(!isset($virtual_number)) + { + $keys = array_keys($data); + $virtual_number = $keys[0]; + } + + if($except_notice) { + foreach($data as $key => $attribute) { + if($attribute->is_notice == 'Y') $virtual_number --; + } + } + + foreach($data as $key => $attribute) { + if($except_notice && $attribute->is_notice == 'Y') continue; + $document_srl = $attribute->document_srl; + if(!$GLOBALS['XE_DOCUMENT_LIST'][$document_srl]) { + $oDocument = null; + $oDocument = new documentItem(); + $oDocument->setAttribute($attribute, false); + if($is_admin) $oDocument->setGrant(); + $GLOBALS['XE_DOCUMENT_LIST'][$document_srl] = $oDocument; + } + + $output->data[$virtual_number] = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]; + $virtual_number --; + + } + + if($load_extra_vars) $this->setToAllDocumentExtraVars(); + + if(count($output->data)) { + foreach($output->data as $number => $document) { + $output->data[$number] = $GLOBALS['XE_DOCUMENT_LIST'][$document->document_srl]; + } + } + //insert in cache + if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key,$output); return $output; } @@ -661,62 +536,34 @@ * @return int */ function getDocumentPage($oDocument, $opt) { - // Sort type changes depending on the query args - switch($opt->sort_index) { - case 'update_order' : - if($opt->order_type == 'desc') $args->rev_update_order = $oDocument->get('update_order'); - else $args->update_order = $oDocument->get('update_order'); - break; - case 'regdate' : - if($opt->order_type == 'asc') $args->rev_regdate = $oDocument->get('regdate'); - else $args->regdate = $oDocument->get('regdate'); - break; - case 'voted_count' : - case 'blamed_count' : - case 'readed_count' : - case 'comment_count' : - case 'title' : - return 1; - break; - default : - if($opt->order_type == 'desc') $args->rev_list_order = $oDocument->get('list_order'); - else $args->list_order = $oDocument->get('list_order'); - break; - } - $args->module_srl = $oDocument->get('module_srl'); - $args->sort_index = $opt->sort_index; - $args->order_type = $opt->order_type; + $this->_setSearchOption($opt, $args, $query_id, $use_division); + $sort_check = $this->_setSortIndex($args, TRUE); - if($opt->statusList) $args->statusList = $opt->statusList; + if($sort_check->isExtraVars) + { + return 1; + } else { - $logged_info = Context::get('logged_info'); - if($logged_info->is_admin == 'Y' && !$args->module_srl) + if($sort_check->sort_index === 'list_order' || $sort_check->sort_index === 'update_order') { - $args->statusList = array($this->getConfigStatus('secret'), $this->getConfigStatus('public'), $this->getConfigStatus('temp')); + if($args->order_type === 'desc') + { + $args->{'rev_' . $sort_check->sort_index} = $oDocument->get($sort_check->sort_index); + } + else + { + $args->{$sort_check->sort_index} = $oDocument->get($sort_check->sort_index); + } } else { - $args->statusList = array($this->getConfigStatus('secret'), $this->getConfigStatus('public')); - } - } - - // Category is selected, further sub-categories until all conditions - if($opt->category_srl) - { - $categoryList = $this->getCategoryList($opt->module_srl); - - if(array_key_exists($opt->category_srl, $categoryList)) - { - $categoryInfo = $categoryList[$opt->category_srl]; - - $args->categorySrlList = $categoryInfo->childs; - array_push($args->categorySrlList, $opt->category_srl); + return 1; } } // Guhanhu total number of the article search page - $output = executeQuery('document.getDocumentPage', $args); + $output = executeQuery($query_id . 'Page', $args); $count = $output->data->count; $page = (int)(($count-1)/$opt->list_count)+1; return $page; @@ -1310,6 +1157,66 @@ */ function _setSearchOption($searchOpt, &$args, &$query_id, &$use_division) { + // Variable check + $args->category_srl = $searchOpt->category_srl?$searchOpt->category_srl:null; + $args->order_type = $searchOpt->order_type; + $args->page = $searchOpt->page?$searchOpt->page:1; + $args->list_count = $searchOpt->list_count?$searchOpt->list_count:20; + $args->page_count = $searchOpt->page_count?$searchOpt->page_count:10; + $args->start_date = $searchOpt->start_date?$searchOpt->start_date:null; + $args->end_date = $searchOpt->end_date?$searchOpt->end_date:null; + $args->member_srl = $searchOpt->member_srl; + + $logged_info = Context::get('logged_info'); + $sort_check = $this->_setSortIndex($searchOpt, $load_extra_vars); + + $args->sort_index = $sort_check->sort_index; + + // Check the target and sequence alignment + $orderType = array('desc' => 1, 'asc' => 1); + if(!isset($orderType[$args->order_type])) $args->order_type = 'asc'; + + // If that came across mid module_srl instead of a direct module_srl guhaejum + if($searchOpt->mid) { + $oModuleModel = &getModel('module'); + $args->module_srl = $oModuleModel->getModuleSrlByMid($obj->mid); + unset($searchOpt->mid); + } + + // Module_srl passed the array may be a check whether the array + if(is_array($searchOpt->module_srl)) $args->module_srl = implode(',', $searchOpt->module_srl); + else $args->module_srl = $searchOpt->module_srl; + + // Except for the test module_srl + if(is_array($searchOpt->exclude_module_srl)) $args->exclude_module_srl = implode(',', $searchOpt->exclude_module_srl); + else $args->exclude_module_srl = $searchOpt->exclude_module_srl; + + + // only admin document list, temp document showing + if($searchOpt->statusList) $args->statusList = $searchOpt->statusList; + else + { + if($logged_info->is_admin == 'Y' && !$searchOpt->module_srl) + $args->statusList = array($this->getConfigStatus('secret'), $this->getConfigStatus('public'), $this->getConfigStatus('temp')); + else + $args->statusList = array($this->getConfigStatus('secret'), $this->getConfigStatus('public')); + } + + // Category is selected, further sub-categories until all conditions + if($args->category_srl) { + $category_list = $this->getCategoryList($args->module_srl); + $category_info = $category_list[$args->category_srl]; + $category_info->childs[] = $args->category_srl; + $args->category_srl = implode(',',$category_info->childs); + } + + // Used to specify the default query id (based on several search options to query id modified) + $query_id = 'document.getDocumentList'; + + // If the search by specifying the document division naeyonggeomsaekil processed for + $use_division = false; + + // Search options $search_target = $searchOpt->search_target; $search_keyword = $searchOpt->search_keyword; @@ -1380,6 +1287,93 @@ break; } } + + if ($sort_check->isExtraVars) + { + $query_id = 'document.getDocumentListExtraSort'; + } + else + { + /** + * list_order asc sort of division that can be used only when + */ + if($args->sort_index != 'list_order' || $args->order_type != 'asc') $use_division = false; + + /** + * If it is true, use_division changed to use the document division + */ + if($use_division) { + // Division begins + $division = (int)Context::get('division'); + + // order by list_order and (module_srl===0 or module_srl may count), therefore case table full scan + if($args->sort_index == 'list_order' && ($args->exclude_module_srl === '0' || count(explode(',', $args->module_srl)) > 5)) + { + $listSqlID = 'document.getDocumentListUseIndex'; + $divisionSqlID = 'document.getDocumentDivisionUseIndex'; + } + else + { + $listSqlID = 'document.getDocumentList'; + $divisionSqlID = 'document.getDocumentDivision'; + } + + // If you do not value the best division top + if(!$division) + { + $division_args->module_srl = $args->module_srl; + $division_args->exclude_module_srl = $args->exclude_module_srl; + $division_args->list_count = 1; + $division_args->sort_index = $args->sort_index; + $division_args->order_type = $args->order_type; + $division_args->statusList = $args->statusList; + + $output = executeQuery($divisionSqlID, $division_args, array('list_order')); + if($output->data) + { + $item = array_pop($output->data); + $division = $item->list_order; + } + $division_args = null; + } + + // The last division + $last_division = (int)Context::get('last_division'); + + // Division after division from the 5000 value of the specified Wanted + if(!$last_division) { + $last_division_args->module_srl = $args->module_srl; + $last_division_args->exclude_module_srl = $args->exclude_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($divisionSqlID, $last_division_args, array('list_order')); + if($output->data) { + $item = array_pop($output->data); + $last_division = $item->list_order; + } + } + + // Make sure that after last_division article + if($last_division) + { + $last_division_args = new stdClass(); + $last_division_args->module_srl = $args->module_srl; + $last_division_args->exclude_module_srl = $args->exclude_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); + } + } } } ?> diff --git a/modules/document/queries/getDocumentPage.xml b/modules/document/queries/getDocumentListPage.xml similarity index 51% rename from modules/document/queries/getDocumentPage.xml rename to modules/document/queries/getDocumentListPage.xml index b14651cc3..0f815b132 100644 --- a/modules/document/queries/getDocumentPage.xml +++ b/modules/document/queries/getDocumentListPage.xml @@ -1,30 +1,21 @@ - + - + - - - - - - - - - - - - - - - - - - + + + + + + + + + @@ -45,5 +36,15 @@ + + + + + + + + + + diff --git a/modules/document/queries/getDocumentListWithExtraVarsPage.xml b/modules/document/queries/getDocumentListWithExtraVarsPage.xml new file mode 100644 index 000000000..0b1239d36 --- /dev/null +++ b/modules/document/queries/getDocumentListWithExtraVarsPage.xml @@ -0,0 +1,24 @@ + + +
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/modules/document/queries/getDocumentListWithinCommentPage.xml b/modules/document/queries/getDocumentListWithinCommentPage.xml new file mode 100644 index 000000000..97a8343e1 --- /dev/null +++ b/modules/document/queries/getDocumentListWithinCommentPage.xml @@ -0,0 +1,28 @@ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/document/queries/getDocumentListWithinTag.xml b/modules/document/queries/getDocumentListWithinTag.xml index 1d00721c3..12fe072fc 100644 --- a/modules/document/queries/getDocumentListWithinTag.xml +++ b/modules/document/queries/getDocumentListWithinTag.xml @@ -21,4 +21,7 @@ + + + diff --git a/modules/document/queries/getDocumentListWithinTagPage.xml b/modules/document/queries/getDocumentListWithinTagPage.xml new file mode 100644 index 000000000..b57359604 --- /dev/null +++ b/modules/document/queries/getDocumentListWithinTagPage.xml @@ -0,0 +1,23 @@ + + +
+
+ + + + + + + + + + + + + + + + + + +