1# -*- coding: utf-8 -*- 2 3import unittest 4from includes import * 5from common import getConnectionByEnv, waitForIndex, sortedResults, toSortedFlatList, skipOnExistingEnv 6from time import sleep 7from RLTest import Env 8import math 9 10def testCompression(env): 11 accuracy = 0.000001 12 repeat = int(math.sqrt(1 / accuracy)) 13 14 conn = getConnectionByEnv(env) 15 pl = conn.pipeline() 16 env.cmd('ft.create', 'idx', 'SCHEMA', 'n', 'numeric') 17 for i in range(repeat): 18 value = accuracy * i 19 pl.execute_command('hset', i, 'n', str(value)) 20 if (i % 999) is 0: 21 pl.execute() 22 pl.execute() 23 24 for i in range(repeat): 25 value = accuracy * i 26 env.expect('ft.search', 'idx', ('@n:[%s %s]' % (value, value))).equal([1L, str(i), ['n', str(value)]]) 27 28def testSanity(env): 29 env.skipOnCluster() 30 skipOnExistingEnv(env) 31 repeat = 100000 32 conn = getConnectionByEnv(env) 33 env.cmd('ft.create', 'idx', 'SCHEMA', 'n', 'numeric') 34 for i in range(repeat): 35 conn.execute_command('hset', i, 'n', i % 100) 36 env.expect('ft.search', 'idx', ('@n:[0 %d]' % (repeat)), 'limit', 0 ,0).equal([repeat]) 37 env.expect('FT.DEBUG', 'numidx_summary', 'idx', 'n') \ 38 .equal(['numRanges', 12L, 'numEntries', 100000L, 'lastDocId', 100000L, 'revisionId', 11L]) 39 40def testCompressionConfig(env): 41 env.skipOnCluster() 42 conn = getConnectionByEnv(env) 43 env.cmd('ft.create', 'idx', 'SCHEMA', 'n', 'numeric') 44 45 # w/o compression. exact number match. 46 env.expect('ft.config', 'set', '_NUMERIC_COMPRESS', 'false').equal('OK') 47 for i in range(100): 48 env.execute_command('hset', i, 'n', str(1 + i / 100.0)) 49 for i in range(100): 50 num = str(1 + i / 100.0) 51 env.expect('ft.search', 'idx', '@n:[%s %s]' % (num, num)).equal([1L, str(i), ['n', num]]) 52 53 # with compression. no exact number match. 54 env.expect('ft.config', 'set', '_NUMERIC_COMPRESS', 'true').equal('OK') 55 for i in range(100): 56 env.execute_command('hset', i, 'n', str(1 + i / 100.0)) 57 58 # delete keys where compression does not change value 59 env.execute_command('del', '0') 60 env.execute_command('del', '25') 61 env.execute_command('del', '50') 62 env.execute_command('del', '75') 63 64 for i in range(100): 65 num = str(1 + i / 100.0) 66 env.expect('ft.search', 'idx', '@n:[%s %s]' % (num, num)).equal([0L]) 67 68def testRangeParentsConfig(env): 69 env.skipOnCluster() 70 elements = 1000 71 conn = getConnectionByEnv(env) 72 73 concurrent = env.cmd('ft.config', 'get', 'CONCURRENT_WRITE_MODE') 74 if str(concurrent[0][1]) == 'true': 75 env.skip() 76 77 result = [['numRanges', 6L], ['numRanges', 8L]] 78 for test in range(2): 79 # check number of ranges 80 env.cmd('ft.create', 'idx0', 'SCHEMA', 'n', 'numeric') 81 for i in range(elements): 82 env.execute_command('hset', i, 'n', i) 83 actual_res = env.cmd('FT.DEBUG', 'numidx_summary', 'idx0', 'n') 84 env.assertEqual(actual_res[0:2], result[test]) 85 86 # reset with old ranges parents param 87 env.cmd('ft.drop', 'idx0') 88 env.expect('ft.config', 'set', '_NUMERIC_RANGES_PARENTS', '2').equal('OK') 89 90 # reset back 91 env.expect('ft.config', 'set', '_NUMERIC_RANGES_PARENTS', '0').equal('OK')