diff --git a/Query.php b/Query.php index ba9de9e..70c1cee 100644 --- a/Query.php +++ b/Query.php @@ -2,6 +2,7 @@ namespace devgroup\arangodb; +use triagens\ArangoDb\Cursor; use triagens\ArangoDb\Document; use Yii; use yii\base\Component; @@ -470,6 +471,109 @@ class Query extends Component implements QueryInterface return empty($result) ? false : $result[0]; } + public function insert($collection, $columns, $params = [], $db = null) + { + $doc = Json::encode($columns); + + $aql = "INSERT $doc IN $collection"; + + $options = ArrayHelper::merge( + $params, + [ + 'query' => $aql, + ] + ); + + $statement = $this->getStatement($options, $db); + $token = $this->getRawAql($statement); + Yii::info($token, 'devgroup\arangodb\Query::insert'); + try { + Yii::beginProfile($token, 'devgroup\arangodb\Query::insert'); + $cursor = $statement->execute(); + Yii::endProfile($token, 'devgroup\arangodb\Query::insert'); + } catch (\Exception $ex) { + Yii::endProfile($token, 'devgroup\arangodb\Query::insert'); + throw new \Exception($ex->getMessage(), (int) $ex->getCode(), $ex); + } + return true; + } + + public function update($collection, $columns, $condition = [], $params = [], $db = null) + { + $this->from($collection); + $clauses = [ + $this->buildFrom($collection), + $this->buildWhere($condition, $params), + $this->buildUpdate($collection, $columns), + ]; + + $aql = implode($this->separator, array_filter($clauses)); + + $options = ArrayHelper::merge( + $params, + [ + 'query' => $aql, + 'bindVars' => $params, + ] + ); + + $statement = $this->getStatement($options, $db); + $token = $this->getRawAql($statement); + Yii::info($token, 'devgroup\arangodb\Query::update'); + try { + Yii::beginProfile($token, 'devgroup\arangodb\Query::update'); + $cursor = $statement->execute(); + Yii::endProfile($token, 'devgroup\arangodb\Query::update'); + } catch (\Exception $ex) { + Yii::endProfile($token, 'devgroup\arangodb\Query::update'); + throw new \Exception($ex->getMessage(), (int) $ex->getCode(), $ex); + } + return $cursor->getMetadata()['extra']['operations']['executed']; + } + + public function remove($collection, $condition, $params = [], $db = null) + { + $this->from($collection); + $clauses = [ + $this->buildFrom($collection), + $this->buildWhere($condition, $params), + $this->buildRemove($collection), + ]; + + $aql = implode($this->separator, array_filter($clauses)); + + $options = ArrayHelper::merge( + $params, + [ + 'query' => $aql, + 'bindVars' => $params, + ] + ); + + $statement = $this->getStatement($options, $db); + $token = $this->getRawAql($statement); + Yii::info($token, 'devgroup\arangodb\Query::remove'); + try { + Yii::beginProfile($token, 'devgroup\arangodb\Query::remove'); + $cursor = $statement->execute(); + Yii::endProfile($token, 'devgroup\arangodb\Query::remove'); + } catch (\Exception $ex) { + Yii::endProfile($token, 'devgroup\arangodb\Query::remove'); + throw new \Exception($ex->getMessage(), (int) $ex->getCode(), $ex); + } + return $cursor->getMetadata()['extra']['operations']['executed']; + } + + protected function buildUpdate($collection, $columns) + { + return 'UPDATE ' . $collection . ' WITH ' . Json::encode($columns) . ' IN ' . $collection; + } + + protected function buildRemove($collection) + { + return 'REMOVE ' . $collection . ' IN ' . $collection; + } + /** * @param Document[] $rows * @return array