Browse Source

fixed count and asArray()

tags/2.0.0-beta
Carsten Brandt 11 years ago
parent
commit
779d6b6e96
  1. 12
      framework/yii/elasticsearch/ActiveQuery.php
  2. 12
      framework/yii/elasticsearch/Query.php
  3. 3
      tests/unit/data/ar/elasticsearch/ActiveRecord.php
  4. 46
      tests/unit/framework/elasticsearch/ActiveRecordTest.php

12
framework/yii/elasticsearch/ActiveQuery.php

@ -89,6 +89,12 @@ class ActiveQuery extends Query implements ActiveQueryInterface
return []; return [];
} }
$models = $this->createModels($result['hits']); $models = $this->createModels($result['hits']);
if ($this->asArray) {
foreach($models as $key => $model) {
$models[$key] = $model['_source'];
$models[$key]['primaryKey'] = $model['_id'];
}
}
if (!empty($this->with)) { if (!empty($this->with)) {
$this->findWith($this->with, $models); $this->findWith($this->with, $models);
} }
@ -107,11 +113,13 @@ class ActiveQuery extends Query implements ActiveQueryInterface
{ {
$command = $this->createCommand($db); $command = $this->createCommand($db);
$result = $command->queryOne(); $result = $command->queryOne();
if ($result['total'] == 0) { if ($result['total'] == 0 || empty($result['hits'])) {
return null; return null;
} }
if ($this->asArray) { if ($this->asArray) {
$model = reset($result['hits']); $first = reset($result['hits']);
$model = $first['_source'];
$model['primaryKey'] = $first['_id'];
} else { } else {
/** @var ActiveRecord $class */ /** @var ActiveRecord $class */
$class = $this->modelClass; $class = $this->modelClass;

12
framework/yii/elasticsearch/Query.php

@ -117,16 +117,20 @@ class Query extends Component implements QueryInterface
/** /**
* Returns the number of records. * Returns the number of records.
* @param string $q the COUNT expression. Defaults to '*'. * @param string $q the COUNT expression. This parameter is ignored by this implementation.
* Make sure you properly quote column names in the expression.
* @param Connection $db the database connection used to generate the SQL statement. * @param Connection $db the database connection used to generate the SQL statement.
* If this parameter is not given (or null), the `db` application component will be used. * If this parameter is not given (or null), the `db` application component will be used.
* @return integer number of records * @return integer number of records
*/ */
public function count($q = '*', $db = null) public function count($q = '*', $db = null)
{ {
$this->select = ["COUNT($q)"]; $count = $this->createCommand($db)->queryCount()['total'];
return $this->createCommand($db)->queryScalar(); if ($this->limit === null && $this->offset === null) {
return $count;
} elseif ($this->offset !== null) {
$count = $this->offset < $count ? $count - $this->offset : 0;
}
return $this->limit === null ? $count : ($this->limit > $count ? $count : $this->limit);
} }

3
tests/unit/data/ar/elasticsearch/ActiveRecord.php

@ -17,6 +17,9 @@ class ActiveRecord extends \yii\elasticsearch\ActiveRecord
{ {
public static $db; public static $db;
/**
* @return \yii\elasticsearch\Connection
*/
public static function getDb() public static function getDb()
{ {
return self::$db; return self::$db;

46
tests/unit/framework/elasticsearch/ActiveRecordTest.php

@ -92,16 +92,18 @@ class ActiveRecordTest extends ElasticSearchTestCase
// $orderItem->setAttributes(array('order_id' => 3, 'item_id' => 2, 'quantity' => 1, 'subtotal' => 40.0), false); // $orderItem->setAttributes(array('order_id' => 3, 'item_id' => 2, 'quantity' => 1, 'subtotal' => 40.0), false);
// $orderItem->save(false); // $orderItem->save(false);
for($n = 0; $n < 20; $n++) { Customer::getDb()->createCommand()->flushIndex();
$r = $db->http()->post('_count')->send();
$c = Json::decode($r->getBody(true)); // for($n = 0; $n < 20; $n++) {
if ($c['count'] != 11) { // $r = $db->http()->post('_count')->send();
usleep(100000); // $c = Json::decode($r->getBody(true));
} else { // if ($c['count'] != 11) {
return; // usleep(100000);
} // } else {
} // return;
throw new \Exception('Unable to initialize elasticsearch data.'); // }
// }
// throw new \Exception('Unable to initialize elasticsearch data.');
} }
public function testFind() public function testFind()
@ -127,22 +129,24 @@ class ActiveRecordTest extends ElasticSearchTestCase
$this->assertNull($customer); $this->assertNull($customer);
// query scalar // query scalar
$customerName = Customer::find()->where(array('id' => 2))->scalar('name'); $customerName = Customer::find()->where(array('status' => 2))->scalar('name');
$this->assertEquals('user2', $customerName); $this->assertEquals('user3', $customerName);
// find by column values // find by column values
$customer = Customer::find(array('id' => 2, 'name' => 'user2')); $customer = Customer::find(array('name' => 'user2'));
$this->assertTrue($customer instanceof Customer); $this->assertTrue($customer instanceof Customer);
$this->assertEquals('user2', $customer->name); $this->assertEquals('user2', $customer->name);
$customer = Customer::find(array('id' => 2, 'name' => 'user1')); $customer = Customer::find(array('name' => 'user1', 'id' => 2));
$this->assertNull($customer); $this->assertNull($customer);
$customer = Customer::find(array('id' => 5)); $customer = Customer::find(array('primaryKey' => 5));
$this->assertNull($customer);
$customer = Customer::find(array('name' => 'user5'));
$this->assertNull($customer); $this->assertNull($customer);
// find by attributes // find by attributes
$customer = Customer::find()->where(array('name' => 'user2'))->one(); $customer = Customer::find()->where(array('name' => 'user2'))->one();
$this->assertTrue($customer instanceof Customer); $this->assertTrue($customer instanceof Customer);
$this->assertEquals(2, $customer->id); $this->assertEquals('user2', $customer->name);
// find count, sum, average, min, max, scalar // find count, sum, average, min, max, scalar
$this->assertEquals(3, Customer::find()->count()); $this->assertEquals(3, Customer::find()->count());
@ -156,13 +160,13 @@ class ActiveRecordTest extends ElasticSearchTestCase
// $this->assertEquals(2, Customer::find()->active()->count()); // $this->assertEquals(2, Customer::find()->active()->count());
// asArray // asArray
$customer = Customer::find()->where(array('id' => 2))->asArray()->one(); $customer = Customer::find()->where(array('name' => 'user2'))->asArray()->one();
$this->assertEquals(array( $this->assertEquals(array(
'id' => '2',
'email' => 'user2@example.com', 'email' => 'user2@example.com',
'name' => 'user2', 'name' => 'user2',
'address' => 'address2', 'address' => 'address2',
'status' => '1', 'status' => '1',
'primaryKey' => 2,
), $customer); ), $customer);
// indexBy // indexBy
@ -174,13 +178,13 @@ class ActiveRecordTest extends ElasticSearchTestCase
// indexBy callable // indexBy callable
$customers = Customer::find()->indexBy(function ($customer) { $customers = Customer::find()->indexBy(function ($customer) {
return $customer->id . '-' . $customer->name; return $customer->status . '-' . $customer->name;
// })->orderBy('id')->all(); // })->orderBy('id')->all();
})->all(); })->all();
$this->assertEquals(3, count($customers)); $this->assertEquals(3, count($customers));
$this->assertTrue($customers['1-user1'] instanceof Customer); $this->assertTrue($customers['1-user1'] instanceof Customer);
$this->assertTrue($customers['2-user2'] instanceof Customer); $this->assertTrue($customers['1-user2'] instanceof Customer);
$this->assertTrue($customers['3-user3'] instanceof Customer); $this->assertTrue($customers['2-user3'] instanceof Customer);
} }
public function testFindCount() public function testFindCount()

Loading…
Cancel
Save