diff --git a/core/modules/views/src/Plugin/views/display/EntityReference.php b/core/modules/views/src/Plugin/views/display/EntityReference.php index c8ab57c499..d5ecc1af63 100644 --- a/core/modules/views/src/Plugin/views/display/EntityReference.php +++ b/core/modules/views/src/Plugin/views/display/EntityReference.php @@ -3,7 +3,6 @@ namespace Drupal\views\Plugin\views\display; use Drupal\Core\Database\Connection; -use Drupal\Core\Database\Query\Condition; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -170,7 +169,7 @@ public function query() { } // Multiple search fields are OR'd together. - $conditions = new Condition('OR'); + $conditions = $this->view->query->getConnection()->condition('OR'); // Build the condition using the selected search fields. foreach ($style_options['options']['search_fields'] as $field_id) { diff --git a/core/modules/views/src/Plugin/views/filter/BooleanOperator.php b/core/modules/views/src/Plugin/views/filter/BooleanOperator.php index 81a31880c3..fd46fa804d 100644 --- a/core/modules/views/src/Plugin/views/filter/BooleanOperator.php +++ b/core/modules/views/src/Plugin/views/filter/BooleanOperator.php @@ -2,7 +2,6 @@ namespace Drupal\views\Plugin\views\filter; -use Drupal\Core\Database\Query\Condition; use Drupal\Core\Form\FormStateInterface; use Drupal\views\Plugin\views\display\DisplayPluginBase; use Drupal\views\ViewExecutable; @@ -236,12 +235,12 @@ protected function queryOpBoolean($field, $query_operator = self::EQUAL) { if (empty($this->value)) { if ($this->accept_null) { if ($query_operator === self::EQUAL) { - $condition = (new Condition('OR')) + $condition = ($this->query->getConnection()->condition('OR')) ->condition($field, 0, $query_operator) ->isNull($field); } else { - $condition = (new Condition('AND')) + $condition = ($this->query->getConnection()->condition('AND')) ->condition($field, 0, $query_operator) ->isNotNull($field); } diff --git a/core/modules/views/src/Plugin/views/filter/StringFilter.php b/core/modules/views/src/Plugin/views/filter/StringFilter.php index 229eb90733..88639dff15 100644 --- a/core/modules/views/src/Plugin/views/filter/StringFilter.php +++ b/core/modules/views/src/Plugin/views/filter/StringFilter.php @@ -3,7 +3,6 @@ namespace Drupal\views\Plugin\views\filter; use Drupal\Core\Database\Connection; -use Drupal\Core\Database\Query\Condition; use Drupal\Core\Form\FormStateInterface; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -330,7 +329,7 @@ protected function opContains($field) { } protected function opContainsWord($field) { - $where = $this->operator == 'word' ? new Condition('OR') : new Condition('AND'); + $where = $this->operator == 'word' ? $this->query->getConnection()->condition('OR') : $this->query->getConnection()->condition('AND'); // Don't filter on empty strings. if (empty($this->value)) { diff --git a/core/modules/views/src/Plugin/views/query/Sql.php b/core/modules/views/src/Plugin/views/query/Sql.php index 92c9fc2a8c..68b46698eb 100644 --- a/core/modules/views/src/Plugin/views/query/Sql.php +++ b/core/modules/views/src/Plugin/views/query/Sql.php @@ -885,7 +885,7 @@ public function clearFields() { * @code * $this->query->addWhere( * $this->options['group'], - * (new Condition('OR')) + * ($this->query->getConnection()->condition('OR')) * ->condition($field, $value, 'NOT IN') * ->condition($field, $value, 'IS NULL') * ); @@ -1111,13 +1111,16 @@ protected function buildCondition($where = 'where') { $has_arguments = FALSE; $has_filter = FALSE; - $main_group = new Condition('AND'); - $filter_group = $this->groupOperator == 'OR' ? new Condition('OR') : new Condition('AND'); + /** @var \Drupal\Core\Database\Connection $connection */ + $connection = $this->getConnection(); + + $main_group = $connection->condition('AND'); + $filter_group = $this->groupOperator == 'OR' ? $connection->condition('OR') : $connection->condition('AND'); foreach ($this->$where as $group => $info) { if (!empty($info['conditions'])) { - $sub_group = $info['type'] == 'OR' ? new Condition('OR') : new Condition('AND'); + $sub_group = $info['type'] == 'OR' ? $connection->condition('OR') : $connection->condition('AND'); foreach ($info['conditions'] as $clause) { if ($clause['operator'] == 'formula') { $has_condition = TRUE; diff --git a/core/modules/views/tests/src/Unit/Plugin/display/EntityReferenceTest.php b/core/modules/views/tests/src/Unit/Plugin/display/EntityReferenceTest.php new file mode 100644 index 0000000000..9365b85706 --- /dev/null +++ b/core/modules/views/tests/src/Unit/Plugin/display/EntityReferenceTest.php @@ -0,0 +1,63 @@ +getMockBuilder(Connection::class) + ->disableOriginalConstructor() + ->getMock(); + // We are testing that the method + // \Drupal\Core\Database\Connection::condition() is being called. + $connection->expects($this->once()) + ->method('condition'); + + $entity_reference = new EntityReference([], 'some_plugin_id', [], $connection); + $entity_reference->options = [ + 'entity_reference_options' => [ + 'match' => 'something', + 'match_operator' => '=', + 'limit' => 1, + ], + 'style' => [ + 'options' => [ + 'search_fields' => [], + ] + ], + ]; + + $entity_reference->view = $this->getMockBuilder(ViewExecutable::class) + ->disableOriginalConstructor() + ->getMock(); + + $entity_reference->view->query = $this->getMockBuilder(Sql::class) + ->disableOriginalConstructor() + ->getMock(); + $entity_reference->view->query->expects($this->once()) + ->method('getConnection')->willReturn($connection); + + $entity_reference->view->storage = $this->getMockBuilder(View::class) + ->disableOriginalConstructor() + ->getMock(); + $entity_reference->view->storage->expects($this->exactly(2)) + ->method('get')->willReturn('something'); + + $entity_reference->query(); + } + +} diff --git a/core/modules/views/tests/src/Unit/Plugin/filter/BooleanOperatorTest.php b/core/modules/views/tests/src/Unit/Plugin/filter/BooleanOperatorTest.php new file mode 100644 index 0000000000..057ba72fa0 --- /dev/null +++ b/core/modules/views/tests/src/Unit/Plugin/filter/BooleanOperatorTest.php @@ -0,0 +1,60 @@ +getMockBuilder(Condition::class) + ->disableOriginalConstructor() + ->getMock(); + $condition->expects($this->exactly(2)) + ->method('condition') + ->willReturn($condition); + + $connection = $this->getMockBuilder(Connection::class) + ->disableOriginalConstructor() + ->getMock(); + $connection->expects($this->exactly(2)) + ->method('condition') + ->withConsecutive(['OR'], ['AND']) + ->willReturn($condition); + + $boolean_operator = new BooleanOperator([], 'some_plugin_id', [], $connection); + $boolean_operator->options = [ + 'group' => 'something', + ]; + $boolean_operator->accept_null = TRUE; + + $boolean_operator->query = $this->getMockBuilder(Sql::class) + ->disableOriginalConstructor() + ->getMock(); + $boolean_operator->query->expects($this->exactly(2)) + ->method('getConnection')->willReturn($connection); + + $query_op_boolean = new \ReflectionMethod($boolean_operator, 'queryOpBoolean'); + $query_op_boolean->setAccessible(TRUE); + + // The method \Drupal\Core\Database\Connection::condition() should be called + // with the argument 'OR'. + $query_op_boolean->invoke($boolean_operator, 'some_field', BooleanOperator::EQUAL); + + // The method \Drupal\Core\Database\Connection::condition() should be called + // with the argument 'AND'. + $query_op_boolean->invoke($boolean_operator, 'some_field', BooleanOperator::NOT_EQUAL); + } + +} diff --git a/core/modules/views/tests/src/Unit/Plugin/filter/StringFilterTest.php b/core/modules/views/tests/src/Unit/Plugin/filter/StringFilterTest.php new file mode 100644 index 0000000000..6fa1983d12 --- /dev/null +++ b/core/modules/views/tests/src/Unit/Plugin/filter/StringFilterTest.php @@ -0,0 +1,48 @@ +getMockBuilder(Connection::class) + ->disableOriginalConstructor() + ->getMock(); + $connection->expects($this->exactly(2)) + ->method('condition') + ->withConsecutive(['AND'], ['OR']); + + $string_filter = new StringFilter([], 'some_plugin_id', [], $connection); + $string_filter->query = $this->getMockBuilder(Sql::class) + ->disableOriginalConstructor() + ->getMock(); + $string_filter->query->expects($this->exactly(2)) + ->method('getConnection')->willReturn($connection); + + $op_contains_word = new \ReflectionMethod($string_filter, 'opContainsWord'); + $op_contains_word->setAccessible(TRUE); + + // The method \Drupal\Core\Database\Connection::condition() should be called + // with the argument 'AND'. + $op_contains_word->invoke($string_filter, 'some_field'); + + $string_filter->operator = 'word'; + + // The method \Drupal\Core\Database\Connection::condition() should be called + // with the argument 'OR'. + $op_contains_word->invoke($string_filter, 'some_field'); + } + +} diff --git a/core/modules/views/tests/src/Unit/Plugin/query/SqlTest.php b/core/modules/views/tests/src/Unit/Plugin/query/SqlTest.php index 0ef02fb661..f32eac1b77 100644 --- a/core/modules/views/tests/src/Unit/Plugin/query/SqlTest.php +++ b/core/modules/views/tests/src/Unit/Plugin/query/SqlTest.php @@ -2,6 +2,8 @@ namespace Drupal\Tests\views\Unit\Plugin\query; +use Drupal\Core\Database\Connection; +use Drupal\Core\Database\Query\Condition; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityStorageInterface; use Drupal\Core\Entity\EntityType; @@ -606,4 +608,60 @@ public function testLoadEntitiesWithRelationshipAndRevision() { $this->assertSame($entities['second'][12], $result[2]->_relationship_entities['entity_second']); } + /** + * @covers ::buildCondition + */ + public function testSqlBuildConditionUsesConnectionCondition() { + $condition = $this->getMockBuilder(Condition::class) + ->disableOriginalConstructor() + ->getMock(); + $condition->expects($this->exactly(4)) + ->method('condition') + ->willReturn($condition); + + $connection = $this->getMockBuilder(Connection::class) + ->disableOriginalConstructor() + ->getMock(); + $connection->expects($this->exactly(6)) + ->method('condition') + ->withConsecutive(['AND'], ['AND'], ['AND'], ['AND'], ['OR'], ['OR']) + ->willReturn($condition); + + $sql = $this->getMockBuilder(Sql::class) + ->disableOriginalConstructor() + ->getMock(); + $sql->expects($this->any()) + ->method('getConnection')->willReturn($connection); + + $sql->where = [ + 'some_group' => [ + 'conditions' => [ + [ + 'operator' => 'some_operator', + 'field' => 'some_field', + 'value' => 'some_value', + ], + ], + 'type' => 'AND', + ] + ]; + + $build_condition = new \ReflectionMethod($sql, 'buildCondition'); + $build_condition->setAccessible(TRUE); + + // The method \Drupal\Core\Database\Connection::condition() should be called + // 3 times with the argument 'AND'. + $build_condition->invoke($sql); + + $group_operator = new \ReflectionProperty($sql, 'groupOperator'); + $group_operator->setAccessible(TRUE); + $group_operator->setValue($sql, 'OR'); + + $sql->where['some_group']['type'] = 'OR'; + + // The method \Drupal\Core\Database\Connection::condition() should be called + // 1 time with the argument 'AND' and then 2 times with the argument 'OR'. + $build_condition->invoke($sql); + } + }