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