Esempio n. 1
0
 /**
  * @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;
 }
Esempio n. 3
0
 /**
  * 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;
 }