From 0df5b37ab74579ec39bb9c7442584e8144129724 Mon Sep 17 00:00:00 2001 From: Dries Buytaert <dries@buytaert.net> Date: Tue, 29 Jun 2010 18:46:12 +0000 Subject: [PATCH] - Patch #729186 by catch: _field_info_collate_fields() resource usage. --- modules/field/field.info.inc | 74 +++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 35 deletions(-) diff --git a/modules/field/field.info.inc b/modules/field/field.info.inc index ac109248b5dc..cb430884020d 100644 --- a/modules/field/field.info.inc +++ b/modules/field/field.info.inc @@ -186,47 +186,46 @@ function _field_info_collate_fields($reset = FALSE) { if (!isset($info)) { if ($cached = cache_get('field_info_fields', 'cache_field')) { - $definitions = $cached->data; + $info = $cached->data; } else { $definitions = array( 'field_ids' => field_read_fields(array(), array('include_deleted' => 1)), 'instances' => field_read_instances(), ); - cache_set('field_info_fields', $definitions, 'cache_field'); - } - // Populate 'field_ids' with all fields. - $info['field_ids'] = array(); - foreach ($definitions['field_ids'] as $key => $field) { - $info['field_ids'][$key] = $definitions['field_ids'][$key] = _field_info_prepare_field($field); - } + // Populate 'fields' with all fields, keyed by ID. + $info['fields'] = array(); + foreach ($definitions['field_ids'] as $key => $field) { + $info['fields'][$key] = $definitions['field_ids'][$key] = _field_info_prepare_field($field); + } - // Populate 'fields' only with non-deleted fields. - $info['fields'] = array(); - foreach ($info['field_ids'] as $field) { - if (!$field['deleted']) { - $info['fields'][$field['field_name']] = $field; + // Build an array of field IDs for non-deleted fields, keyed by name. + $info['field_ids'] = array(); + foreach ($info['fields'] as $key => $field) { + if (!$field['deleted']) { + $info['field_ids'][$field['field_name']] = $key; + } } - } - // Populate 'instances'. Only non-deleted instances are considered. - $info['instances'] = array(); - foreach (field_info_bundles() as $entity_type => $bundles) { - foreach ($bundles as $bundle => $bundle_info) { - $info['instances'][$entity_type][$bundle] = array(); + // Populate 'instances'. Only non-deleted instances are considered. + $info['instances'] = array(); + foreach (field_info_bundles() as $entity_type => $bundles) { + foreach ($bundles as $bundle => $bundle_info) { + $info['instances'][$entity_type][$bundle] = array(); + } } - } - foreach ($definitions['instances'] as $instance) { - $field = $info['fields'][$instance['field_name']]; - $instance = _field_info_prepare_instance($instance, $field); - $info['instances'][$instance['entity_type']][$instance['bundle']][$instance['field_name']] = $instance; - // Enrich field definitions with the list of bundles where they have - // instances. NOTE: Deleted fields in $info['field_ids'] are not - // enriched because all of their instances are deleted, too, and - // are thus not in $definitions['instances']. - $info['fields'][$instance['field_name']]['bundles'][$instance['entity_type']][] = $instance['bundle']; - $info['field_ids'][$instance['field_id']]['bundles'][$instance['entity_type']][] = $instance['bundle']; + foreach ($definitions['instances'] as $instance) { + $field = $info['fields'][$instance['field_id']]; + $instance = _field_info_prepare_instance($instance, $field); + $info['instances'][$instance['entity_type']][$instance['bundle']][$instance['field_name']] = $instance; + // Enrich field definitions with the list of bundles where they have + // instances. NOTE: Deleted fields in $info['field_ids'] are not + // enriched because all of their instances are deleted, too, and + // are thus not in $definitions['instances']. + $info['fields'][$instance['field_id']]['bundles'][$instance['entity_type']][] = $instance['bundle']; + } + cache_set('field_info_fields', $info, 'cache_field'); } } @@ -525,7 +524,12 @@ function field_info_bundles($entity_type = NULL) { */ function field_info_fields() { $info = _field_info_collate_fields(); - return $info['fields']; + foreach ($info['fields'] as $key => $field) { + if (!$field['deleted']) { + $fields[$field['field_name']] = $field; + } + } + return $fields; } /** @@ -544,8 +548,8 @@ function field_info_fields() { */ function field_info_field($field_name) { $info = _field_info_collate_fields(); - if (isset($info['fields'][$field_name])) { - return $info['fields'][$field_name]; + if (isset($info['field_ids'][$field_name])) { + return $info['fields'][$info['field_ids'][$field_name]]; } } @@ -565,8 +569,8 @@ function field_info_field($field_name) { */ function field_info_field_by_id($field_id) { $info = _field_info_collate_fields(); - if (isset($info['field_ids'][$field_id])) { - return $info['field_ids'][$field_id]; + if (isset($info['fields'][$field_id])) { + return $info['fields'][$field_id]; } } -- GitLab