diff options
Diffstat (limited to 'engine')
| -rw-r--r-- | engine/lib/annotations.php | 13 | ||||
| -rw-r--r-- | engine/lib/elgglib.php | 3 | ||||
| -rw-r--r-- | engine/lib/metastrings.php | 35 | ||||
| -rw-r--r-- | engine/tests/api/metastrings.php | 2 | 
4 files changed, 34 insertions, 19 deletions
diff --git a/engine/lib/annotations.php b/engine/lib/annotations.php index 7a4e62921..ca8f6b2e1 100644 --- a/engine/lib/annotations.php +++ b/engine/lib/annotations.php @@ -404,6 +404,7 @@ function elgg_list_entities_from_annotations($options = array()) {   * @return mixed   */  function elgg_get_entities_from_annotation_calculation($options) { +	$db_prefix = elgg_get_config('dbprefix');  	$defaults = array(  		'calculation' => 'sum',  		'order_by' => 'calculation desc' @@ -415,14 +416,14 @@ function elgg_get_entities_from_annotation_calculation($options) {  	// you must cast this as an int or it sorts wrong.  	$options['selects'][] = 'e.*'; -	$options['selects'][] = "$function(cast(v.string as signed)) as calculation"; +//	$options['selects'][] = 'a_msv as value'; +	$options['selects'][] = "$function(cast(a_msv.string as signed)) as calculation"; -	// need our own join to get the values. -//	$options['joins'][] = "JOIN {$db_prefix}metastrings msv ON a.value_id = msv.id"; -//	$options['joins'][] = "JOIN {$db_prefix}entities ae ON a.entity_guid = ae.guid"; +	// need our own join to get the values because the lower level functions don't +	// add all the joins if it's a different callback. +	$options['joins'][] = "JOIN {$db_prefix}metastrings a_msv ON n_table.value_id = a_msv.id"; -	$options['wheres'][] = get_access_sql_suffix('n_table'); -//	$options['wheres'][] = "e.guid = a.entity_guid"; +	// don't need access control because it's taken care of by elgg_get_annotations.  	$options['group_by'] = 'n_table.entity_guid';  	$options['callback'] = 'entity_row_to_elggstar'; diff --git a/engine/lib/elgglib.php b/engine/lib/elgglib.php index 6c94133df..e9172d184 100644 --- a/engine/lib/elgglib.php +++ b/engine/lib/elgglib.php @@ -1623,8 +1623,9 @@ function is_not_null($string) {   * names by singular names.   *   * @param array $options   The options array. $options['keys'] = 'values'; - * @param array $singulars A list of sinular words to pluralize by adding 's'. + * @param array $singulars A list of singular words to pluralize by adding 's'.   * + * @access private   * @return array   * @since 1.7.0   */ diff --git a/engine/lib/metastrings.php b/engine/lib/metastrings.php index 655617ac6..4dda05e6b 100644 --- a/engine/lib/metastrings.php +++ b/engine/lib/metastrings.php @@ -373,11 +373,24 @@ function elgg_get_metastring_based_objects($options) {  	}  	$joins = $options['joins']; -  	$joins[] = "JOIN {$db_prefix}entities e ON n_table.entity_guid = e.guid"; -	$joins[] = "JOIN {$db_prefix}metastrings n on n_table.name_id = n.id"; -	$joins[] = "JOIN {$db_prefix}metastrings v on n_table.value_id = v.id"; +	if (!is_array($options['selects'])) { +		$options['selects'] = array($options['selects']); +	} + +	$selects = $options['selects']; + +	// For performance reasons we don't want the joins required for metadata / annotations +	// unless we're going through one of their callbacks. +	// this means we expect the functions passing different callbacks to pass their required joins. +	if ($options['callback'] == 'row_to_elggmetadata' || $options['callback'] == 'row_to_elggannotation') { +		$joins[] = "JOIN {$db_prefix}metastrings n on n_table.name_id = n.id"; +		$joins[] = "JOIN {$db_prefix}metastrings v on n_table.value_id = v.id"; + +		$selects[] = 'n.string as name'; +		$selects[] = 'v.string as value'; +	}  	// remove identical join clauses  	$joins = array_unique($joins); @@ -406,19 +419,19 @@ function elgg_get_metastring_based_objects($options) {  	}  	if ($options['metastring_calculation'] === ELGG_ENTITIES_NO_VALUE) { +		$selects = array_unique($selects);  		// evalutate selects -		if ($options['selects']) { -			$selects = ''; -			foreach ($options['selects'] as $select) { -				$selects .= ", $select"; +		$select_str = ''; +		if ($selects) { +			foreach ($selects as $select) { +				$select_str .= ", $select";  			} -		} else { -			$selects = '';  		} -		$query = "SELECT DISTINCT n_table.*, n.string as name, -			v.string as value{$selects} FROM {$db_prefix}$type n_table"; +		$query = "SELECT DISTINCT n_table.*{$select_str} FROM {$db_prefix}$type n_table";  	} else { +		// @todo this will break if you're counting on an annotation calculation because of the joins +		// that's a dumb thing to do anyway, but it shouldn't make bad queries  		$query = "SELECT {$options['metastring_calculation']}(v.string) as calculation FROM {$db_prefix}$type n_table";  	} diff --git a/engine/tests/api/metastrings.php b/engine/tests/api/metastrings.php index e5cfe80e1..9b5d7ee4e 100644 --- a/engine/tests/api/metastrings.php +++ b/engine/tests/api/metastrings.php @@ -164,7 +164,7 @@ class ElggCoreMetastringsTest extends ElggCoreUnitTest {  			}  			$options = array(); -			$this->assertFalse(elgg_is_valid_options_for_batch_operation($options), $type); +			$this->assertFalse(elgg_is_valid_options_for_batch_operation($options, $type));  			foreach ($required as $key) {  				$options = array();  | 
