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