Elgg\Cache\MetadataCache::filterMetadataHeavyEntities PHP Method

filterMetadataHeavyEntities() public method

Filter out entities whose concatenated metadata values (INTs casted as string) exceed a threshold in characters. This could be used to avoid overpopulating the cache if RAM usage becomes an issue.
public filterMetadataHeavyEntities ( array $guids, integer $limit = 1024000 ) : array
$guids array GUIDs of entities to examine
$limit integer Limit in characters of all metadata (with ints casted to strings)
return array
    public function filterMetadataHeavyEntities(array $guids, $limit = 1024000)
    {
        $db_prefix = _elgg_services()->config->get('dbprefix');
        $options = array('guids' => $guids, 'limit' => 0, 'callback' => false, 'selects' => array('SUM(LENGTH(n_table.value)) AS bytes'), 'order_by' => 'n_table.entity_guid, n_table.time_created ASC', 'group_by' => 'n_table.entity_guid');
        $data = _elgg_services()->metadataTable->getAll($options);
        // don't cache if metadata for entity is over 10MB (or rolled INT)
        foreach ($data as $row) {
            if ($row->bytes > $limit || $row->bytes < 0) {
                array_splice($guids, array_search($row->entity_guid, $guids), 1);
            }
        }
        return $guids;
    }

Usage Example

 public function testFilterHeavyEntities()
 {
     $big_str = str_repeat('-', 5000);
     $this->obj2->setMetadata($this->name, array($big_str, $big_str));
     $guids = array($this->guid1, $this->guid2);
     $expected = array($this->guid1);
     $actual = $this->cache->filterMetadataHeavyEntities($guids, 6000);
     $this->assertIdentical($actual, $expected);
 }