diff options
Diffstat (limited to 'mod')
-rw-r--r-- | mod/messages/start.php | 33 |
1 files changed, 28 insertions, 5 deletions
diff --git a/mod/messages/start.php b/mod/messages/start.php index 5c4081a7b..bf8272b1a 100644 --- a/mod/messages/start.php +++ b/mod/messages/start.php @@ -316,15 +316,38 @@ function count_unread_messages() { * @return int */ function messages_count_unread() { + $user_guid = elgg_get_logged_in_user_guid(); + $db_prefix = elgg_get_config('dbprefix'); + + // denormalize the md to speed things up. + // seriously, 10 joins if you don't. + $strings = array('toId', $user_guid, 'readYet', 0, 'msg', 1); + $map = array(); + foreach ($strings as $string) { + $id = get_metastring_id($string); + $map[$string] = $id; + } $options = array( - 'metadata_name_value_pairs' => array( - 'toId' => elgg_get_logged_in_user_guid(), - 'readYet' => 0, - 'msg' => 1 +// 'metadata_name_value_pairs' => array( +// 'toId' => elgg_get_logged_in_user_guid(), +// 'readYet' => 0, +// 'msg' => 1 +// ), + 'joins' => array( + "JOIN {$db_prefix}metadata msg_toId on e.guid = msg_toId.entity_guid", + "JOIN {$db_prefix}metadata msg_readYet on e.guid = msg_readYet.entity_guid", + "JOIN {$db_prefix}metadata msg_msg on e.guid = msg_msg.entity_guid", + ), + 'wheres' => array( + "msg_toId.name_id='{$map['toId']}' AND msg_toId.value_id='{$map[$user_guid]}'", + "msg_readYet.name_id='{$map['readYet']}' AND msg_readYet.value_id='{$map[0]}'", + "msg_msg.name_id='{$map['msg']}' AND msg_msg.value_id='{$map[1]}'", ), - 'owner_guid' => elgg_get_logged_in_user_guid() + 'owner_guid' => $user_guid, + 'limit' => 0 ); + $num_messages = elgg_get_entities_from_metadata($options); if (is_array($num_messages)) { |