Issue #2864995 by amateescu, Dinesh18, Sam152: Allow entity query to query the latest revision
parent
df1dd607ad
commit
66cbd7c9e5
|
@ -108,6 +108,13 @@ abstract class QueryBase implements QueryInterface {
|
|||
*/
|
||||
protected $allRevisions = FALSE;
|
||||
|
||||
/**
|
||||
* Flag indicating whether to query the latest revision.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $latestRevision = FALSE;
|
||||
|
||||
/**
|
||||
* The query pager data.
|
||||
*
|
||||
|
@ -252,6 +259,16 @@ abstract class QueryBase implements QueryInterface {
|
|||
*/
|
||||
public function currentRevision() {
|
||||
$this->allRevisions = FALSE;
|
||||
$this->latestRevision = FALSE;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function latestRevision() {
|
||||
$this->allRevisions = TRUE;
|
||||
$this->latestRevision = TRUE;
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
@ -260,6 +277,7 @@ abstract class QueryBase implements QueryInterface {
|
|||
*/
|
||||
public function allRevisions() {
|
||||
$this->allRevisions = TRUE;
|
||||
$this->latestRevision = FALSE;
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
|
|
@ -254,6 +254,17 @@ interface QueryInterface extends AlterableInterface {
|
|||
*/
|
||||
public function currentRevision();
|
||||
|
||||
/**
|
||||
* Queries the latest revision.
|
||||
*
|
||||
* The latest revision is the most recent revision of an entity. This will be
|
||||
* either the default revision, or a pending revision if one exists and it is
|
||||
* newer than the default.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function latestRevision();
|
||||
|
||||
/**
|
||||
* Queries all the revisions.
|
||||
*
|
||||
|
|
|
@ -119,6 +119,14 @@ class Query extends QueryBase implements QueryInterface {
|
|||
// entity id.
|
||||
$this->sqlFields["base_table.$id_field"] = ['base_table', $id_field];
|
||||
}
|
||||
|
||||
// Add a self-join to the base revision table if we're querying only the
|
||||
// latest revisions.
|
||||
if ($this->latestRevision && $revision_field) {
|
||||
$this->sqlQuery->leftJoin($base_table, 'base_table_2', "base_table.$id_field = base_table_2.$id_field AND base_table.$revision_field < base_table_2.$revision_field");
|
||||
$this->sqlQuery->isNull("base_table_2.$id_field");
|
||||
}
|
||||
|
||||
if ($this->accessCheck) {
|
||||
$this->sqlQuery->addTag($this->entityTypeId . '_access');
|
||||
}
|
||||
|
|
|
@ -318,6 +318,16 @@ class EntityQueryTest extends EntityKernelTestBase {
|
|||
// Now we get everything.
|
||||
$assert = [4 => '4', 5 => '5', 6 => '6', 7 => '7', 8 => '8', 9 => '9', 10 => '10', 11 => '11', 12 => '12', 20 => '12', 13 => '13', 21 => '13', 14 => '14', 22 => '14', 15 => '15', 23 => '15'];
|
||||
$this->assertIdentical($results, $assert);
|
||||
|
||||
// Check that a query on the latest revisions without any condition returns
|
||||
// the correct results.
|
||||
$results = $this->factory->get('entity_test_mulrev')
|
||||
->latestRevision()
|
||||
->sort('id')
|
||||
->sort('revision_id')
|
||||
->execute();
|
||||
$expected = [1 => '1', 2 => '2', 3 => '3', 16 => '4', 17 => '5', 18 => '6', 19 => '7', 8 => '8', 9 => '9', 10 => '10', 11 => '11', 20 => '12', 21 => '13', 22 => '14', 23 => '15'];
|
||||
$this->assertSame($expected, $results);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -936,6 +946,54 @@ class EntityQueryTest extends EntityKernelTestBase {
|
|||
->allRevisions()
|
||||
->execute();
|
||||
$this->assertEqual($result, [16 => '14']);
|
||||
|
||||
// Add another pending revision on the same entity and repeat the checks.
|
||||
$entity->setNewRevision(TRUE);
|
||||
$entity->isDefaultRevision(FALSE);
|
||||
$entity->{$this->figures}->setValue([
|
||||
'color' => 'red',
|
||||
'shape' => 'square'
|
||||
]);
|
||||
$entity->save();
|
||||
|
||||
// A non-revisioned entity query should still return entity 14.
|
||||
$result = $this->factory->get('entity_test_mulrev')
|
||||
->condition('id', [14], 'IN')
|
||||
->execute();
|
||||
$this->assertCount(1, $result);
|
||||
$this->assertSame([14 => '14'], $result);
|
||||
|
||||
// Now check an entity query on the latest revision.
|
||||
$result = $this->factory->get('entity_test_mulrev')
|
||||
->condition('id', [14], 'IN')
|
||||
->latestRevision()
|
||||
->execute();
|
||||
$this->assertCount(1, $result);
|
||||
$this->assertSame([17 => '14'], $result);
|
||||
|
||||
// Verify that field conditions on the default and pending revision still
|
||||
// work as expected.
|
||||
$result = $this->factory->get('entity_test_mulrev')
|
||||
->condition('id', [14], 'IN')
|
||||
->condition("$this->figures.color", $current_values[0]['color'])
|
||||
->execute();
|
||||
$this->assertSame([14 => '14'], $result);
|
||||
|
||||
// Now there are two revisions with same value for the figure color.
|
||||
$result = $this->factory->get('entity_test_mulrev')
|
||||
->condition('id', [14], 'IN')
|
||||
->condition("$this->figures.color", 'red')
|
||||
->allRevisions()
|
||||
->execute();
|
||||
$this->assertSame([16 => '14', 17 => '14'], $result);
|
||||
|
||||
// Check that querying for the latest revision returns the correct one.
|
||||
$result = $this->factory->get('entity_test_mulrev')
|
||||
->condition('id', [14], 'IN')
|
||||
->condition("$this->figures.color", 'red')
|
||||
->latestRevision()
|
||||
->execute();
|
||||
$this->assertSame([17 => '14'], $result);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue