Skip to content

Commit d90b4e4

Browse files
author
Ethan Hann
committed
Support alias commands
1 parent 48ba685 commit d90b4e4

File tree

7 files changed

+168
-2
lines changed

7 files changed

+168
-2
lines changed

docs-src/indexing.md

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ $bookIndex->addMany($documents);
170170
$bookIndex->addMany($documents, true);
171171
```
172172

173-
## Indexing from a Hash
173+
## Indexing From a Hash
174174

175175
Redis hashes are key/value pairs referenced by a key.
176176
It is possible to index an existing hash with the **addHash** method.
@@ -189,4 +189,40 @@ Replace a document in the index from a hash:
189189
```php
190190
$document = $bookIndex->makeDocument('foo');
191191
$bookIndex->replaceHash($document);
192-
```
192+
```
193+
194+
## Aliasing
195+
196+
Indexes can be aliased.
197+
198+
Note that an exception will be thrown if any alias method is called before an index's [schema](/#create-the-schema) is created.
199+
200+
### Adding an Alias
201+
202+
An alias can be added for an index like this:
203+
204+
```php-inline
205+
$index->addAlias('foo');
206+
```
207+
208+
### Updating an Alias
209+
210+
Assuming an alias has already been added to an index, like this:
211+
212+
```php-inline
213+
$oldIndex->addAlias('foo');
214+
```
215+
216+
...it can be reassigned to a different index like this:
217+
218+
```php-inline
219+
$newIndex->updateAlias('foo');
220+
```
221+
222+
### Deleting an Alias
223+
224+
An alias can be deleted like this:
225+
226+
```php-inline
227+
$index->deleteAlias('foo');
228+
```
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
namespace Ehann\RediSearch\Exceptions;
4+
5+
use Exception;
6+
7+
class AliasDoesNotExistException extends Exception
8+
{
9+
public function __construct($message = '', $code = 0, Exception $previous = null)
10+
{
11+
parent::__construct(
12+
trim("Alias does not exist. $message"),
13+
$code,
14+
$previous
15+
);
16+
}
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
namespace Ehann\RediSearch\Exceptions;
4+
5+
use Exception;
6+
7+
class UnknownIndexNameOrNameIsAnAliasItselfException extends Exception
8+
{
9+
public function __construct($message = '', $code = 0, Exception $previous = null)
10+
{
11+
parent::__construct(
12+
trim("Unknown index name (or name is an alias itself). $message"),
13+
$code,
14+
$previous
15+
);
16+
}
17+
}

src/Index.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -593,4 +593,31 @@ public function count(string $query = ''): int
593593
{
594594
return $this->makeQueryBuilder()->count($query);
595595
}
596+
597+
/**
598+
* @param string $name
599+
* @return bool
600+
*/
601+
public function addAlias(string $name): bool
602+
{
603+
return $this->rawCommand('FT.ALIASADD', [$name, $this->getIndexName()]);
604+
}
605+
606+
/**
607+
* @param string $name
608+
* @return bool
609+
*/
610+
public function updateAlias(string $name): bool
611+
{
612+
return $this->rawCommand('FT.ALIASUPDATE', [$name, $this->getIndexName()]);
613+
}
614+
615+
/**
616+
* @param string $name
617+
* @return bool
618+
*/
619+
public function deleteAlias(string $name): bool
620+
{
621+
return $this->rawCommand('FT.ALIASDEL', [$name]);
622+
}
596623
}

src/IndexInterface.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,7 @@ public function addMany(array $documents, $disableAtomicity = false);
3434
public function replace($document): bool;
3535
public function addHash($document): bool;
3636
public function replaceHash($document): bool;
37+
public function addAlias(string $name): bool;
38+
public function updateAlias(string $name): bool;
39+
public function deleteAlias(string $name): bool;
3740
}

src/RediSearchRedisClient.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
namespace Ehann\RediSearch;
44

5+
use Ehann\RediSearch\Exceptions\AliasDoesNotExistException;
56
use Ehann\RediSearch\Exceptions\RediSearchException;
67
use Ehann\RediSearch\Exceptions\UnknownIndexNameException;
8+
use Ehann\RediSearch\Exceptions\UnknownIndexNameOrNameIsAnAliasItselfException;
79
use Ehann\RediSearch\Exceptions\UnknownRediSearchCommandException;
810
use Ehann\RediSearch\Exceptions\UnsupportedRediSearchLanguageException;
911
use Ehann\RedisRaw\AbstractRedisRawClient;
@@ -39,6 +41,15 @@ public function validateRawCommandResults($payload)
3941
if (in_array($message, ['unsupported language', 'unsupported stemmer language', 'bad argument for `language`'])) {
4042
throw new UnsupportedRediSearchLanguageException();
4143
}
44+
45+
if ($message === 'unknown index name (or name is an alias itself)') {
46+
throw new UnknownIndexNameOrNameIsAnAliasItselfException();
47+
}
48+
49+
if ($message === 'alias does not exist') {
50+
throw new AliasDoesNotExistException();
51+
}
52+
4253
if (strpos($message, 'err unknown command \'ft.') !== false) {
4354
throw new UnknownRediSearchCommandException($message);
4455
}

tests/RediSearch/IndexTest.php

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
namespace Ehann\Tests\RediSearch;
44

5+
use Ehann\RediSearch\Exceptions\AliasDoesNotExistException;
56
use Ehann\RediSearch\Exceptions\FieldNotInSchemaException;
67
use Ehann\RediSearch\Exceptions\NoFieldsInIndexException;
78
use Ehann\RediSearch\Exceptions\RediSearchException;
9+
use Ehann\RediSearch\Exceptions\UnknownIndexNameOrNameIsAnAliasItselfException;
810
use Ehann\RediSearch\Fields\Tag;
911
use Ehann\RediSearch\Fields\TagField;
1012
use Ehann\RediSearch\Index;
@@ -689,4 +691,57 @@ public function testShouldNotChangeOriginalSchemaFieldWhenAddingNewDocument()
689691
$this->assertEquals($expectedId, $documents[0]->getId());
690692
$this->assertEquals($expectedTitle, $documents[0]->title->getValue());
691693
}
694+
695+
public function testShouldCreateAlias()
696+
{
697+
$this->subject->create();
698+
699+
$result = $this->subject->addAlias('MyAlias');
700+
701+
$this->assertTrue($result);
702+
}
703+
704+
public function testShouldUpdateAlias()
705+
{
706+
$this->subject->create();
707+
$this->subject->addAlias('MyAlias');
708+
$index = (new Index($this->redisClient, 'Second'))
709+
->addTextField('foo');
710+
$index->create();
711+
712+
$result = $index->updateAlias('MyAlias');
713+
714+
$this->assertTrue($result);
715+
}
716+
717+
public function testShouldDeleteAlias()
718+
{
719+
$this->subject->create();
720+
$this->subject->addAlias('MyAlias');
721+
722+
$result = $this->subject->deleteAlias('MyAlias');
723+
724+
$this->assertTrue($result);
725+
}
726+
727+
public function testShouldFailToCreateAliasIfIndexDoesNotExist()
728+
{
729+
$this->expectException(UnknownIndexNameOrNameIsAnAliasItselfException::class);
730+
731+
$this->subject->addAlias('MyAlias');
732+
}
733+
734+
public function testShouldFailToUpdateAliasIfIndexDoesNotExist()
735+
{
736+
$this->expectException(UnknownIndexNameOrNameIsAnAliasItselfException::class);
737+
738+
$this->subject->updateAlias('MyAlias');
739+
}
740+
741+
public function testShouldFailToDeleteAliasIfIndexDoesNotExist()
742+
{
743+
$this->expectException(AliasDoesNotExistException::class);
744+
745+
$this->subject->deleteAlias('MyAlias');
746+
}
692747
}

0 commit comments

Comments
 (0)