/** * @param string $script * @param array|null $params * @param string|null $lang * @param null $id */ public function __construct($script, array $params = null, $lang = null, $id = null) { parent::__construct($params, $id); $this->setScript($script); if ($lang) { $this->setLang($lang); } }
/** * @param \Elastica\Document|\Elastica\Script\AbstractScript $data * @param string $opType * * @return static */ public static function create($data, $opType = null) { //Check type if (!$data instanceof Document && !$data instanceof AbstractScript) { throw new \InvalidArgumentException('The data needs to be a Document or a Script.'); } if (null === $opType && $data->hasOpType()) { $opType = $data->getOpType(); } //Check that scripts can only be used for updates if ($data instanceof AbstractScript) { if ($opType === null) { $opType = self::OP_TYPE_UPDATE; } elseif ($opType != self::OP_TYPE_UPDATE) { throw new \InvalidArgumentException('Scripts can only be used with the update operation type.'); } } switch ($opType) { case self::OP_TYPE_DELETE: $action = new DeleteDocument($data); break; case self::OP_TYPE_CREATE: $action = new CreateDocument($data); break; case self::OP_TYPE_UPDATE: $action = new UpdateDocument($data); break; case self::OP_TYPE_INDEX: default: $action = new IndexDocument($data); break; } return $action; }
/** * Update document, using update script. Requires elasticsearch >= 0.19.0. * * @link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update.html * * @param \Elastica\Document|\Elastica\Script\AbstractScript $data Document with update data * @param array $options array of query params to use for query. For possible options check es api * * @throws \Elastica\Exception\InvalidException * * @return \Elastica\Response */ public function updateDocument($data, array $options = array()) { if (!$data instanceof Document && !$data instanceof AbstractScript) { throw new \InvalidArgumentException('Data should be a Document or Script'); } if (!$data->hasId()) { throw new InvalidException('Document or Script id is not set'); } $id = urlencode($data->getId()); return $this->getIndex()->getClient()->updateDocument($id, $data, $this->getIndex()->getName(), $this->getName(), $options); }
/** * Update document, using update script. Requires elasticsearch >= 0.19.0. * * @param int $id document id * @param array|\Elastica\Script\AbstractScript|\Elastica\Document $data raw data for request body * @param string $index index to update * @param string $type type of index to update * @param array $options array of query params to use for query. For possible options check es api * * @return \Elastica\Response * * @link https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update.html */ public function updateDocument($id, $data, $index, $type, array $options = array()) { $path = $index . '/' . $type . '/' . $id . '/_update'; if ($data instanceof AbstractScript) { $requestData = $data->toArray(); } elseif ($data instanceof Document) { $requestData = array('doc' => $data->getData()); if ($data->getDocAsUpsert()) { $requestData['doc_as_upsert'] = true; } $docOptions = $data->getOptions(array('version', 'version_type', 'routing', 'percolate', 'parent', 'fields', 'retry_on_conflict', 'consistency', 'replication', 'refresh', 'timeout')); $options += $docOptions; // set fields param to source only if options was not set before if ($data instanceof Document && ($data->isAutoPopulate() || $this->getConfigValue(array('document', 'autoPopulate'), false)) && !isset($options['fields'])) { $options['fields'] = '_source'; } } else { $requestData = $data; } //If an upsert document exists if ($data instanceof AbstractScript || $data instanceof Document) { if ($data->hasUpsert()) { $requestData['upsert'] = $data->getUpsert()->getData(); } } if (!isset($options['retry_on_conflict'])) { $retryOnConflict = $this->getConfig('retryOnConflict'); $options['retry_on_conflict'] = $retryOnConflict; } $response = $this->request($path, Request::POST, $requestData, $options); if ($response->isOk() && $data instanceof Document && ($data->isAutoPopulate() || $this->getConfigValue(array('document', 'autoPopulate'), false))) { $responseData = $response->getData(); if (isset($responseData['_version'])) { $data->setVersion($responseData['_version']); } if (isset($options['fields'])) { $this->_populateDocumentFieldsFromResponse($response, $data, $options['fields']); } } return $response; }