|
| 1 | +# -*- coding: utf-8 -*- |
| 2 | +import os, platform |
| 3 | +if platform.python_version() < '2.7': |
| 4 | + unittest = __import__('unittest2') |
| 5 | +else: |
| 6 | + import unittest |
| 7 | + |
| 8 | +from riak.riak_index_entry import RiakIndexEntry |
| 9 | + |
| 10 | +SKIP_INDEXES = int(os.environ.get('SKIP_INDEXES', '0')) |
| 11 | + |
| 12 | +class TwoITests(object): |
| 13 | + def is_2i_supported(self): |
| 14 | + # Immediate test to see if 2i is even supported w/ the backend |
| 15 | + try: |
| 16 | + self.client.index('foo', 'bar_bin', 'baz').run() |
| 17 | + return True |
| 18 | + except Exception as e: |
| 19 | + if "indexes_not_supported" in str(e): |
| 20 | + return False |
| 21 | + return True # it failed, but is supported! |
| 22 | + |
| 23 | + @unittest.skipIf(SKIP_INDEXES, 'SKIP_INDEXES is defined') |
| 24 | + def test_secondary_index_store(self): |
| 25 | + if not self.is_2i_supported(): |
| 26 | + return True |
| 27 | + |
| 28 | + # Create a new object with indexes... |
| 29 | + bucket = self.client.bucket('indexbucket') |
| 30 | + rand = self.randint() |
| 31 | + obj = bucket.new('mykey1', rand) |
| 32 | + obj.add_index('field1_bin', 'val1a') |
| 33 | + obj.add_index('field1_int', 1011) |
| 34 | + obj.store() |
| 35 | + |
| 36 | + # Retrieve the object, check that the correct indexes exist... |
| 37 | + obj = bucket.get('mykey1') |
| 38 | + self.assertEqual(['val1a'], sorted(obj.get_indexes('field1_bin'))) |
| 39 | + self.assertEqual(['1011'], sorted(obj.get_indexes('field1_int'))) |
| 40 | + |
| 41 | + # Add more indexes and save... |
| 42 | + obj.add_index('field1_bin', 'val1b') |
| 43 | + obj.add_index('field1_int', 1012) |
| 44 | + obj.store() |
| 45 | + |
| 46 | + # Retrieve the object, check that the correct indexes exist... |
| 47 | + obj = bucket.get('mykey1') |
| 48 | + self.assertEqual(['val1a', 'val1b'], |
| 49 | + sorted(obj.get_indexes('field1_bin'))) |
| 50 | + self.assertEqual(['1011', '1012'], |
| 51 | + sorted(obj.get_indexes('field1_int'))) |
| 52 | + |
| 53 | + # Check the get_indexes() function... |
| 54 | + self.assertEqual([ |
| 55 | + RiakIndexEntry('field1_bin', 'val1a'), |
| 56 | + RiakIndexEntry('field1_bin', 'val1b'), |
| 57 | + RiakIndexEntry('field1_int', 1011), |
| 58 | + RiakIndexEntry('field1_int', 1012) |
| 59 | + ], sorted(obj.get_indexes())) |
| 60 | + |
| 61 | + # Delete an index... |
| 62 | + obj.remove_index('field1_bin', 'val1a') |
| 63 | + obj.remove_index('field1_int', 1011) |
| 64 | + obj.store() |
| 65 | + |
| 66 | + # Retrieve the object, check that the correct indexes exist... |
| 67 | + obj = bucket.get('mykey1') |
| 68 | + self.assertEqual(['val1b'], sorted(obj.get_indexes('field1_bin'))) |
| 69 | + self.assertEqual(['1012'], sorted(obj.get_indexes('field1_int'))) |
| 70 | + |
| 71 | + # Check duplicate entries... |
| 72 | + obj.add_index('field1_bin', 'val1a') |
| 73 | + obj.add_index('field1_bin', 'val1a') |
| 74 | + obj.add_index('field1_bin', 'val1a') |
| 75 | + obj.add_index('field1_int', 1011) |
| 76 | + obj.add_index('field1_int', 1011) |
| 77 | + obj.add_index('field1_int', 1011) |
| 78 | + |
| 79 | + self.assertEqual([ |
| 80 | + RiakIndexEntry('field1_bin', 'val1a'), |
| 81 | + RiakIndexEntry('field1_bin', 'val1b'), |
| 82 | + RiakIndexEntry('field1_int', 1011), |
| 83 | + RiakIndexEntry('field1_int', 1012) |
| 84 | + ], sorted(obj.get_indexes())) |
| 85 | + |
| 86 | + obj.store() |
| 87 | + obj = bucket.get('mykey1') |
| 88 | + |
| 89 | + self.assertEqual([ |
| 90 | + RiakIndexEntry('field1_bin', 'val1a'), |
| 91 | + RiakIndexEntry('field1_bin', 'val1b'), |
| 92 | + RiakIndexEntry('field1_int', 1011), |
| 93 | + RiakIndexEntry('field1_int', 1012) |
| 94 | + ], sorted(obj.get_indexes())) |
| 95 | + |
| 96 | + # Clean up... |
| 97 | + bucket.get('mykey1').delete() |
| 98 | + |
| 99 | + @unittest.skipIf(SKIP_INDEXES, 'SKIP_INDEXES is defined') |
| 100 | + def test_set_indexes(self): |
| 101 | + if not self.is_2i_supported(): |
| 102 | + return True |
| 103 | + |
| 104 | + bucket = self.client.bucket('indexbucket') |
| 105 | + foo = bucket.new('foo', 1) |
| 106 | + foo.set_indexes((('field1_bin', 'test'), ('field2_int', 1337))).store() |
| 107 | + result = self.client.index('indexbucket', 'field2_int', 1337).run() |
| 108 | + self.assertEqual(1, len(result)) |
| 109 | + self.assertEqual('foo', result[0].get_key()) |
| 110 | + |
| 111 | + result = bucket.get_index('field1_bin', 'test') |
| 112 | + self.assertEqual(1, len(result)) |
| 113 | + self.assertEqual('foo', str(result[0])) |
| 114 | + |
| 115 | + @unittest.skipIf(SKIP_INDEXES, 'SKIP_INDEXES is defined') |
| 116 | + def test_remove_indexes(self): |
| 117 | + if not self.is_2i_supported(): |
| 118 | + return True |
| 119 | + |
| 120 | + bucket = self.client.bucket('indexbucket') |
| 121 | + bar = bucket.new('bar', 1).add_index('bar_int', 1)\ |
| 122 | + .add_index('bar_int', 2).add_index('baz_bin', 'baz').store() |
| 123 | + result = bucket.get_index('bar_int', 1) |
| 124 | + self.assertEqual(1, len(result)) |
| 125 | + self.assertEqual(3, len(bar.get_indexes())) |
| 126 | + self.assertEqual(2, len(bar.get_indexes('bar_int'))) |
| 127 | + |
| 128 | + # remove all indexes |
| 129 | + bar = bar.remove_indexes().store() |
| 130 | + result = bucket.get_index('bar_int', 1) |
| 131 | + self.assertEqual(0, len(result)) |
| 132 | + result = bucket.get_index('baz_bin', 'baz') |
| 133 | + self.assertEqual(0, len(result)) |
| 134 | + self.assertEqual(0, len(bar.get_indexes())) |
| 135 | + self.assertEqual(0, len(bar.get_indexes('bar_int'))) |
| 136 | + self.assertEqual(0, len(bar.get_indexes('baz_bin'))) |
| 137 | + |
| 138 | + # add index again |
| 139 | + bar = bar.add_index('bar_int', 1).add_index('bar_int', 2)\ |
| 140 | + .add_index('baz_bin', 'baz').store() |
| 141 | + # remove all index with field='bar_int' |
| 142 | + bar = bar.remove_index(field='bar_int').store() |
| 143 | + result = bucket.get_index('bar_int', 1) |
| 144 | + self.assertEqual(0, len(result)) |
| 145 | + result = bucket.get_index('bar_int', 2) |
| 146 | + self.assertEqual(0, len(result)) |
| 147 | + result = bucket.get_index('baz_bin', 'baz') |
| 148 | + self.assertEqual(1, len(result)) |
| 149 | + self.assertEqual(1, len(bar.get_indexes())) |
| 150 | + self.assertEqual(0, len(bar.get_indexes('bar_int'))) |
| 151 | + self.assertEqual(1, len(bar.get_indexes('baz_bin'))) |
| 152 | + |
| 153 | + # add index again |
| 154 | + bar = bar.add_index('bar_int', 1).add_index('bar_int', 2)\ |
| 155 | + .add_index('baz_bin', 'baz').store() |
| 156 | + # remove an index field value pair |
| 157 | + bar = bar.remove_index(field='bar_int', value=2).store() |
| 158 | + result = bucket.get_index('bar_int', 1) |
| 159 | + self.assertEqual(1, len(result)) |
| 160 | + result = bucket.get_index('bar_int', 2) |
| 161 | + self.assertEqual(0, len(result)) |
| 162 | + result = bucket.get_index('baz_bin', 'baz') |
| 163 | + self.assertEqual(1, len(result)) |
| 164 | + self.assertEqual(2, len(bar.get_indexes())) |
| 165 | + self.assertEqual(1, len(bar.get_indexes('bar_int'))) |
| 166 | + self.assertEqual(1, len(bar.get_indexes('baz_bin'))) |
| 167 | + |
| 168 | + @unittest.skipIf(SKIP_INDEXES, 'SKIP_INDEXES is defined') |
| 169 | + def test_secondary_index_query(self): |
| 170 | + if not self.is_2i_supported(): |
| 171 | + return True |
| 172 | + |
| 173 | + bucket = self.client.bucket('indexbucket') |
| 174 | + |
| 175 | + bucket.\ |
| 176 | + new('mykey1', 'data1').\ |
| 177 | + add_index('field1_bin', 'val1').\ |
| 178 | + add_index('field2_int', 1001).\ |
| 179 | + store() |
| 180 | + bucket.\ |
| 181 | + new('mykey2', 'data1').\ |
| 182 | + add_index('field1_bin', 'val2').\ |
| 183 | + add_index('field2_int', 1002).\ |
| 184 | + store() |
| 185 | + bucket.\ |
| 186 | + new('mykey3', 'data1').\ |
| 187 | + add_index('field1_bin', 'val3').\ |
| 188 | + add_index('field2_int', 1003).\ |
| 189 | + store() |
| 190 | + bucket.\ |
| 191 | + new('mykey4', 'data1').\ |
| 192 | + add_index('field1_bin', 'val4').\ |
| 193 | + add_index('field2_int', 1004).\ |
| 194 | + store() |
| 195 | + |
| 196 | + # Test an equality query... |
| 197 | + results = bucket.get_index('field1_bin', 'val2') |
| 198 | + self.assertEquals(1, len(results)) |
| 199 | + self.assertEquals('mykey2', str(results[0])) |
| 200 | + |
| 201 | + # Test a range query... |
| 202 | + results = bucket.get_index('field1_bin', 'val2', 'val4') |
| 203 | + vals = set([str(key) for key in results]) |
| 204 | + self.assertEquals(3, len(results)) |
| 205 | + self.assertEquals(set(['mykey2', 'mykey3', 'mykey4']), vals) |
| 206 | + |
| 207 | + # Test an equality query... |
| 208 | + results = bucket.get_index('field2_int', 1002) |
| 209 | + self.assertEquals(1, len(results)) |
| 210 | + self.assertEquals('mykey2', str(results[0])) |
| 211 | + |
| 212 | + # Test a range query... |
| 213 | + results = bucket.get_index('field2_int', 1002, 1004) |
| 214 | + vals = set([str(key) for key in results]) |
| 215 | + self.assertEquals(3, len(results)) |
| 216 | + self.assertEquals(set(['mykey2', 'mykey3', 'mykey4']), vals) |
| 217 | + |
| 218 | + # Clean up... |
| 219 | + bucket.get('mykey1').delete() |
| 220 | + bucket.get('mykey2').delete() |
| 221 | + bucket.get('mykey3').delete() |
| 222 | + bucket.get('mykey4').delete() |
0 commit comments