12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- <?php
- namespace Elgg;
- /**
- * Preload entities based on properties of fetched objects
- *
- * @access private
- *
- * @package Elgg.Core
- */
- class EntityPreloader {
- /**
- * Preload entities based on the given objects
- *
- * @param object[] $objects Objects--e.g. loaded from an Elgg query--from which we can
- * pluck GUIDs to preload
- * @param string[] $guid_properties e.g. array("owner_guid")
- *
- * @return void
- */
- public function preload($objects, array $guid_properties) {
- $guids = $this->getGuidsToLoad($objects, $guid_properties);
- // If only 1 to load, not worth the overhead of elgg_get_entities(),
- // get_entity() will handle it later.
- if (count($guids) > 1) {
- call_user_func($this->_callable_entity_loader, array(
- 'guids' => $guids,
- ));
- }
- }
- /**
- * Get GUIDs that need to be loaded
- *
- * To simplify the user API, this function accepts non-arrays and arrays containing non-objects
- *
- * @param object[] $objects Objects from which to pluck GUIDs
- * @param string[] $guid_properties e.g. array("owner_guid")
- * @return int[]
- */
- protected function getGuidsToLoad($objects, array $guid_properties) {
- if (!is_array($objects) || count($objects) < 2) {
- return array();
- }
- $preload_guids = array();
- foreach ($objects as $object) {
- if (is_object($object)) {
- foreach ($guid_properties as $property) {
- if (empty($object->{$property})) {
- continue;
- }
- $guid = $object->{$property};
- if ($guid && !call_user_func($this->_callable_cache_checker, $guid)) {
- $preload_guids[] = $guid;
- }
- }
- }
- }
- return array_unique($preload_guids);
- }
- /**
- * DO NOT USE. For unit test mocking
- * @access private
- */
- public $_callable_cache_checker = '_elgg_retrieve_cached_entity';
- /**
- * DO NOT USE. For unit test mocking
- * @access private
- */
- public $_callable_entity_loader = 'elgg_get_entities';
- }
|