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')