1import unittest 2from includes import * 3from common import toSortedFlatList 4 5 6def testBasicPoneticCase(env): 7 env.assertOk(env.cmd('ft.create', 'idx', 'ON', 'HASH', 8 'schema', 'text', 'TEXT', 'PHONETIC', 'dm:en', 'SORTABLE')) 9 env.assertOk(env.cmd('ft.add', 'idx', 'doc1', 1.0, 'fields', 10 'text', 'morfix')) 11 12 env.assertEquals(env.cmd('ft.search', 'idx', 'morphix'), [1L, 'doc1', ['text', 'morfix']]) 13 env.assertEquals(env.cmd('ft.search', 'idx', '@text:morphix'), [1L, 'doc1', ['text', 'morfix']]) 14 env.assertEquals(env.cmd('ft.search', 'idx', '@text:morphix=>{$phonetic:true}'), [1L, 'doc1', ['text', 'morfix']]) 15 env.assertEquals(env.cmd('ft.search', 'idx', '@text:morphix=>{$phonetic:false}'), [0L]) 16 17def testBasicPoneticWrongDeclaration(env): 18 with env.assertResponseError(): 19 env.cmd('ft.create', 'idx', 'ON', 'HASH', 20 'schema', 'text', 'TEXT', 'PHONETIC', 'something', 'SORTABLE') 21 with env.assertResponseError(): 22 env.cmd('ft.create', 'idx', 'ON', 'HASH', 23 'schema', 'text', 'TEXT', 'PHONETIC', 'kk:tt', 'SORTABLE') 24 with env.assertResponseError(): 25 env.cmd('ft.create', 'idx', 'ON', 'HASH', 26 'schema', 'text', 'TEXT', 'PHONETIC', 'dm:tt', 'SORTABLE') 27 with env.assertResponseError(): 28 env.cmd('ft.create', 'idx', 'ON', 'HASH', 29 'schema', 'text', 'TEXT', 'PHONETIC', 'll:en', 'SORTABLE') 30 31def testPoneticOnNonePhoneticField(env): 32 env.assertOk(env.cmd('ft.create', 'idx', 'ON', 'HASH', 33 'schema', 'text', 'TEXT', 'PHONETIC', 'dm:en', 'SORTABLE', 'text1', 'TEXT', 'SORTABLE')) 34 env.assertOk(env.cmd('ft.add', 'idx', 'doc1', 1.0, 'fields', 35 'text', 'morfix', 36 'text1', 'phonetic')) 37 38 env.assertEquals(toSortedFlatList(env.cmd('ft.search', 'idx', 'morphix')), toSortedFlatList([1L, 'doc1', ['text', 'morfix', 'text1', 'phonetic']])) 39 env.assertEquals(toSortedFlatList(env.cmd('ft.search', 'idx', '@text:morphix')), toSortedFlatList([1L, 'doc1', ['text', 'morfix', 'text1', 'phonetic']])) 40 env.assertEquals(toSortedFlatList(env.cmd('ft.search', 'idx', 'phonetic')), toSortedFlatList([1L, 'doc1', ['text', 'morfix', 'text1', 'phonetic']])) 41 env.assertEquals(env.cmd('ft.search', 'idx', 'fonetic'), [0L]) 42 env.assertEquals(env.cmd('ft.search', 'idx', '@text1:morphix'), [0L]) 43 with env.assertResponseError(): 44 env.cmd('ft.search', 'idx', '@text1:morphix=>{$phonetic:true}') 45 with env.assertResponseError(): 46 env.cmd('ft.search', 'idx', '@text1:morphix=>{$phonetic:false}') 47 48def testPoneticWithAggregation(env): 49 env.assertOk(env.cmd('ft.create', 'idx', 'ON', 'HASH', 50 'schema', 'text', 'TEXT', 'PHONETIC', 'dm:en', 'SORTABLE', 'text1', 'TEXT', 'SORTABLE')) 51 env.assertOk(env.cmd('ft.add', 'idx', 'doc1', 1.0, 'fields', 52 'text', 'morfix', 53 'text1', 'phonetic')) 54 55 env.assertEquals(env.cmd('ft.aggregate', 'idx', 'morphix', 'LOAD', 2, '@text', '@text1'), [1L, ['text', 'morfix', 'text1', 'phonetic']]) 56 env.assertEquals(env.cmd('ft.aggregate', 'idx', '@text:morphix', 'LOAD', 2, '@text', '@text1'), [1L, ['text', 'morfix', 'text1', 'phonetic']]) 57 env.assertEquals(env.cmd('ft.aggregate', 'idx', 'phonetic', 'LOAD', 2, '@text', '@text1'), [1L, ['text', 'morfix', 'text1', 'phonetic']]) 58 env.assertEquals(env.cmd('ft.aggregate', 'idx', '@text1:morphix', 'LOAD', 2, '@text', '@text1'), [0L]) 59 if not env.is_cluster(): 60 with env.assertResponseError(): 61 env.cmd('ft.aggregate', 'idx', '@text1:morphix=>{$phonetic:true}') 62 with env.assertResponseError(): 63 env.cmd('ft.aggregate', 'idx', '@text1:morphix=>{$phonetic:false}') 64 else: 65 raise unittest.SkipTest("FIXME: Aggregation error propagation broken on cluster mode") 66 67def testPoneticWithSchemaAlter(env): 68 #remove support 2.0 69 env.skip() 70 env.assertOk(env.cmd('ft.create', 'idx', 'ON', 'HASH', 71 'schema', 'text', 'TEXT', 'PHONETIC', 'dm:en', 'SORTABLE', 'text1', 'TEXT', 'SORTABLE')) 72 env.assertOk(env.cmd('ft.alter', 'idx', 'SCHEMA', 'ADD', 'text2', 'TEXT', 'PHONETIC', 'dm:en')) 73 74 env.assertOk(env.cmd('ft.add', 'idx', 'doc1', 1.0, 'fields', 75 'text', 'morfix', 76 'text1', 'check', 77 'text2', 'phonetic')) 78 79 env.assertEquals(env.cmd('ft.search', 'idx', 'fonetic'), [1L, 'doc1', ['text', 'morfix', 'text1', 'check', 'text2', 'phonetic']]) 80 env.assertEquals(env.cmd('ft.search', 'idx', '@text2:fonetic'), [1L, 'doc1', ['text', 'morfix', 'text1', 'check', 'text2', 'phonetic']]) 81 env.assertEquals(env.cmd('ft.search', 'idx', '@text1:fonetic'), [0L]) 82 env.assertEquals(env.cmd('ft.search', 'idx', '@text2:fonetic=>{$phonetic:false}'), [0L]) 83 env.assertEquals(env.cmd('ft.search', 'idx', '@text2:fonetic=>{$phonetic:true}'), [1L, 'doc1', ['text', 'morfix', 'text1', 'check', 'text2', 'phonetic']]) 84 85def testPoneticWithSmallTerm(env): 86 env.assertOk(env.cmd('ft.create', 'complainants', 'ON', 'HASH', 87 'SCHEMA', 'name', 'text', 'PHONETIC', 'dm:en', 'almamater', 'text', 'PHONETIC', 'dm:en')) 88 89 env.assertOk(env.cmd('ft.add', 'complainants', 'foo64', 1.0, 'FIELDS', 'name', 'jon smith', 'almamater', 'Trent')) 90 env.assertOk(env.cmd('ft.add', 'complainants', 'foo65', 1.0, 'FIELDS', 'name', 'john jones', 'almamater', 'Toronto')) 91 92 res = env.cmd('ft.search', 'complainants', '@name:(john=>{$phonetic:true})') 93 env.assertEqual(toSortedFlatList(res), toSortedFlatList([2L, 'foo64', ['name', 'jon smith', 'almamater', 'Trent'], 'foo65', ['name', 'john jones', 'almamater', 'Toronto']])) 94 95def testPoneticOnNumbers(env): 96 env.assertOk(env.cmd('ft.create', 'idx', 'ON', 'HASH', 97 'SCHEMA', 'test', 'TEXT', 'PHONETIC', 'dm:en')) 98 env.assertOk(env.cmd('ft.add', 'idx', 'doc1', 1.0, 'FIELDS', 'test', 'this is 2015 test')) 99 env.assertOk(env.cmd('ft.add', 'idx', 'doc2', 1.0, 'FIELDS', 'test', 'this is 04 test')) 100 res = env.cmd('ft.search', 'idx', '04') 101 env.assertEqual(res, [1L, 'doc2', ['test', 'this is 04 test']]) 102 103def testIssue1313(env): 104 env.expect('FT.CREATE test ON HASH SCHEMA topic2 TEXT NOINDEX topic TEXT PHONETIC dm:en').ok() 105 env.expect('FT.SEARCH', 'test', '@topic:(tmp)=>{$phonetic:true}').equal([0]) 106 107 env.expect('FT.CREATE test1 ON HASH SCHEMA topic TEXT PHONETIC dm:en topic2 TEXT NOINDEX').ok() 108 env.expect('FT.SEARCH', 'test1', '@topic:(tmp)=>{$phonetic: true}').equal([0]) 109