I suggest to add such a code at the end of family.module:
function family_views_pre_execute(&$view)
{
if($view && $view->name === 'family')
{
switch($view->current_display){
case 'page_1' :
break;
case 'page_2' :
$cnt=db_result(db_query("SELECT count(*) AS `cnt` FROM {node} node WHERE (node.type in ('family_individual')) AND (node.status <> 0)"));
$curr_page = intval($_GET['page']);
$per_page = intval($view->pager['items_per_page']);
$offset = $curr_page*$per_page;
$view->pager['offset']=($offset>$cnt)?0:-$offset;
$view->build_info['query'] ="SELECT
`family_individual`.`nid` AS nid,
`family_individual`.`lastname` AS family_individual_lastname,
`family_individual`.`firstname` AS family_individual_firstname,
`family_individual`.`middlename` AS family_individual_middlename,
`family_individual`.`gender` AS family_individual_gender,
`family_individual`.`birthdate` AS family_individual_birthdate,
`family_individual`.`deathdate` AS family_individual_deathdate
FROM (
SELECT `nid`
FROM {family_individual} FORCE INDEX(`lastname`)
JOIN {node} FORCE INDEX(`type`) USING(`nid`)
WHERE `type` IN ('%s') AND `status` <> 0
ORDER BY `lastname` ASC
LIMIT $offset, $per_page
) AS `tmp`
JOIN {family_individual} AS `family_individual` USING(`nid`)
ORDER BY `family_individual_lastname` ASC";
$diff=$cnt-$offset;
$view->build_info['count_query'] ="SELECT nid FROM {node} node WHERE (node.type IN ('%s')) LIMIT $diff";
break;
case 'page_3' :
$cnt=db_result(db_query("SELECT count(*) AS `cnt` FROM {node} node WHERE (node.type in ('family_group')) AND (node.status <> 0)"));
$curr_page = intval($_GET['page']);
$per_page = intval($view->pager['items_per_page']);
$offset = $curr_page*$per_page;
$view->pager['offset']=($offset>$cnt)?0:-$offset;
$view->build_info['query'] ="
SELECT
family_group.nid AS nid,
family_group.title_format AS node_title,
family_group.marr_type AS family_group_marr_type,
family_group.parent1 AS family_group_parent1,
family_group.parent2 AS family_group_parent2
FROM (
SELECT `nid`
FROM {family_group} FORCE INDEX(`nid`)
JOIN {node} FORCE INDEX(`type`) USING(`nid`)
WHERE `type` IN ('%s') AND `status` <> 0
ORDER BY {family_group}.`title_format` ASC
LIMIT $offset, $per_page
) AS `tmp`
JOIN {family_group} family_group USING(`nid`)
ORDER BY node_title ASC";
$diff=$cnt-$offset;
$view->build_info['count_query'] ="SELECT nid FROM {node} node WHERE (node.type IN ('%s')) LIMIT $diff";
break;
case 'page_4' :
break;
}
}
}
INDEXES
{node}
name: type
fields: nid, type, status
{family_individual}
name: lastname
fields: lastname, nid
{family_group}
name: nid
fields: nid, title_format
My DB is 40000+ individuals and 20000+ groups and that decreased page load time from 3-9 sec to less than a 1 sec.
Comments
Comment #1
avpadernoI am closing this feature request, as it's for a not supported project version. If you want to see this feature implemented for a supported project version, please re-open this issue.