aboutsummaryrefslogtreecommitdiff
path: root/engine
diff options
context:
space:
mode:
Diffstat (limited to 'engine')
-rw-r--r--engine/lib/annotations.php13
-rw-r--r--engine/lib/elgglib.php3
-rw-r--r--engine/lib/metastrings.php35
-rw-r--r--engine/tests/api/metastrings.php2
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();