def test_update_a_search_index_with_analyzer(self): """ Test that updating a search analyzer updates the contents of the correct search index object in the DesignDocument dictionary. """ ddoc = DesignDocument(self.db, '_design/ddoc001') ddoc.add_search_index('search001', 'not-a-valid-search-index', 'email') self.assertEqual( ddoc.get('indexes')['search001'], {'index': 'not-a-valid-search-index', 'analyzer': 'email'} ) ddoc.update_search_index( 'search001', 'function (doc) {\n index("default", doc._id); ' 'if (doc._id) {index("name", doc.name, {"store": true}); }\n}', 'simple' ) self.assertEqual( ddoc.get('indexes')['search001'], {'index': 'function (doc) {\n index("default", doc._id); ' 'if (doc._id) {index("name", doc.name, ' '{"store": true}); }\n}', 'analyzer': 'simple' } )
def test_search_index_save_fails_with_existing_text_index(self): """ Tests that save fails when language is query and both a search index and a text index exist in the design document. """ ddoc = DesignDocument(self.db, '_design/ddoc001') ddoc['language'] = 'query' ddoc['indexes']['index001'] = { 'index': {'index_array_lengths': True, 'fields': [{'name': 'name', 'type': 'string'}, {'name': 'age', 'type': 'number'}], 'default_field': {'enabled': True, 'analyzer': 'german'}, 'default_analyzer': 'keyword', 'selector': {}}, 'analyzer': {'name': 'perfield','default': 'keyword', 'fields': {'$default': 'german'}}} ddoc.save() self.assertTrue(ddoc['_rev'].startswith('1-')) search_index = ('function (doc) {\n index("default", doc._id); ' 'if (doc._id) {index("name", doc.name, ' '{"store": true}); }\n}') ddoc.add_search_index('search001', search_index) self.assertIsInstance( ddoc['indexes']['search001']['index'], str ) with self.assertRaises(CloudantException) as cm: ddoc.save() err = cm.exception self.assertEqual( str(err), 'Definition for query text index search001 must be of type dict.' )
def test_search_index_save_succeeds(self): """ Tests that save succeeds when no language is specified for search indexes. """ ddoc = DesignDocument(self.db, '_design/ddoc001') search_index = ('function (doc) {\n index("default", doc._id); ' 'if (doc._id) {index("name", doc.name, ' '{"store": true}); }\n}') ddoc.add_search_index('search001', search_index) ddoc.save() self.assertTrue(ddoc['_rev'].startswith('1-'))
def test_get_search_index(self): """ Test retrieval of a search index from the DesignDocument. """ ddoc = DesignDocument(self.db, '_design/ddoc001') index = ('function (doc) {\n index("default", doc._id); ' 'if (doc._id) {index("name", doc.name, ' '{"store": true}); }\n}') ddoc.add_search_index('search001', index) ddoc.add_search_index('search002', index) ddoc.add_search_index('search003', index) self.assertEqual( ddoc.get_index('search002'), {'index': 'function (doc) {\n index("default", doc._id); ' 'if (doc._id) {index("name", doc.name, ' '{"store": true}); }\n}'} )
def test_iterating_over_search_indexes(self): """ Test iterating over search indexes within the DesignDocument. """ ddoc = DesignDocument(self.db, '_design/ddoc001') search_index = ('function (doc) {\n index("default", doc._id); ' 'if (doc._id) {index("name", doc.name, ' '{"store": true}); }\n}') ddoc.add_search_index('search001', search_index) ddoc.add_search_index('search002', search_index) ddoc.add_search_index('search003', search_index) search_index_names = [] for search_index_name, search_index in ddoc.iterindexes(): search_index_names.append(search_index_name) self.assertTrue( all(x in search_index_names for x in ['search001', 'search002', 'search003']) )
def test_add_a_search_index(self): """ Test that adding a search index adds a search index object to the DesignDocument dictionary. """ ddoc = DesignDocument(self.db, '_design/ddoc001') self.assertEqual(ddoc.get('indexes'), {}) ddoc.add_search_index( 'search001', 'function (doc) {\n index("default", doc._id); ' 'if (doc._id) {index("name", doc.name, {"store": true}); }\n}' ) self.assertListEqual(list(ddoc.get('indexes').keys()), ['search001']) self.assertEqual( ddoc.get('indexes')['search001'], {'index': 'function (doc) {\n index("default", doc._id); ' 'if (doc._id) {index("name", doc.name, {"store": true}); }\n}'} )
def test_list_search_indexes(self): """ Test the retrieval of search index name list from DesignDocument. """ ddoc = DesignDocument(self.db, '_design/ddoc001') index = 'function (doc) {\n index("default", doc._id); ' 'if (doc._id) {index("name", doc.name, ' '{"store": true}); }\n}' ddoc.add_search_index('search001', index) ddoc.add_search_index('search002', index) ddoc.add_search_index('search003', index) self.assertTrue( all(x in ddoc.list_indexes() for x in [ 'search001', 'search002', 'search003' ]) )
def test_delete_a_search_index(self): """ Test deleting a search index from the DesignDocument dictionary. """ ddoc = DesignDocument(self.db, '_design/ddoc001') ddoc.add_search_index( 'search001', 'function (doc) {\n index("default", doc._id); ' 'if (doc._id) {index("name", doc.name, ' '{"store": true}); }\n}' ) self.assertEqual( ddoc.get('indexes')['search001'], {'index': 'function (doc) {\n index("default", doc._id); ' 'if (doc._id) {index("name", doc.name, ' '{"store": true}); }\n}'} ) ddoc.delete_index('search001') self.assertEqual(ddoc.get('indexes'), {})
def test_partitioned_search(self): ddoc = DesignDocument(self.db, 'partitioned_search', partitioned=True) ddoc.add_search_index( 'search1', 'function(doc) { index("id", doc._id, {"store": true}); }') ddoc.save() for partition_key in self.populate_db_with_partitioned_documents( 2, 10): results = self.db.get_partitioned_search_result(partition_key, ddoc['_id'], 'search1', query='*:*') i = 0 for result in results['rows']: print(result) self.assertTrue(result['id'].startswith(partition_key + ':')) i += 1 self.assertEquals(i, 10)
def test_fetch_search_index(self): """ Ensure that the document fetch from the database returns the DesignDocument format as expected when retrieving a design document containing search indexes. """ ddoc = DesignDocument(self.db, '_design/ddoc001') search_index = ('function (doc) {\n index("default", doc._id); ' 'if (doc._id) {index("name", doc.name, ' '{"store": true}); }\n} ') ddoc.add_search_index('search001', search_index) ddoc.add_search_index('search002', search_index, 'simple') ddoc.add_search_index('search003', search_index, 'standard') ddoc.save() ddoc_remote = DesignDocument(self.db, '_design/ddoc001') self.assertNotEqual(ddoc_remote, ddoc) ddoc_remote.fetch() self.assertEqual(ddoc_remote, ddoc) self.assertTrue(ddoc_remote['_rev'].startswith('1-')) self.assertEqual(ddoc_remote, { '_id': '_design/ddoc001', '_rev': ddoc['_rev'], 'indexes': { 'search001': {'index': search_index}, 'search002': {'index': search_index, 'analyzer': 'simple'}, 'search003': {'index': search_index, 'analyzer': 'standard'} }, 'views': {} })
def create_moviedb_indexes(): ddoc_fn = ''' function(doc){ index("default", doc._id); if (doc.name){ index("name", doc.name, {"store": true}); } } ''' db = cloudant_client[CL_MOVIEDB] index_name = 'movie-search-index' ddoc = DesignDocument(db, index_name) if ddoc.exists(): ddoc.fetch() ddoc.update_search_index(index_name, ddoc_fn, analyzer=None) print('updated', index_name) else: ddoc.add_search_index(index_name, ddoc_fn, analyzer=None) print('created', index_name) ddoc.save()
def test_adding_existing_search_index(self): """ Test that adding an existing search index fails as expected. """ ddoc = DesignDocument(self.db, '_design/ddoc001') ddoc.add_search_index( 'search001', 'function (doc) {\n index("default", doc._id); ' 'if (doc._id) {index("name", doc.name, {"store": true}); }\n}', ) with self.assertRaises(CloudantArgumentError) as cm: ddoc.add_search_index( 'search001', 'function (doc) {\n index("default", doc._id); ' 'if (doc._id) {index("name", doc.name, ' '{"store": true}); }\n}' ) err = cm.exception self.assertEqual( str(err), 'An index with name search001 already exists in this design doc' )
def test_add_a_search_index_with_analyzer(self): """ Test that adding a search index with an analyzer adds a search index object to the DesignDocument dictionary. """ ddoc = DesignDocument(self.db, '_design/ddoc001') self.assertEqual(ddoc.get('indexes'), {}) ddoc.add_search_index( 'search001', 'function (doc) {\n index("default", doc._id); ' 'if (doc._id) {index("name", doc.name, {"store": true}); }\n}', {'name': 'perfield', 'default': 'english', 'fields': { 'spanish': 'spanish'}} ) self.assertListEqual(list(ddoc.get('indexes').keys()), ['search001']) self.assertEqual( ddoc.get('indexes')['search001'], {'index': 'function (doc) {\n index("default", doc._id); ' 'if (doc._id) {index("name", doc.name, {"store": true}); }\n}', 'analyzer': {"name": "perfield", "default": "english", "fields": {"spanish": "spanish"}}} )