]> gitweb.fluxo.info Git - lorea/elgg.git/commitdiff
Refs #1543: Added support to have pass an array as a value in the metadata_name_value...
authorbrettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
Tue, 23 Feb 2010 23:58:36 +0000 (23:58 +0000)
committerbrettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544>
Tue, 23 Feb 2010 23:58:36 +0000 (23:58 +0000)
Added unit tests for elgg_get_entities_from_metadata().
Cleaned up some documentation for elgg_get_entities_from_metadata().

git-svn-id: http://code.elgg.org/elgg/trunk@3969 36083f99-b078-4883-b0ff-0f9b5a30f544

engine/lib/metadata.php
engine/tests/api/entity_getter_functions.php

index 71b6c2634445870be2369c34962163b50cc58de1..67a135d75bfb8269c58dab0c83512d05d2d1a4dc 100644 (file)
@@ -539,6 +539,13 @@ function find_metadata($meta_name = "", $meta_value = "", $entity_type = "", $en
  * options available to elgg_get_entities().  Supports
  * the singular option shortcut.
  *
+ * NB: Using metadata_names and metadata_values results in a
+ * "names IN (...) AND values IN (...)" clause.  This is subtly
+ * differently than default multiple metadata_name_value_pairs, which use
+ * "(name = value) AND (name = value)" clauses.
+ *
+ * When in doubt, use name_value_pairs.
+ *
  * @see elgg_get_entities
  * @param array $options Array in format:
  *
@@ -546,7 +553,8 @@ function find_metadata($meta_name = "", $meta_value = "", $entity_type = "", $en
  *
  *     metadata_values => NULL|ARR metadata values
  *
- *     metadata_name_value_pairs => NULL|ARR (name = 'name', value => 'value', 'operand' => '=', 'case_sensitive' => TRUE) entries
+ *     metadata_name_value_pairs => NULL|ARR (name = 'name', value => 'value', 'operand' => '=', 'case_sensitive' => TRUE) entries.
+ *     Currently if multiple values are sent via an array (value => array('value1', 'value2') the pair's operand will be forced to "IN".
  *
  *     metadata_name_value_pairs_operator => NULL|STR The operator to use for combining (name = value) OPERATOR (name = value); default AND
  *
@@ -739,9 +747,28 @@ function elgg_get_entity_metadata_where_sql($table, $names = NULL, $values = NUL
 
                        // if the value is an int, don't quote it because str '15' < str '5'
                        // if the operand is IN don't quote it because quoting should be done already.
-                       //$value = trim(strtolower($operand)) == 'in' ? $pair['value'] : "'{$pair['value']}'";
-                       if (trim(strtolower($operand)) == 'in' || is_numeric($pair['value'])) {
+                       if (is_numeric($pair['value'])) {
                                $value = sanitise_string($pair['value']);
+                       } else if (is_array($pair['value'])) {
+                               $values_array = array();
+
+                               foreach ($pair['value'] as $pair_value) {
+                                       if (is_numeric($v)) {
+                                               $values_array[] = sanitise_string($pair_value);
+                                       } else {
+                                               $values_array[] = '\'' . sanitise_string($pair_value) . '\'';
+                                       }
+                               }
+
+                               if ($values_array) {
+                                       $value = '(' . implode(', ', $values_array) . ')';
+                               }
+
+                               // @todo allow support for non IN operands with array of values.
+                               // will have to do more silly joins.
+                               $operand = 'IN';
+                       } else if (trim(strtolower($operand)) == 'in') {
+                               $value = "({$pair['value']})";
                        } else {
                                $value = '\'' . sanitise_string($pair['value']) . '\'';
                        }
@@ -854,14 +881,14 @@ function list_entities_from_metadata($meta_name, $meta_value = "", $entity_type
        $offset = (int) get_input('offset');
        $limit = (int) $limit;
        $options = array(
-               'metadata_name' => $meta_name, 
-               'metadata_value' => $meta_value, 
-               'types' => $entity_type, 
-               'subtypes' => $entity_subtype, 
-               'owner_guid' => $owner_guid, 
-               'limit' => $limit, 
-               'offset' => $offset, 
-               'count' => TRUE, 
+               'metadata_name' => $meta_name,
+               'metadata_value' => $meta_value,
+               'types' => $entity_type,
+               'subtypes' => $entity_subtype,
+               'owner_guid' => $owner_guid,
+               'limit' => $limit,
+               'offset' => $offset,
+               'count' => TRUE,
                'case_sensitive' => $case_sensitive
        );
        $count = elgg_get_entities_from_metadata($options);
index aa7442d4b6799f18f8b1827ba0adc9cd959e552e..04fa3e4e5f08e64783e5fb2775aeb341b1364e41 100644 (file)
@@ -27,10 +27,11 @@ class ElggCoreEntityGetterFunctionsTest extends ElggCoreUnitTest {
                // create some fun objects to play with.
                // 5 with random subtypes
                for ($i=0; $i<5; $i++) {
-                       $subtype = "test_object_subtype_" . rand();
+                       $subtype = 'test_object_subtype_' . rand();
                        $e = new ElggObject();
                        $e->subtype = $subtype;
                        $e->save();
+
                        $this->entities[] = $e;
                        $this->subtypes['object'][] = $subtype;
                }
@@ -42,6 +43,7 @@ class ElggCoreEntityGetterFunctionsTest extends ElggCoreUnitTest {
                        $e->username = "test_user_" . rand();
                        $e->subtype = $subtype;
                        $e->save();
+
                        $this->entities[] = $e;
                        $this->subtypes['user'][] = $subtype;
                }
@@ -52,6 +54,7 @@ class ElggCoreEntityGetterFunctionsTest extends ElggCoreUnitTest {
                        $e = new ElggGroup();
                        $e->subtype = $subtype;
                        $e->save();
+
                        $this->entities[] = $e;
                        $this->subtypes['group'][] = $subtype;
                }
@@ -929,4 +932,682 @@ class ElggCoreEntityGetterFunctionsTest extends ElggCoreUnitTest {
                $q = "DELETE FROM {$CONFIG->dbprefix}entity_subtypes WHERE subtype = '$subtype'";
                delete_data($q);
        }
+
+
+
+       /************
+        * METADATA
+        ************/
+
+       //names
+
+       function testElggApiGettersEntityMetadataNameValidSingle() {
+               // create a new entity with a subtype we know
+               // use an existing type so it will clean up automatically
+               $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+               $subtype = $subtypes[0];
+               $md_name = 'test_metadata_name_' . rand();
+               $md_value = 'test_metadata_value_' . rand();
+
+               $e = new ElggObject();
+               $e->subtype = $subtype;
+               $e->$md_name = $md_value;
+               $e->save();
+
+               $options = array(
+                       'type' => 'object',
+                       'subtype' => $subtype,
+                       'metadata_name' => $md_name
+               );
+
+               $entities = elgg_get_entities_from_metadata($options);
+
+               $this->assertIsa($entities, 'array');
+               $this->assertEqual(count($entities), 1);
+
+               foreach ($entities as $entity) {
+                       $this->assertEqual($entity->getGUID(), $e->getGUID());
+                       $this->assertEqual($entity->$md_name, $md_value);
+               }
+
+               $e->delete();
+       }
+
+       function testElggApiGettersEntityMetadataNameValidMultiple() {
+               $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+               $subtype = $subtypes[0];
+               $md_names = array();
+
+               $md_name = 'test_metadata_name_' . rand();
+               $md_value = 'test_metadata_value_' . rand();
+               $md_names[] = $md_name;
+               $e_guids = array();
+
+               $e = new ElggObject();
+               $e->subtype = $subtype;
+               $e->$md_name = $md_value;
+               $e->save();
+               $e_guids[] = $e->getGUID();
+
+               $md_name = 'test_metadata_name_' . rand();
+               $md_value = 'test_metadata_value_' . rand();
+               $md_names[] = $md_name;
+
+               $e = new ElggObject();
+               $e->subtype = $subtype;
+               $e->$md_name = $md_value;
+               $e->save();
+               $e_guids[] = $e->getGUID();
+
+               $options = array(
+                       'type' => 'object',
+                       'subtype' => $subtype,
+                       'metadata_names' => $md_names
+               );
+
+               $entities = elgg_get_entities_from_metadata($options);
+
+               $this->assertIsa($entities, 'array');
+               $this->assertEqual(count($entities), 2);
+
+               foreach ($entities as $entity) {
+                       $this->assertTrue(in_array($entity->getGUID(), $e_guids));
+                       $entity->delete();
+               }
+       }
+
+       function testElggApiGettersEntityMetadataNameInvalidSingle() {
+               $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+               $subtype = $subtypes[0];
+               $md_name = 'test_metadata_name_' . rand();
+               $md_value = 'test_metadata_value_' . rand();
+
+               $e = new ElggObject();
+               $e->subtype = $subtype;
+               $e->$md_name = $md_value;
+               $e->save();
+
+               $md_invalid_name = 'test_metadata_name_' . rand();
+
+               $options = array(
+                       'type' => 'object',
+                       'subtype' => $subtype,
+                       'metadata_name' => $md_invalid_name
+               );
+
+               $entities = elgg_get_entities_from_metadata($options);
+
+               $this->assertFalse($entities);
+
+               $e->delete();
+       }
+
+       function testElggApiGettersEntityMetadataNameInvalidMultiple() {
+               $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+               $subtype = $subtypes[0];
+               $md_name = 'test_metadata_name_' . rand();
+               $md_value = 'test_metadata_value_' . rand();
+
+               $e = new ElggObject();
+               $e->subtype = $subtype;
+               $e->$md_name = $md_value;
+               $e->save();
+
+               $md_invalid_names = array();
+               $md_invalid_names[] = 'test_metadata_name_' . rand();
+               $md_invalid_names[] = 'test_metadata_name_' . rand();
+
+               $options = array(
+                       'type' => 'object',
+                       'subtype' => $subtype,
+                       'metadata_names' => $md_invalid_names
+               );
+
+               $entities = elgg_get_entities_from_metadata($options);
+
+               $this->assertFalse($entities);
+
+               $e->delete();
+       }
+
+
+       function testElggApiGettersEntityMetadataNameMixedMultiple() {
+               $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+               $subtype = $subtypes[0];
+               $md_names = array();
+
+               $md_name = 'test_metadata_name_' . rand();
+               $md_value = 'test_metadata_value_' . rand();
+               $md_names[] = $md_name;
+               $e_guids = array();
+
+               $valid = new ElggObject();
+               $valid->subtype = $subtype;
+               $valid->$md_name = $md_value;
+               $valid->save();
+               $e_guids[] = $valid->getGUID();
+
+               $md_name = 'test_metadata_name_' . rand();
+               $md_value = 'test_metadata_value_' . rand();
+
+               // add a random invalid name.
+               $md_names[] = 'test_metadata_name_' . rand();
+
+               $e = new ElggObject();
+               $e->subtype = $subtype;
+               $e->$md_name = $md_value;
+               $e->save();
+               $e_guids[] = $e->getGUID();
+
+               $options = array(
+                       'type' => 'object',
+                       'subtype' => $subtype,
+                       'metadata_names' => $md_names
+               );
+
+               $entities = elgg_get_entities_from_metadata($options);
+
+               $this->assertIsa($entities, 'array');
+               $this->assertEqual(count($entities), 1);
+
+               foreach ($entities as $entity) {
+                       $this->assertEqual($entity->getGUID(), $valid->getGUID());
+               }
+
+               foreach ($e_guids as $guid) {
+                       if ($e = get_entity($guid)) {
+                               $e->delete();
+                       }
+               }
+       }
+
+
+       // values
+       function testElggApiGettersEntityMetadataValueValidSingle() {
+               // create a new entity with a subtype we know
+               // use an existing type so it will clean up automatically
+               $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+               $subtype = $subtypes[0];
+               $md_name = 'test_metadata_name_' . rand();
+               $md_value = 'test_metadata_value_' . rand();
+
+               $e = new ElggObject();
+               $e->subtype = $subtype;
+               $e->$md_name = $md_value;
+               $e->save();
+
+               $options = array(
+                       'type' => 'object',
+                       'subtype' => $subtype,
+                       'metadata_value' => $md_value
+               );
+
+               $entities = elgg_get_entities_from_metadata($options);
+
+               $this->assertIsa($entities, 'array');
+               $this->assertEqual(count($entities), 1);
+
+               foreach ($entities as $entity) {
+                       $this->assertEqual($entity->getGUID(), $e->getGUID());
+                       $this->assertEqual($entity->$md_name, $md_value);
+               }
+
+               $e->delete();
+       }
+
+       function testElggApiGettersEntityMetadataValueValidMultiple() {
+               $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+               $subtype = $subtypes[0];
+               $md_values = array();
+
+               $md_name = 'test_metadata_name_' . rand();
+               $md_value = 'test_metadata_value_' . rand();
+               $md_values[] = $md_value;
+               $e_guids = array();
+
+               $e = new ElggObject();
+               $e->subtype = $subtype;
+               $e->$md_name = $md_value;
+               $e->save();
+               $e_guids[] = $e->getGUID();
+
+               $md_name = 'test_metadata_name_' . rand();
+               $md_value = 'test_metadata_value_' . rand();
+               $md_values[] = $md_value;
+
+               $e = new ElggObject();
+               $e->subtype = $subtype;
+               $e->$md_name = $md_value;
+               $e->save();
+               $e_guids[] = $e->getGUID();
+
+               $options = array(
+                       'type' => 'object',
+                       'subtype' => $subtype,
+                       'metadata_values' => $md_values
+               );
+
+               $entities = elgg_get_entities_from_metadata($options);
+
+               $this->assertIsa($entities, 'array');
+               $this->assertEqual(count($entities), 2);
+
+               foreach ($entities as $entity) {
+                       $this->assertTrue(in_array($entity->getGUID(), $e_guids));
+                       $entity->delete();
+               }
+       }
+
+       function testElggApiGettersEntityMetadatavalueInvalidSingle() {
+               $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+               $subtype = $subtypes[0];
+               $md_name = 'test_metadata_name_' . rand();
+               $md_value = 'test_metadata_value_' . rand();
+
+               $e = new ElggObject();
+               $e->subtype = $subtype;
+               $e->$md_name = $md_value;
+               $e->save();
+
+               $md_invalid_value = 'test_metadata_value_' . rand();
+
+               $options = array(
+                       'type' => 'object',
+                       'subtype' => $subtype,
+                       'metadata_value' => $md_invalid_value
+               );
+
+               $entities = elgg_get_entities_from_metadata($options);
+
+               $this->assertFalse($entities);
+
+               $e->delete();
+       }
+
+       function testElggApiGettersEntityMetadataValueInvalidMultiple() {
+               $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+               $subtype = $subtypes[0];
+               $md_name = 'test_metadata_name_' . rand();
+               $md_value = 'test_metadata_value_' . rand();
+
+               $e = new ElggObject();
+               $e->subtype = $subtype;
+               $e->$md_name = $md_value;
+               $e->save();
+
+               $md_invalid_values = array();
+               $md_invalid_values[] = 'test_metadata_value_' . rand();
+               $md_invalid_values[] = 'test_metadata_value_' . rand();
+
+               $options = array(
+                       'type' => 'object',
+                       'subtype' => $subtype,
+                       'metadata_values' => $md_invalid_values
+               );
+
+               $entities = elgg_get_entities_from_metadata($options);
+
+               $this->assertFalse($entities);
+
+               $e->delete();
+       }
+
+
+       function testElggApiGettersEntityMetadataValueMixedMultiple() {
+               $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+               $subtype = $subtypes[0];
+               $md_values = array();
+
+               $md_name = 'test_metadata_name_' . rand();
+               $md_value = 'test_metadata_value_' . rand();
+               $md_values[] = $md_value;
+               $e_guids = array();
+
+               $valid = new ElggObject();
+               $valid->subtype = $subtype;
+               $valid->$md_name = $md_value;
+               $valid->save();
+               $e_guids[] = $valid->getGUID();
+
+               $md_name = 'test_metadata_name_' . rand();
+               $md_value = 'test_metadata_value_' . rand();
+
+               // add a random invalid value.
+               $md_values[] = 'test_metadata_value_' . rand();
+
+               $e = new ElggObject();
+               $e->subtype = $subtype;
+               $e->$md_name = $md_value;
+               $e->save();
+               $e_guids[] = $e->getGUID();
+
+               $options = array(
+                       'type' => 'object',
+                       'subtype' => $subtype,
+                       'metadata_values' => $md_values
+               );
+
+               $entities = elgg_get_entities_from_metadata($options);
+
+               $this->assertIsa($entities, 'array');
+               $this->assertEqual(count($entities), 1);
+
+               foreach ($entities as $entity) {
+                       $this->assertEqual($entity->getGUID(), $valid->getGUID());
+               }
+
+               foreach ($e_guids as $guid) {
+                       if ($e = get_entity($guid)) {
+                               $e->delete();
+                       }
+               }
+       }
+
+
+       // name_value_pairs
+
+
+       function testElggApiGettersEntityMetadataNVPValidNValidVEquals() {
+               $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+               $subtype = $subtypes[0];
+               $md_name = 'test_metadata_name_' . rand();
+               $md_value = 'test_metadata_value_' . rand();
+               $guids = array();
+
+               // our target
+               $valid = new ElggObject();
+               $valid->subtype = $subtype;
+               $valid->$md_name = $md_value;
+               $valid->save();
+               $guids[] = $valid->getGUID();
+
+               // make some bad ones
+               $invalid_md_name = 'test_metadata_name_' . rand();
+               $e = new ElggObject();
+               $e->subtype = $subtype;
+               $e->$md_name = $invalid_md_value;
+               $e->save();
+               $guids[] = $e->getGUID();
+
+               $invalid_md_value = 'test_metadata_value_' . rand();
+               $e = new ElggObject();
+               $e->subtype = $subtype;
+               $e->$md_name = $invalid_md_value;
+               $e->save();
+               $guids[] = $e->getGUID();
+
+               $md_invalid_names = array();
+
+               $options = array(
+                       'type' => 'object',
+                       'subtype' => $subtype,
+                       'metadata_name_value_pairs' => array(array(
+                               'name' => $md_name,
+                               'value' => $md_value
+                       ))
+               );
+
+               $entities = elgg_get_entities_from_metadata($options);
+
+               $this->assertIsa($entities, 'array');
+               $this->assertEqual(count($entities), 1);
+
+               foreach ($entities as $entity) {
+                       $this->assertEqual($entity->getGUID(), $valid->getGUID());
+                       $this->assertEqual($entity->$md_name, $md_value);
+                       $entity->delete();
+               }
+
+               foreach ($guids as $guid) {
+                       if ($e = get_entity($guid)) {
+                               $e->delete();
+                       }
+               }
+       }
+
+       function testElggApiGettersEntityMetadataNVPValidNInvalidV() {
+               $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+               $subtype = $subtypes[0];
+               $md_name = 'test_metadata_name_' . rand();
+               $md_value = 'test_metadata_value_' . rand();
+               $guids = array();
+
+               // make some bad ones
+               $invalid_md_name = 'test_metadata_name_' . rand();
+               $e = new ElggObject();
+               $e->subtype = $subtype;
+               $e->$md_name = $invalid_md_value;
+               $e->save();
+               $guids[] = $e->getGUID();
+
+               $invalid_md_value = 'test_metadata_value_' . rand();
+               $e = new ElggObject();
+               $e->subtype = $subtype;
+               $e->$md_name = $invalid_md_value;
+               $e->save();
+               $guids[] = $e->getGUID();
+
+               $md_invalid_names = array();
+
+               $options = array(
+                       'type' => 'object',
+                       'subtype' => $subtype,
+                       'metadata_name_value_pairs' => array(array(
+                               'name' => $md_name,
+                               'value' => 'test_metadata_value_' . rand()
+                       ))
+               );
+
+               $entities = elgg_get_entities_from_metadata($options);
+
+               $this->assertFalse($entities);
+
+               foreach ($guids as $guid) {
+                       if ($e = get_entity($guid)) {
+                               $e->delete();
+                       }
+               }
+       }
+
+
+       function testElggApiGettersEntityMetadataNVPInvalidNValidV() {
+               $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+               $subtype = $subtypes[0];
+               $md_name = 'test_metadata_name_' . rand();
+               $md_value = 'test_metadata_value_' . rand();
+               $guids = array();
+
+               // make some bad ones
+               $invalid_md_name = 'test_metadata_name_' . rand();
+               $e = new ElggObject();
+               $e->subtype = $subtype;
+               $e->$md_name = $invalid_md_value;
+               $e->save();
+               $guids[] = $e->getGUID();
+
+               $invalid_md_value = 'test_metadata_value_' . rand();
+               $e = new ElggObject();
+               $e->subtype = $subtype;
+               $e->$md_name = $invalid_md_value;
+               $e->save();
+               $guids[] = $e->getGUID();
+
+               $md_invalid_names = array();
+
+               $options = array(
+                       'type' => 'object',
+                       'subtype' => $subtype,
+                       'metadata_name_value_pairs' => array(array(
+                               'name' => 'test_metadata_name_' . rand(),
+                               'value' => $md_value
+                       ))
+               );
+
+               $entities = elgg_get_entities_from_metadata($options);
+
+               $this->assertFalse($entities);
+
+               foreach ($guids as $guid) {
+                       if ($e = get_entity($guid)) {
+                               $e->delete();
+                       }
+               }
+       }
+
+
+       function testElggApiGettersEntityMetadataNVPValidNValidVOperandIn() {
+               $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+               $subtype = $subtypes[0];
+               $md_name = 'test_metadata_name_' . rand();
+               $md_value = 'test_metadata_value_' . rand();
+               $guids = array();
+               $valid_guids = array();
+
+               // our targets
+               $valid = new ElggObject();
+               $valid->subtype = $subtype;
+               $valid->$md_name = $md_value;
+               $valid->save();
+               $guids[] = $valid->getGUID();
+               $valid_guids[] = $valid->getGUID();
+
+               $md_name2 = 'test_metadata_name_' . rand();
+               $md_value2 = 'test_metadata_value_' . rand();
+
+               $valid2 = new ElggObject();
+               $valid2->subtype = $subtype;
+               $valid2->$md_name2 = $md_value2;
+               $valid2->save();
+               $guids[] = $valid->getGUID();
+               $valid_guids[] = $valid2->getGUID();
+
+               // make some bad ones
+               $invalid_md_name = 'test_metadata_name_' . rand();
+               $e = new ElggObject();
+               $e->subtype = $subtype;
+               $e->$md_name = $invalid_md_value;
+               $e->save();
+               $guids[] = $e->getGUID();
+
+               $invalid_md_value = 'test_metadata_value_' . rand();
+               $e = new ElggObject();
+               $e->subtype = $subtype;
+               $e->$md_name = $invalid_md_value;
+               $e->save();
+               $guids[] = $e->getGUID();
+
+               $md_valid_values = "'$md_value', '$md_value2'";
+
+               $options = array(
+                       'type' => 'object',
+                       'subtype' => $subtype,
+                       'metadata_name_value_pairs' => array(
+                               array(
+                                       'name' => $md_name,
+                                       'value' => $md_valid_values,
+                                       'operand' => 'IN'
+                               ),
+                               array(
+                                       'name' => $md_name2,
+                                       'value' => $md_valid_values,
+                                       'operand' => 'IN'
+                               ),
+                       ),
+                       'metadata_name_value_pairs_operator' => 'OR'
+               );
+
+               $entities = elgg_get_entities_from_metadata($options);
+
+               $this->assertIsa($entities, 'array');
+               $this->assertEqual(count($entities), 2);
+
+               foreach ($entities as $entity) {
+                       $this->assertTrue(in_array($entity->getGUID(), $valid_guids));
+                       $entity->delete();
+               }
+
+               foreach ($guids as $guid) {
+                       if ($e = get_entity($guid)) {
+                               $e->delete();
+                       }
+               }
+       }
+
+       function testElggApiGettersEntityMetadataNVPValidNValidVPlural() {
+               $subtypes = $this->getRandomValidSubtypes(array('object'), 1);
+               $subtype = $subtypes[0];
+               $md_name = 'test_metadata_name_' . rand();
+               $md_value = 'test_metadata_value_' . rand();
+               $guids = array();
+               $valid_guids = array();
+
+               // our targets
+               $valid = new ElggObject();
+               $valid->subtype = $subtype;
+               $valid->$md_name = $md_value;
+               $valid->save();
+               $guids[] = $valid->getGUID();
+               $valid_guids[] = $valid->getGUID();
+
+               $md_name2 = 'test_metadata_name_' . rand();
+               $md_value2 = 'test_metadata_value_' . rand();
+
+               $valid2 = new ElggObject();
+               $valid2->subtype = $subtype;
+               $valid2->$md_name2 = $md_value2;
+               $valid2->save();
+               $guids[] = $valid->getGUID();
+               $valid_guids[] = $valid2->getGUID();
+
+               // make some bad ones
+               $invalid_md_name = 'test_metadata_name_' . rand();
+               $e = new ElggObject();
+               $e->subtype = $subtype;
+               $e->$md_name = $invalid_md_value;
+               $e->save();
+               $guids[] = $e->getGUID();
+
+               $invalid_md_value = 'test_metadata_value_' . rand();
+               $e = new ElggObject();
+               $e->subtype = $subtype;
+               $e->$md_name = $invalid_md_value;
+               $e->save();
+               $guids[] = $e->getGUID();
+
+               $md_valid_values = array($md_value, $md_value2);
+
+               $options = array(
+                       'type' => 'object',
+                       'subtype' => $subtype,
+                       'metadata_name_value_pairs' => array(
+                               array(
+                                       'name' => $md_name,
+                                       'value' => $md_valid_values,
+                                       'operand' => 'IN'
+                               ),
+                               array(
+                                       'name' => $md_name2,
+                                       'value' => $md_valid_values,
+                                       'operand' => 'IN'
+                               ),
+                       ),
+                       'metadata_name_value_pairs_operator' => 'OR'
+               );
+
+               $entities = elgg_get_entities_from_metadata($options);
+
+               $this->assertIsa($entities, 'array');
+               $this->assertEqual(count($entities), 2);
+
+               foreach ($entities as $entity) {
+                       $this->assertTrue(in_array($entity->getGUID(), $valid_guids));
+                       $entity->delete();
+               }
+
+               foreach ($guids as $guid) {
+                       if ($e = get_entity($guid)) {
+                               $e->delete();
+                       }
+               }
+       }
 }