/** * @param Document|array $documentOrSource Document object or source array * @return Message * * @throws \Exception * @throws GdbotsPbjException */ public function unmarshal($documentOrSource) { if ($documentOrSource instanceof Document) { return $this->doUnmarshal($documentOrSource->getData()); } return $this->doUnmarshal($documentOrSource); }
/** * Adds the given document to the search index * * @param \Elastica\Document $doc Document with data * @return \Elastica\Response */ public function addDocument(Document $doc) { $path = urlencode($doc->getId()); $type = Request::PUT; // If id is empty, POST has to be used to automatically create id if (empty($path)) { $type = Request::POST; } $options = $doc->getOptions(array('version', 'version_type', 'routing', 'percolate', 'parent', 'ttl', 'timestamp', 'op_type', 'consistency', 'replication', 'refresh', 'timeout')); $response = $this->request($path, $type, $doc->getData(), $options); $data = $response->getData(); // set autogenerated id to document if (($doc->isAutoPopulate() || $this->getIndex()->getClient()->getConfigValue(array('document', 'autoPopulate'), false)) && $response->isOk()) { if (!$doc->hasId()) { if (isset($data['_id'])) { $doc->setId($data['_id']); } } if (isset($data['_version'])) { $doc->setVersion($data['_version']); } } return $response; }
/** * @param \Elastica\Response $response * @param \Elastica\Document $document * @param string $fields Array of field names to be populated or '_source' if whole document data should be updated */ protected function _populateDocumentFieldsFromResponse(Response $response, Document $document, $fields) { $responseData = $response->getData(); if ('_source' == $fields) { if (isset($responseData['get']['_source']) && is_array($responseData['get']['_source'])) { $document->setData($responseData['get']['_source']); } } else { $keys = explode(',', $fields); $data = $document->getData(); foreach ($keys as $key) { if (isset($responseData['get']['fields'][$key])) { $data[$key] = $responseData['get']['fields'][$key]; } elseif (isset($data[$key])) { unset($data[$key]); } } $document->setData($data); } }
/** * Update document, using update script. Requires elasticsearch >= 0.19.0 * * @param int $id document id * @param array|\Elastica\Script|\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 http://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 Script) { $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 Script || $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; }
/** * @group unit */ public function testDataPropertiesOverloading() { $document = new Document(1, array('field1' => 'value1', 'field2' => 'value2', 'field3' => 'value3', 'field4' => null)); $this->assertEquals('value1', $document->field1); $this->assertEquals('value2', $document->field2); $this->assertEquals('value3', $document->field3); $this->assertNull($document->field4); try { $document->field5; $this->fail('Undefined field get should throw exception'); } catch (InvalidException $e) { $this->assertTrue(true); } $this->assertTrue(isset($document->field1)); $this->assertTrue(isset($document->field2)); $this->assertTrue(isset($document->field3)); $this->assertFalse(isset($document->field4), 'Field4 should not be isset, because it is null'); $this->assertFalse(isset($document->field5), 'Field5 should not be isset, because it is not set'); $data = $document->getData(); $this->assertArrayHasKey('field1', $data); $this->assertEquals('value1', $data['field1']); $this->assertArrayHasKey('field2', $data); $this->assertEquals('value2', $data['field2']); $this->assertArrayHasKey('field3', $data); $this->assertEquals('value3', $data['field3']); $this->assertArrayHasKey('field4', $data); $this->assertNull($data['field4']); $document->field1 = 'changed1'; unset($document->field3); try { unset($document->field5); $this->fail('Undefined field unset should throw exception'); } catch (InvalidException $e) { $this->assertTrue(true); } $this->assertEquals('changed1', $document->field1); $this->assertFalse(isset($document->field3)); $newData = $document->getData(); $this->assertNotEquals($data, $newData); }