diff options
Diffstat (limited to 'modules')
-rw-r--r-- | modules/field/modules/field_sql_storage/field_sql_storage.module | 44 | ||||
-rw-r--r-- | modules/simpletest/tests/entity_query.test | 59 |
2 files changed, 75 insertions, 28 deletions
diff --git a/modules/field/modules/field_sql_storage/field_sql_storage.module b/modules/field/modules/field_sql_storage/field_sql_storage.module index 9349a95d6..19401fcb4 100644 --- a/modules/field/modules/field_sql_storage/field_sql_storage.module +++ b/modules/field/modules/field_sql_storage/field_sql_storage.module @@ -550,35 +550,53 @@ function field_sql_storage_field_storage_query(EntityFieldQuery $query) { } } - // Add field orders. - foreach ($query->fieldOrder as $key => $order) { - $table_alias = $table_aliases[$key]; - $field = $order['field']; - $sql_field = "$table_alias." . _field_sql_storage_columnname($field['field_name'], $order['column']); - $select_query->orderBy($sql_field, $order['direction']); - } - if (isset($query->deleted)) { $select_query->condition("$field_base_table.deleted", (int) $query->deleted); } - if ($query->propertyConditions || $query->propertyOrder) { + // Is there a need to sort the query by property? + $has_property_order = FALSE; + foreach ($query->order as $order) { + if ($order['type'] == 'property') { + $has_property_order = TRUE; + } + } + + if ($query->propertyConditions || $has_property_order) { if (empty($query->entityConditions['entity_type']['value'])) { throw new EntityFieldQueryException('Property conditions and orders must have an entity type defined.'); } $entity_type = $query->entityConditions['entity_type']['value']; $entity_base_table = _field_sql_storage_query_join_entity($select_query, $entity_type, $field_base_table); $query->entityConditions['entity_type']['operator'] = '='; - $query->processProperty($select_query, $entity_base_table); + foreach ($query->propertyConditions as $property_condition) { + $query->addCondition($select_query, "$entity_base_table." . $property_condition['column'], $property_condition); + } } foreach ($query->entityConditions as $key => $condition) { $sql_field = $key == 'entity_type' ? 'fcet.type' : "$field_base_table.$key"; $query->addCondition($select_query, $sql_field, $condition); } - foreach ($query->entityOrder as $key => $direction) { - $sql_field = $key == 'entity_type' ? 'fcet.type' : "$field_base_table.$key"; - $select_query->orderBy($sql_field, $direction); + + // Order the query. + foreach ($query->order as $order) { + if ($order['type'] == 'entity') { + $key = $order['specifier']; + $sql_field = $key == 'entity_type' ? 'fcet.type' : "$field_base_table.$key"; + $select_query->orderBy($sql_field, $order['direction']); + } + elseif ($order['type'] == 'field') { + $specifier = $order['specifier']; + $field = $specifier['field']; + $table_alias = $table_aliases[$specifier['index']]; + $sql_field = "$table_alias." . _field_sql_storage_columnname($field['field_name'], $specifier['column']); + $select_query->orderBy($sql_field, $order['direction']); + } + elseif ($order['type'] == 'property') { + $select_query->orderBy("$entity_base_table." . $order['specifier'], $order['direction']); + } } + return $query->finishQuery($select_query, $id_key); } diff --git a/modules/simpletest/tests/entity_query.test b/modules/simpletest/tests/entity_query.test index e569cba1a..171c51730 100644 --- a/modules/simpletest/tests/entity_query.test +++ b/modules/simpletest/tests/entity_query.test @@ -295,7 +295,7 @@ class EntityFieldQueryTestCase extends DrupalWebTestCase { array('test_entity_bundle_key', 2), array('test_entity_bundle_key', 1), ), t('Test sort entity entity_id in descending order.'), TRUE); - + // Test entity sort by entity_id, with a field condition. $query = new EntityFieldQuery(); $query @@ -351,7 +351,7 @@ class EntityFieldQueryTestCase extends DrupalWebTestCase { array('test_entity_bundle_key', 2), array('test_entity_bundle_key', 1), ), t('Test sort entity entity_id property in descending order.'), TRUE); - + // Test property sort by entity id, with a field condition. $query = new EntityFieldQuery(); $query @@ -394,7 +394,7 @@ class EntityFieldQueryTestCase extends DrupalWebTestCase { array('test_entity_bundle_key', 1), array('test_entity_bundle_key', 6), array('test_entity_bundle_key', 5), - ), t('Test sort entity bundle in ascending order.'), TRUE); + ), t('Test sort entity bundle in ascending order, property in descending order.'), TRUE); $query = new EntityFieldQuery(); $query @@ -408,38 +408,67 @@ class EntityFieldQueryTestCase extends DrupalWebTestCase { array('test_entity_bundle_key', 2), array('test_entity_bundle_key', 3), array('test_entity_bundle_key', 4), - ), t('Test sort entity bundle in descending order.'), TRUE); - + ), t('Test sort entity bundle in descending order, property in ascending order.'), TRUE); + // Test entity sort by bundle, with a field condition. $query = new EntityFieldQuery(); $query ->entityCondition('entity_type', 'test_entity_bundle_key') ->fieldCondition($this->fields[0], 'value', 0, '>') ->entityOrderBy('bundle', 'ASC') - ->propertyOrderBy('ftid', 'ASC'); + ->propertyOrderBy('ftid', 'DESC'); $this->assertEntityFieldQuery($query, array( - array('test_entity_bundle_key', 1), - array('test_entity_bundle_key', 2), - array('test_entity_bundle_key', 3), array('test_entity_bundle_key', 4), - array('test_entity_bundle_key', 5), + array('test_entity_bundle_key', 3), + array('test_entity_bundle_key', 2), + array('test_entity_bundle_key', 1), array('test_entity_bundle_key', 6), - ), t('Test sort entity bundle in ascending order, with a field condition.'), TRUE); + array('test_entity_bundle_key', 5), + ), t('Test sort entity bundle in ascending order, property in descending order, with a field condition.'), TRUE); $query = new EntityFieldQuery(); $query ->entityCondition('entity_type', 'test_entity_bundle_key') ->fieldCondition($this->fields[0], 'value', 0, '>') ->entityOrderBy('bundle', 'DESC') - ->propertyOrderBy('ftid', 'DESC'); + ->propertyOrderBy('ftid', 'ASC'); $this->assertEntityFieldQuery($query, array( - array('test_entity_bundle_key', 6), array('test_entity_bundle_key', 5), + array('test_entity_bundle_key', 6), + array('test_entity_bundle_key', 1), + array('test_entity_bundle_key', 2), + array('test_entity_bundle_key', 3), + array('test_entity_bundle_key', 4), + ), t('Test sort entity bundle in descending order, property in ascending order, with a field condition.'), TRUE); + + // Test entity sort by bundle, field. + $query = new EntityFieldQuery(); + $query + ->entityCondition('entity_type', 'test_entity_bundle_key') + ->entityOrderBy('bundle', 'ASC') + ->fieldOrderBy($this->fields[0], 'value', 'DESC'); + $this->assertEntityFieldQuery($query, array( array('test_entity_bundle_key', 4), array('test_entity_bundle_key', 3), array('test_entity_bundle_key', 2), array('test_entity_bundle_key', 1), - ), t('Test sort entity bundle in descending order, with a field condition.'), TRUE); + array('test_entity_bundle_key', 6), + array('test_entity_bundle_key', 5), + ), t('Test sort entity bundle in ascending order, field in descending order.'), TRUE); + + $query = new EntityFieldQuery(); + $query + ->entityCondition('entity_type', 'test_entity_bundle_key') + ->entityOrderBy('bundle', 'DESC') + ->fieldOrderBy($this->fields[0], 'value', 'ASC'); + $this->assertEntityFieldQuery($query, array( + array('test_entity_bundle_key', 5), + array('test_entity_bundle_key', 6), + array('test_entity_bundle_key', 1), + array('test_entity_bundle_key', 2), + array('test_entity_bundle_key', 3), + array('test_entity_bundle_key', 4), + ), t('Test sort entity bundle in descending order, field in ascending order.'), TRUE); // Test entity sort by revision_id. $query = new EntityFieldQuery(); @@ -463,7 +492,7 @@ class EntityFieldQueryTestCase extends DrupalWebTestCase { array('test_entity', 2), array('test_entity', 1), ), t('Test sort entity revision_id in descending order.'), TRUE); - + // Test entity sort by revision_id, with a field condition. $query = new EntityFieldQuery(); $query |