Skip to content

Commit 8a8141a

Browse files
ArangoDB analyzer support
* Added analyzer endpoint support * Ensured correct functionality with php8.3 --------- Co-authored-by: LaravelFreelancerNL <LaravelFreelancerNL@users.noreply.github.com>
1 parent 17096e2 commit 8a8141a

File tree

3 files changed

+228
-0
lines changed

3 files changed

+228
-0
lines changed

src/Schema/ManagesAnalyzers.php

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace ArangoClient\Schema;
6+
7+
use ArangoClient\ArangoClient;
8+
use ArangoClient\Exceptions\ArangoException;
9+
use stdClass;
10+
11+
/*
12+
* @see https://docs.arangodb.com/stable/develop/http-api/analyzers/
13+
*/
14+
trait ManagesAnalyzers
15+
{
16+
protected ArangoClient $arangoClient;
17+
18+
protected function getFullName(string $name): string
19+
{
20+
if (!str_contains($name, '::')) {
21+
$name = $this->arangoClient->getDatabase() . '::' . $name;
22+
}
23+
return $name;
24+
}
25+
26+
/**
27+
* @see https://docs.arangodb.com/stable/develop/http-api/analyzers/#create-an-analyzer
28+
*
29+
* @param array<mixed> $analyzer
30+
* @return stdClass
31+
* @throws ArangoException
32+
*/
33+
public function createAnalyzer(array $analyzer): stdClass
34+
{
35+
$uri = '/_api/analyzer';
36+
37+
$options = [
38+
'body' => $analyzer,
39+
];
40+
41+
return $this->arangoClient->request('post', $uri, $options);
42+
}
43+
44+
/**
45+
* @see https://docs.arangodb.com/stable/develop/http-api/analyzers/#remove-an-analyzer
46+
*
47+
* @throws ArangoException
48+
*/
49+
public function deleteAnalyzer(string $name): bool
50+
{
51+
$uri = '/_api/analyzer/' . $name;
52+
53+
return (bool) $this->arangoClient->request('delete', $uri);
54+
}
55+
56+
/**
57+
* @see https://docs.arangodb.com/stable/develop/http-api/analyzers/#list-all-analyzers
58+
*
59+
* @return array<mixed>
60+
*
61+
* @throws ArangoException
62+
*/
63+
public function getAnalyzers(): array
64+
{
65+
$results = $this->arangoClient->request('get', '/_api/analyzer');
66+
67+
return (array) $results->result;
68+
}
69+
70+
/**
71+
* Check for analyzer existence
72+
*
73+
*
74+
* @throws ArangoException
75+
*/
76+
public function hasAnalyzer(string $name): bool
77+
{
78+
$name = $this->getFullName($name);
79+
80+
$analyzers = $this->getAnalyzers();
81+
82+
return in_array($name, array_column($analyzers, 'name'), true);
83+
}
84+
85+
/**
86+
* @see https://docs.arangodb.com/stable/develop/http-api/analyzers/#get-an-analyzer-definition
87+
*
88+
* @throws ArangoException
89+
*/
90+
public function getAnalyzer(string $name): stdClass
91+
{
92+
$uri = '/_api/analyzer/' . $name;
93+
94+
return $this->arangoClient->request('get', $uri);
95+
}
96+
97+
/**
98+
* Replace an existing analyzer. Note that this is just a shorthand for delete(old)/create(new).
99+
*
100+
* @see https://docs.arangodb.com/stable/develop/http-api/analyzers/#create-an-analyzer
101+
*
102+
* @param string $name
103+
* @param array<mixed> $newAnalyzer
104+
* @return stdClass|false
105+
* @throws ArangoException
106+
*/
107+
public function replaceAnalyzer(string $name, array $newAnalyzer): stdClass|false
108+
{
109+
if (!$this->hasAnalyzer($name)) {
110+
return false;
111+
}
112+
$this->deleteAnalyzer($name);
113+
114+
// Enforce the analyzer name
115+
$newAnalyzer['name'] = $name;
116+
117+
return $this->createAnalyzer($newAnalyzer);
118+
}
119+
}

src/Schema/SchemaManager.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
class SchemaManager extends Manager
1111
{
12+
use ManagesAnalyzers;
1213
use ManagesCollections;
1314
use ManagesDatabases;
1415
use ManagesGraphs;
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
6+
class SchemaManagerAnalyzersTest extends \Tests\TestCase
7+
{
8+
protected array $analyzer = [
9+
'name' => 'testAnalyzerBasics',
10+
'type' => 'identity',
11+
];
12+
13+
protected function setUp(): void
14+
{
15+
\Tests\TestCase::setUp();
16+
17+
if (!$this->schemaManager->hasAnalyzer($this->analyzer['name'])) {
18+
$this->schemaManager->createAnalyzer($this->analyzer);
19+
}
20+
}
21+
22+
protected function tearDown(): void
23+
{
24+
\Tests\TestCase::tearDown();
25+
26+
if ($this->schemaManager->hasAnalyzer($this->analyzer['name'])) {
27+
$this->schemaManager->deleteAnalyzer($this->analyzer['name']);
28+
}
29+
}
30+
31+
public function testGetAnalyzers()
32+
{
33+
$analyzers = $this->schemaManager->getAnalyzers();
34+
35+
$customAnalyzer = end($analyzers);
36+
37+
$this->assertSame('arangodb_php_client__test::' . $this->analyzer['name'], $customAnalyzer->name);
38+
}
39+
40+
public function testGetAnalyzer()
41+
{
42+
$analyzer = $this->schemaManager->getAnalyzer($this->analyzer['name']);
43+
44+
$this->assertSame('arangodb_php_client__test::' . $this->analyzer['name'], $analyzer->name);
45+
$this->assertObjectHasProperty('type', $analyzer);
46+
}
47+
48+
public function testGetAnalyzerWithFullName()
49+
{
50+
$analyzer = $this->schemaManager->getAnalyzer('arangodb_php_client__test::' . $this->analyzer['name']);
51+
52+
$this->assertSame('arangodb_php_client__test::' . $this->analyzer['name'], $analyzer->name);
53+
$this->assertObjectHasProperty('type', $analyzer);
54+
}
55+
56+
57+
public function testHasAnalyzer()
58+
{
59+
$result = $this->schemaManager->hasAnalyzer($this->analyzer['name']);
60+
$this->assertTrue($result);
61+
62+
$result = $this->schemaManager->hasAnalyzer('someNoneExistingAnalyzer');
63+
$this->assertFalse($result);
64+
}
65+
66+
public function testReplaceAnalyzer()
67+
{
68+
$newAnalyzerProps = [
69+
'name' => 'newAnalyzer',
70+
'type' => 'identity',
71+
];
72+
;
73+
$newAnalyzer = $this->schemaManager->replaceAnalyzer($this->analyzer['name'], $newAnalyzerProps);
74+
75+
$this->assertSame('arangodb_php_client__test::' . $this->analyzer['name'], $newAnalyzer->name);
76+
}
77+
78+
public function testCreateAndDeleteAnalyzer()
79+
{
80+
$analyzer = [
81+
'name' => 'coolnewanalyzer',
82+
'type' => 'identity',
83+
];
84+
$created = $this->schemaManager->createAnalyzer($analyzer);
85+
$this->assertObjectHasProperty('name', $created);
86+
$this->assertSame('arangodb_php_client__test::' . $analyzer['name'], $created->name);
87+
88+
$deleted = $this->schemaManager->deleteAnalyzer($analyzer['name']);
89+
$this->assertTrue($deleted);
90+
}
91+
92+
public function testDeleteWithFullName()
93+
{
94+
$analyzer = [
95+
'name' => 'coolnewanalyzer',
96+
'type' => 'identity',
97+
];
98+
$created = $this->schemaManager->createAnalyzer($analyzer);
99+
100+
$fullName = 'arangodb_php_client__test::' . $analyzer['name'];
101+
102+
$deleted = $this->schemaManager->deleteAnalyzer($fullName);
103+
104+
$hasAnalyzer = $this->schemaManager->hasAnalyzer($fullName);
105+
$this->assertFalse($hasAnalyzer);
106+
}
107+
108+
}

0 commit comments

Comments
 (0)