From 63cc3777af6922ab5de1f6f96bcc6ebe08e7caf2 Mon Sep 17 00:00:00 2001 From: Steve Clay Date: Wed, 21 Nov 2012 22:25:18 -0500 Subject: Fixes #4926: prefetches entities to be displayed in river --- engine/lib/river.php | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) (limited to 'engine') diff --git a/engine/lib/river.php b/engine/lib/river.php index b717a7756..7bc3af9de 100644 --- a/engine/lib/river.php +++ b/engine/lib/river.php @@ -361,6 +361,7 @@ function elgg_get_river(array $options = array()) { } $river_items = get_data($query, 'elgg_row_to_elgg_river_item'); + _elgg_prefetch_river_entities($river_items); return $river_items; } else { @@ -369,12 +370,46 @@ function elgg_get_river(array $options = array()) { } } +/** + * Prefetch entities that will be displayed in the river. + * + * @param ElggRiverItem[] $river_items + * @access private + */ +function _elgg_prefetch_river_entities(array $river_items) { + // prefetch objects and subjects + $guids = array(); + foreach ($river_items as $item) { + $guids[$item->object_guid] = true; + $guids[$item->subject_guid] = true; + if (count($guids) > 100) { + break; + } + } + // return value unneeded, just priming cache + elgg_get_entities(array('guids' => array_keys($guids))); + + // prefetch object containers + $guids = array(); + foreach ($river_items as $item) { + $object = $item->getObjectEntity(); + if ($object) { + $guids[$object->container_guid] = true; + } + if (count($guids) > 100) { + break; + } + } + // return value unneeded, just priming cache + elgg_get_entities(array('guids' => array_keys($guids))); +} + /** * List river items * * @param array $options Any options from elgg_get_river() plus: * pagination => BOOL Display pagination links (true) - + * * @return string * @since 1.8.0 */ -- cgit v1.2.3 From 646c0c13b75efb55940245e27ad5c281a8eadd67 Mon Sep 17 00:00:00 2001 From: Steve Clay Date: Sun, 25 Nov 2012 16:49:34 -0500 Subject: check entity cache first, and remove limit (from Paweł Sroka's branch) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- engine/lib/river.php | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) (limited to 'engine') diff --git a/engine/lib/river.php b/engine/lib/river.php index 7bc3af9de..133ef6de9 100644 --- a/engine/lib/river.php +++ b/engine/lib/river.php @@ -380,28 +380,35 @@ function _elgg_prefetch_river_entities(array $river_items) { // prefetch objects and subjects $guids = array(); foreach ($river_items as $item) { - $guids[$item->object_guid] = true; - $guids[$item->subject_guid] = true; - if (count($guids) > 100) { - break; + if ($item->subject_guid && !retrieve_cached_entity($item->subject_guid)) { + $guids[$item->subject_guid] = true; + } + if ($item->object_guid && !retrieve_cached_entity($item->object_guid)) { + $guids[$item->object_guid] = true; } } + // avoid creating oversized query + // @todo how to better handle this? + $guids = array_slice($guids, 0, 300, true); // return value unneeded, just priming cache - elgg_get_entities(array('guids' => array_keys($guids))); + elgg_get_entities(array( + 'guids' => array_keys($guids), + 'limit' => 0, + )); // prefetch object containers $guids = array(); foreach ($river_items as $item) { $object = $item->getObjectEntity(); - if ($object) { + if ($object->container_guid && !retrieve_cached_entity($object->container_guid)) { $guids[$object->container_guid] = true; } - if (count($guids) > 100) { - break; - } } - // return value unneeded, just priming cache - elgg_get_entities(array('guids' => array_keys($guids))); + $guids = array_slice($guids, 0, 300, true); + elgg_get_entities(array( + 'guids' => array_keys($guids), + 'limit' => 0, + )); } /** -- cgit v1.2.3 From 3a3027ac4bf011873a8b08d56c19fa1379cd0a07 Mon Sep 17 00:00:00 2001 From: Steve Clay Date: Mon, 26 Nov 2012 01:32:46 -0500 Subject: river prefetch: Don't call elgg_get_entities if no GUIDs to fetch --- engine/lib/river.php | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) (limited to 'engine') diff --git a/engine/lib/river.php b/engine/lib/river.php index 133ef6de9..33f34360e 100644 --- a/engine/lib/river.php +++ b/engine/lib/river.php @@ -387,14 +387,16 @@ function _elgg_prefetch_river_entities(array $river_items) { $guids[$item->object_guid] = true; } } - // avoid creating oversized query - // @todo how to better handle this? - $guids = array_slice($guids, 0, 300, true); - // return value unneeded, just priming cache - elgg_get_entities(array( - 'guids' => array_keys($guids), - 'limit' => 0, - )); + if ($guids) { + // avoid creating oversized query + // @todo how to better handle this? + $guids = array_slice($guids, 0, 300, true); + // return value unneeded, just priming cache + elgg_get_entities(array( + 'guids' => array_keys($guids), + 'limit' => 0, + )); + } // prefetch object containers $guids = array(); @@ -404,11 +406,13 @@ function _elgg_prefetch_river_entities(array $river_items) { $guids[$object->container_guid] = true; } } - $guids = array_slice($guids, 0, 300, true); - elgg_get_entities(array( - 'guids' => array_keys($guids), - 'limit' => 0, - )); + if ($guids) { + $guids = array_slice($guids, 0, 300, true); + elgg_get_entities(array( + 'guids' => array_keys($guids), + 'limit' => 0, + )); + } } /** -- cgit v1.2.3