update remove by Query

This commit is contained in:
evgen-d 2014-08-12 10:33:20 +04:00
parent 1cb6b89d3d
commit 6790b11451
8 changed files with 40 additions and 65 deletions

6
.gitignore vendored
View File

@ -1,2 +1,6 @@
# phpstorm project files # phpstorm project files
.idea .idea
composer.phar
composer.lock
vendor

View File

@ -3,12 +3,9 @@
namespace devgroup\arangodb; namespace devgroup\arangodb;
use Yii; use Yii;
use yii\base\InvalidConfigException;
use yii\db\ActiveQueryInterface; use yii\db\ActiveQueryInterface;
use yii\db\ActiveQueryTrait; use yii\db\ActiveQueryTrait;
use yii\db\ActiveRecordInterface;
use yii\db\ActiveRelationTrait; use yii\db\ActiveRelationTrait;
use yii\helpers\VarDumper;
use triagens\ArangoDb\Document; use triagens\ArangoDb\Document;
@ -103,18 +100,6 @@ class ActiveQuery extends Query implements ActiveQueryInterface
return $models; return $models;
} }
private function prefixKeyColumns($attributes)
{
if ($this instanceof ActiveQuery) {
/* @var $modelClass ActiveRecord */
$modelClass = $this->modelClass;
foreach ($attributes as $i => $attribute) {
$attributes[$i] = "{$modelClass::collectionName()}.$attribute";
}
}
return $attributes;
}
public function all($db = null) public function all($db = null)
{ {
$statement = $this->createCommand($db); $statement = $this->createCommand($db);

View File

@ -5,7 +5,6 @@ namespace devgroup\arangodb;
use Yii; use Yii;
use yii\base\ArrayableTrait; use yii\base\ArrayableTrait;
use yii\base\InvalidConfigException; use yii\base\InvalidConfigException;
use yii\base\Model;
use yii\db\ActiveQueryInterface; use yii\db\ActiveQueryInterface;
use yii\db\BaseActiveRecord; use yii\db\BaseActiveRecord;
use yii\db\StaleObjectException; use yii\db\StaleObjectException;
@ -113,11 +112,11 @@ abstract class ActiveRecord extends BaseActiveRecord
* } * }
* *
* // Use andWhere()/orWhere() to apply the default condition * // Use andWhere()/orWhere() to apply the default condition
* // SELECT FROM customer WHERE `deleted`=:deleted AND age>30 * // FOR customer IN customer FILTER customer.deleted=:deleted AND customer.age>30 RETURN customer
* $customers = Customer::find()->andWhere('age>30')->all(); * $customers = Customer::find()->andWhere('age>30')->all();
* *
* // Use where() to ignore the default condition * // Use where() to ignore the default condition
* // SELECT FROM customer WHERE age>30 * // FOR customer IN customer FILTER customer.age>30 RETURN customer
* $customers = Customer::find()->where('age>30')->all(); * $customers = Customer::find()->where('age>30')->all();
* *
* @return ActiveQueryInterface the newly created [[ActiveQueryInterface|ActiveQuery]] instance. * @return ActiveQueryInterface the newly created [[ActiveQueryInterface|ActiveQuery]] instance.
@ -235,10 +234,12 @@ abstract class ActiveRecord extends BaseActiveRecord
$this->setAttribute($key, $attribute); $this->setAttribute($key, $attribute);
} }
$rows = static::getDb()->getDocumentHandler()->updateById( $rows = (new Query())->update(
static::collectionName(), static::collectionName(),
$this->getOldAttribute('_key'), $values,
Document::createFromArray($values) [
'_key' => $this->getOldAttribute('_key'),
]
); );
if ($lock !== null && !$rows) { if ($lock !== null && !$rows) {
@ -300,20 +301,7 @@ abstract class ActiveRecord extends BaseActiveRecord
*/ */
public static function updateAll($attributes, $condition = []) public static function updateAll($attributes, $condition = [])
{ {
$docs = static::findAll($condition); return (new Query())->update(static::collectionName(), $attributes, $condition);
$count = 0;
foreach ($docs as $doc) {
foreach ($attributes as $key => $attribute) {
$doc->setAttribute($key, $attribute);
$doc->document->set($key, $attribute);
}
if (static::getDb()->getDocumentHandler()->update($doc->document)) {
$count++;
}
}
return $count;
} }
/** /**
@ -331,19 +319,9 @@ abstract class ActiveRecord extends BaseActiveRecord
* An empty condition will match all records. * An empty condition will match all records.
* @return integer the number of rows deleted * @return integer the number of rows deleted
*/ */
public static function deleteAll($condition = null) public static function deleteAll($condition = [])
{ {
/** @var Document[] $docs */ return (new Query())->remove(static::collectionName(), $condition);
$records = static::findAll($condition);
$count = 0;
foreach ($records as $record) {
if (static::getDb()->getDocumentHandler()->remove($record->document)) {
$count++;
}
}
return $count;
} }
public static function truncate() public static function truncate()
@ -410,7 +388,7 @@ abstract class ActiveRecord extends BaseActiveRecord
if ($lock !== null) { if ($lock !== null) {
$condition[$lock] = $this->$lock; $condition[$lock] = $this->$lock;
} }
$result = static::getDb()->getDocumentHandler()->removeById(static::collectionName(), $condition); $result = (new Query())->remove(static::collectionName(), $condition);
if ($lock !== null && !$result) { if ($lock !== null && !$result) {
throw new StaleObjectException('The object being deleted is outdated.'); throw new StaleObjectException('The object being deleted is outdated.');
} }

View File

@ -39,11 +39,11 @@ abstract class Migration extends Component implements MigrationInterface
echo " done (time: " . sprintf('%.3f', microtime(true) - $time) . "s)\n"; echo " done (time: " . sprintf('%.3f', microtime(true) - $time) . "s)\n";
} }
public function insert($collection, $columns) public function insert($collection, $columns, $params = [])
{ {
echo " > insert into $collection ..."; echo " > insert into $collection ...";
$time = microtime(true); $time = microtime(true);
$this->db->getDocumentHandler()->save($collection, $columns); (new Query())->insert($collection, $columns, $params);
echo " done (time: " . sprintf('%.3f', microtime(true) - $time) . "s)\n"; echo " done (time: " . sprintf('%.3f', microtime(true) - $time) . "s)\n";
} }
@ -51,7 +51,7 @@ abstract class Migration extends Component implements MigrationInterface
{ {
echo " > update $collection ..."; echo " > update $collection ...";
$time = microtime(true); $time = microtime(true);
(new Query())->update($collection, $columns, $condition, $params)->execute(); (new Query())->update($collection, $columns, $condition, $params);
echo " done (time: " . sprintf('%.3f', microtime(true) - $time) . "s)\n"; echo " done (time: " . sprintf('%.3f', microtime(true) - $time) . "s)\n";
} }
@ -59,7 +59,7 @@ abstract class Migration extends Component implements MigrationInterface
{ {
echo " > delete from $collection ..."; echo " > delete from $collection ...";
$time = microtime(true); $time = microtime(true);
(new Query())->remove($collection, $condition, $params)->execute(); (new Query())->remove($collection, $condition, $params);
echo " done (time: " . sprintf('%.3f', microtime(true) - $time) . "s)\n"; echo " done (time: " . sprintf('%.3f', microtime(true) - $time) . "s)\n";
} }

View File

@ -2,9 +2,9 @@
namespace devgroup\arangodb; namespace devgroup\arangodb;
use triagens\ArangoDb\Cursor;
use triagens\ArangoDb\Document;
use Yii; use Yii;
use triagens\ArangoDb\Document;
use triagens\ArangoDb\Statement;
use yii\base\Component; use yii\base\Component;
use yii\base\InvalidParamException; use yii\base\InvalidParamException;
use yii\base\NotSupportedException; use yii\base\NotSupportedException;
@ -12,9 +12,6 @@ use yii\db\QueryInterface;
use yii\helpers\ArrayHelper; use yii\helpers\ArrayHelper;
use yii\helpers\Json; use yii\helpers\Json;
use triagens\ArangoDb\Statement;
use yii\helpers\VarDumper;
class Query extends Component implements QueryInterface class Query extends Component implements QueryInterface
{ {
const PARAM_PREFIX = 'qp'; const PARAM_PREFIX = 'qp';
@ -475,7 +472,7 @@ class Query extends Component implements QueryInterface
{ {
$doc = Json::encode($columns); $doc = Json::encode($columns);
$aql = "INSERT $doc IN $collection"; $aql = "INSERT $doc IN {$this->quoteCollectionName($collection)}";
$options = ArrayHelper::merge( $options = ArrayHelper::merge(
$params, $params,
@ -528,10 +525,13 @@ class Query extends Component implements QueryInterface
Yii::endProfile($token, 'devgroup\arangodb\Query::update'); Yii::endProfile($token, 'devgroup\arangodb\Query::update');
throw new \Exception($ex->getMessage(), (int) $ex->getCode(), $ex); throw new \Exception($ex->getMessage(), (int) $ex->getCode(), $ex);
} }
return $cursor->getMetadata()['extra']['operations']['executed']; $meta = $cursor->getMetadata();
return isset($meta['extra']['operations']['executed']) ?
$meta['extra']['operations']['executed'] :
true;
} }
public function remove($collection, $condition, $params = [], $db = null) public function remove($collection, $condition = [], $params = [], $db = null)
{ {
$this->from($collection); $this->from($collection);
$clauses = [ $clauses = [
@ -561,12 +561,17 @@ class Query extends Component implements QueryInterface
Yii::endProfile($token, 'devgroup\arangodb\Query::remove'); Yii::endProfile($token, 'devgroup\arangodb\Query::remove');
throw new \Exception($ex->getMessage(), (int) $ex->getCode(), $ex); throw new \Exception($ex->getMessage(), (int) $ex->getCode(), $ex);
} }
return $cursor->getMetadata()['extra']['operations']['executed']; $meta = $cursor->getMetadata();
return isset($meta['extra']['operations']['executed']) ?
$meta['extra']['operations']['executed'] :
true;
} }
protected function buildUpdate($collection, $columns) protected function buildUpdate($collection, $columns)
{ {
return 'UPDATE ' . $collection . ' WITH ' . Json::encode($columns) . ' IN ' . $collection; return 'UPDATE ' . $collection . ' WITH '
. Json::encode($columns) . ' IN '
. $this->quoteCollectionName($collection);
} }
protected function buildRemove($collection) protected function buildRemove($collection)

View File

@ -18,10 +18,14 @@
"email": "fps.06@mail.ru" "email": "fps.06@mail.ru"
} }
], ],
"minimum-stability": "dev",
"require": { "require": {
"yiisoft/yii2": "*", "yiisoft/yii2": "*",
"triagens/arangodb": "*" "triagens/arangodb": "*"
}, },
"require-dev": {
"yiisoft/yii2-debug": "*"
},
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"devgroup\\arangodb\\": "" "devgroup\\arangodb\\": ""

View File

@ -11,8 +11,6 @@ use yii;
use yii\console\controllers\BaseMigrateController; use yii\console\controllers\BaseMigrateController;
use yii\helpers\ArrayHelper; use yii\helpers\ArrayHelper;
use triagens\ArangoDb\ServerException;
class MigrateController extends BaseMigrateController class MigrateController extends BaseMigrateController
{ {
/** /**

View File

@ -2,6 +2,7 @@
namespace devgroup\arangodb\panels\arangodb\models; namespace devgroup\arangodb\panels\arangodb\models;
use yii;
use yii\data\ArrayDataProvider; use yii\data\ArrayDataProvider;
use yii\debug\components\search\Filter; use yii\debug\components\search\Filter;
use yii\debug\models\search\Base; use yii\debug\models\search\Base;