summaryrefslogtreecommitdiff
path: root/src/engine/VyOSElasticModernFulltextStorageEngine.php
diff options
context:
space:
mode:
authorYuriy Andamasov <yuriy@vyos.io>2026-05-22 11:48:30 +0300
committerYuriy Andamasov <yuriy@vyos.io>2026-05-23 13:44:49 +0300
commite0eb6dd6b21c129c775d8bb2bec203ae0d756d0f (patch)
tree1063deb932748eb0d0e030764143453e4ed88816 /src/engine/VyOSElasticModernFulltextStorageEngine.php
parentf945e302f79086c6ea99bd45d414fe6bccefb9d4 (diff)
downloadphorge-elasticsearch-modern-e0eb6dd6b21c129c775d8bb2bec203ae0d756d0f.tar.gz
phorge-elasticsearch-modern-e0eb6dd6b21c129c775d8bb2bec203ae0d756d0f.zip
Engine: Add reindexAbstractDocument() + executeRequest()
reindexAbstractDocument builds the document body with documentType as a real field (replacing the bundled engine's per-type URL segment), then PUTs to the typeless /_doc/{phid} URL via the new helper. executeRequest mirrors the bundled engine's HTTPSFuture pattern; it's private and not test-targeted directly (smoke tests in V1-V3 exercise the full wire path). 🤖 Generated by [robots](https://vyos.io)
Diffstat (limited to 'src/engine/VyOSElasticModernFulltextStorageEngine.php')
-rw-r--r--src/engine/VyOSElasticModernFulltextStorageEngine.php104
1 files changed, 101 insertions, 3 deletions
diff --git a/src/engine/VyOSElasticModernFulltextStorageEngine.php b/src/engine/VyOSElasticModernFulltextStorageEngine.php
index 42e2fd6..211a196 100644
--- a/src/engine/VyOSElasticModernFulltextStorageEngine.php
+++ b/src/engine/VyOSElasticModernFulltextStorageEngine.php
@@ -9,6 +9,7 @@ abstract class VyOSElasticModernFulltextStorageEngine
private $version = null;
private $index;
+ private $timeout = 15;
public function setService(PhabricatorSearchService $service) {
$this->service = $service; // inherited protected property
@@ -173,11 +174,108 @@ abstract class VyOSElasticModernFulltextStorageEngine
return new VyOSElasticModernHost($this);
}
+ public function setTimeout($timeout) {
+ $this->timeout = $timeout;
+ return $this;
+ }
+
+ public function getTimeout() {
+ return $this->timeout;
+ }
+
public function reindexAbstractDocument(
PhabricatorSearchAbstractDocument $doc) {
- throw new Exception(pht(
- 'reindexAbstractDocument() is not yet implemented on '.
- 'VyOSElasticModernFulltextStorageEngine; lands in Task E7.'));
+
+ $host = $this->getHostForWrite();
+
+ $type = $doc->getDocumentType();
+ $phid = $doc->getPHID();
+
+ // The handle query mirrors the bundled engine's pattern; it
+ // populates the handle cache so subsequent field-data lookups
+ // don't issue redundant queries.
+ $handle = id(new PhabricatorHandleQuery())
+ ->setViewer(PhabricatorUser::getOmnipotentUser())
+ ->withPHIDs(array($phid))
+ ->executeOne();
+
+ $spec = array(
+ 'title' => $doc->getDocumentTitle(),
+ 'dateCreated' => $doc->getDocumentCreated(),
+ 'lastModified' => $doc->getDocumentModified(),
+ 'documentType' => $type,
+ );
+
+ foreach ($doc->getFieldData() as $field) {
+ list($field_name, $corpus, $aux) = $field;
+ if (!isset($spec[$field_name])) {
+ $spec[$field_name] = array($corpus);
+ } else {
+ $spec[$field_name][] = $corpus;
+ }
+ if ($aux !== null) {
+ $spec[$field_name][] = $aux;
+ }
+ }
+
+ foreach ($doc->getRelationshipData() as $field) {
+ list($field_name, $related_phid, $rtype, $time) = $field;
+ if (!isset($spec[$field_name])) {
+ $spec[$field_name] = array($related_phid);
+ } else {
+ $spec[$field_name][] = $related_phid;
+ }
+ if ($time) {
+ $spec[$field_name.'_ts'] = $time;
+ }
+ }
+
+ $this->executeRequest(
+ $host,
+ $this->getDocumentUri($type, $phid),
+ $spec,
+ 'PUT');
+ }
+
+ private function executeRequest(
+ VyOSElasticModernHost $host, $path, array $data, $method = 'GET') {
+
+ $uri = $host->getURI($path);
+ $data = phutil_json_encode($data);
+ $future = new HTTPSFuture($uri, $data);
+ $future->addHeader('Content-Type', 'application/json');
+
+ if ($method !== 'GET') {
+ $future->setMethod($method);
+ }
+ if ($this->getTimeout()) {
+ $future->setTimeout($this->getTimeout());
+ }
+
+ try {
+ list($body) = $future->resolvex();
+ } catch (HTTPFutureResponseStatus $ex) {
+ if ($ex->isTimeout() || (int)$ex->getStatusCode() > 499) {
+ $host->didHealthCheck(false);
+ }
+ throw $ex;
+ }
+
+ if ($method !== 'GET') {
+ return null;
+ }
+
+ try {
+ $decoded = phutil_json_decode($body);
+ $host->didHealthCheck(true);
+ return $decoded;
+ } catch (PhutilJSONParserException $ex) {
+ $host->didHealthCheck(false);
+ throw new Exception(
+ pht('Elasticsearch server returned invalid JSON.'),
+ 0,
+ $ex);
+ }
}
public function executeSearch(PhabricatorSavedQuery $query) {