From a3724aa4d125e907f87d043aabc06bcdc7778ff3 Mon Sep 17 00:00:00 2001 From: Florian Fackler Date: Wed, 5 Feb 2014 11:49:33 +0100 Subject: [PATCH] Fixed bug which prevented a field query as described in the example: ``` $result = Article::find()->query(["field" => ["title" => "yii"]])->all(); ```` --- extensions/yii/elasticsearch/QueryBuilder.php | 4 +- .../elasticsearch/QueryBuilderTest.php | 73 +++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 tests/unit/extensions/elasticsearch/QueryBuilderTest.php diff --git a/extensions/yii/elasticsearch/QueryBuilder.php b/extensions/yii/elasticsearch/QueryBuilder.php index 9201f9a8fa..14c2ce6933 100644 --- a/extensions/yii/elasticsearch/QueryBuilder.php +++ b/extensions/yii/elasticsearch/QueryBuilder.php @@ -55,8 +55,10 @@ class QueryBuilder extends \yii\base\Object $parts['from'] = (int) $query->offset; } - if (empty($parts['query'])) { + if (empty($query->query)) { $parts['query'] = ["match_all" => (object)[]]; + } else { + $parts['query'] = $query->query; } $whereFilter = $this->buildCondition($query->where); diff --git a/tests/unit/extensions/elasticsearch/QueryBuilderTest.php b/tests/unit/extensions/elasticsearch/QueryBuilderTest.php new file mode 100644 index 0000000000..8f0c58278b --- /dev/null +++ b/tests/unit/extensions/elasticsearch/QueryBuilderTest.php @@ -0,0 +1,73 @@ +getConnection()->createCommand(); + $command->deleteAllIndexes(); + } + + private function prepareDbData() + { + $command = $this->getConnection()->createCommand(); + $command->insert('test', 'article', ['title' => 'I love yii!'], 1); + $command->insert('test', 'article', ['title' => 'Symfony2 is another framework'], 2); + $command->insert('test', 'article', ['title' => 'Yii2 out now!'], 3); + $command->insert('test', 'article', ['title' => 'yii test'], 4); + + $command->flushIndex(); + } + + public function testQueryBuilderRespectsQuery() + { + $queryParts = ['field' => ['title' => 'yii']]; + $queryBuilder = new QueryBuilder($this->getConnection()); + $query = new Query(); + $query->query = $queryParts; + $build = $queryBuilder->build($query); + $this->assertTrue(array_key_exists('queryParts', $build)); + $this->assertTrue(array_key_exists('query', $build['queryParts'])); + $this->assertFalse(array_key_exists('match_all', $build['queryParts']), 'Match all should not be set'); + $this->assertSame($queryParts, $build['queryParts']['query']); + } + + public function testYiiCanBeFoundByQuery() + { + $this->prepareDbData(); + $queryParts = ['field' => ['title' => 'yii']]; + $query = new Query(); + $query->from('test', 'article'); + $query->query = $queryParts; + $result = $query->search($this->getConnection()); + $this->assertEquals(2, $result['hits']['total']); + } + + public function testFuzzySearch() + { + $this->prepareDbData(); + $queryParts = [ + "fuzzy_like_this" => [ + "fields" => ["title"], + "like_text" => "Similar to YII", + "max_query_terms" => 4 + ] + ]; + $query = new Query(); + $query->from('test', 'article'); + $query->query = $queryParts; + $result = $query->search($this->getConnection()); + $this->assertEquals(3, $result['hits']['total']); + } +} +