From 7ea926ad78c3e18985d89982604ce6272d7e7c17 Mon Sep 17 00:00:00 2001 From: Chris Mague Date: Mon, 19 Oct 2020 11:42:11 -0700 Subject: [PATCH 1/3] index alias add --- redisearch/client.py | 14 ++++++++++++++ test/test.py | 15 +++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/redisearch/client.py b/redisearch/client.py index 55b05f9..5c964b2 100644 --- a/redisearch/client.py +++ b/redisearch/client.py @@ -174,6 +174,9 @@ class Client(object): MGET_CMD = 'FT.MGET' CONFIG_CMD = 'FT.CONFIG' TAGVALS_CMD = 'FT.TAGVALS' + ALIAS_ADD_CMD = 'FT.ALIASADD' + ALIAS_UPDATE_CMD = 'FT.ALIASUPDATE' + ALIAS_DEL_CMD = 'FT.ALIASDEL' NOOFFSETS = 'NOOFFSETS' NOFIELDS = 'NOFIELDS' @@ -659,3 +662,14 @@ def tagvals(self, tagfield): cmd = self.redis.execute_command(self.TAGVALS_CMD, self.index_name, tagfield) return cmd + def aliasadd(self, alias): + """ + Alias a search index + + ### Parameters + + - **alias**: Name of the alias to create + """ + + cmd = self.redis.execute_command(self.ALIAS_ADD_CMD, alias, self.index_name) + return cmd \ No newline at end of file diff --git a/test/test.py b/test/test.py index 12fde7d..6402831 100644 --- a/test/test.py +++ b/test/test.py @@ -564,6 +564,21 @@ def testSummarize(self): self.assertEqual('ACT I SCENE I. London. The palace. Enter KING HENRY, LORD JOHN OF LANCASTER, the EARL of WESTMORELAND, SIR... ', doc.txt) + def testAlias(self): + conn = self.redis() + with conn as r: + # Creating a client with a given index name + client = Client('idx', port=conn.port) + client.redis.flushdb() + + client.create_index((TextField('txt'),)) + client.add_document('doc1', txt = 'fooz barz') + client.aliasadd('myalias') + + alias_client = Client('myalias', port=conn.port) + res = alias_client.search('*').docs[0] + self.assertEqual('doc1', res.id) + def testTags(self): conn = self.redis() From d58b85b5958f3a866eb0a0364ee856ce944dc27a Mon Sep 17 00:00:00 2001 From: Chris Mague Date: Mon, 19 Oct 2020 12:48:02 -0700 Subject: [PATCH 2/3] add tests for v < 2.0 on aliases --- redisearch/client.py | 26 +++++++++++++++++++++++++- test/test.py | 43 ++++++++++++++++++++++++++++++++++--------- 2 files changed, 59 insertions(+), 10 deletions(-) diff --git a/redisearch/client.py b/redisearch/client.py index 5c964b2..2686dd8 100644 --- a/redisearch/client.py +++ b/redisearch/client.py @@ -664,7 +664,7 @@ def tagvals(self, tagfield): def aliasadd(self, alias): """ - Alias a search index + Alias a search index - will fail if alias already exists ### Parameters @@ -672,4 +672,28 @@ def aliasadd(self, alias): """ cmd = self.redis.execute_command(self.ALIAS_ADD_CMD, alias, self.index_name) + return cmd + + def aliasupdate(self, alias): + """ + Updates an alias - will fail if alias does not already exist + + ### Parameters + + - **alias**: Name of the alias to create + """ + + cmd = self.redis.execute_command(self.ALIAS_UPDATE_CMD, alias, self.index_name) + return cmd + + def aliasdel(self, alias): + """ + Removes an alias to a search index + + ### Parameters + + - **alias**: Name of the alias to delete + """ + + cmd = self.redis.execute_command(self.ALIAS_DEL_CMD, alias) return cmd \ No newline at end of file diff --git a/test/test.py b/test/test.py index 6402831..faae306 100644 --- a/test/test.py +++ b/test/test.py @@ -567,17 +567,42 @@ def testSummarize(self): def testAlias(self): conn = self.redis() with conn as r: - # Creating a client with a given index name - client = Client('idx', port=conn.port) - client.redis.flushdb() + if not check_version_2(r): - client.create_index((TextField('txt'),)) - client.add_document('doc1', txt = 'fooz barz') - client.aliasadd('myalias') + # Creating a client with one index + index1 = Client('testAlias', port=conn.port) + index1.redis.flushdb() + + index1.create_index((TextField('txt'),)) + index1.add_document('doc1', txt = 'text goes here') + + index2 = Client('testAlias2', port=conn.port) + index2.create_index((TextField('txt'),)) + index2.add_document('doc2', txt = 'text goes here') + + + # add the actual alias and check + index1.aliasadd('myalias') + alias_client = Client('myalias', port=conn.port) + res = alias_client.search('*').docs[0] + self.assertEqual('doc1', res.id) + + # We should throw an exception when trying to add an alias that already exists + with self.assertRaises(Exception) as context: + index2.aliasadd('myalias') + self.assertEqual('Alias already exists', str(context.exception)) + + # update the alias and ensure we get doc2 + index2.aliasupdate('myalias') + alias_client2 = Client('myalias', port=conn.port) + res = alias_client2.search('*').docs[0] + self.assertEqual('doc2', res.id) - alias_client = Client('myalias', port=conn.port) - res = alias_client.search('*').docs[0] - self.assertEqual('doc1', res.id) + # delete the alias and expect an error if we try to query again + index2.aliasdel('myalias') + with self.assertRaises(Exception) as context: + alias_client2.search('*').docs[0] + self.assertEqual('myalias: no such index', str(context.exception)) def testTags(self): conn = self.redis() From a438808b11465fa9b9b98bf0592091a154494bef Mon Sep 17 00:00:00 2001 From: Chris Mague Date: Mon, 19 Oct 2020 13:20:06 -0700 Subject: [PATCH 3/3] search 2.0 handles aliases differently --- test/test.py | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/test/test.py b/test/test.py index faae306..feefe44 100644 --- a/test/test.py +++ b/test/test.py @@ -567,7 +567,49 @@ def testSummarize(self): def testAlias(self): conn = self.redis() with conn as r: - if not check_version_2(r): + if check_version_2(r): + + index1 = Client('testAlias', port=conn.port) + index1.redis.flushdb() + index2 = Client('testAlias2', port=conn.port) + + index1.redis.hset("index1:lonestar", mapping = {'name': 'lonestar'}) + index2.redis.hset("index2:yogurt", mapping = {'name': 'yogurt'}) + + time.sleep(2) + + def1 =IndexDefinition(prefix=['index1:'],score_field='name') + def2 =IndexDefinition(prefix=['index2:'],score_field='name') + + index1.create_index((TextField('name'),),definition=def1) + index2.create_index((TextField('name'),),definition=def2) + + res = index1.search('*').docs[0] + self.assertEqual('index1:lonestar', res.id) + + # create alias and check for results + index1.aliasadd("spaceballs") + alias_client = Client('spaceballs', port=conn.port) + res = alias_client.search('*').docs[0] + self.assertEqual('index1:lonestar', res.id) + + # We should throw an exception when trying to add an alias that already exists + with self.assertRaises(Exception) as context: + index2.aliasadd('spaceballs') + self.assertEqual('Alias already exists', str(context.exception)) + + #update alias and ensure new results + index2.aliasupdate("spaceballs") + alias_client2 = Client('spaceballs', port=conn.port) + res = alias_client2.search('*').docs[0] + self.assertEqual('index2:yogurt', res.id) + + index2.aliasdel("spaceballs") + with self.assertRaises(Exception) as context: + alias_client2.search('*').docs[0] + self.assertEqual('spaceballs: no such index', str(context.exception)) + + else: # Creating a client with one index index1 = Client('testAlias', port=conn.port)