Skip to content

Commit eca0e48

Browse files
committed
Change select with empty key semantics
If iterator type isn't given and key is empty, then select everything from space (even on HASH index) closes gh-76
1 parent 273f6f0 commit eca0e48

File tree

2 files changed

+48
-9
lines changed

2 files changed

+48
-9
lines changed

tarantool/connection.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@
4545
REQUEST_TYPE_OK,
4646
REQUEST_TYPE_ERROR,
4747
IPROTO_GREETING_SIZE,
48-
ENCODING_DEFAULT)
48+
ENCODING_DEFAULT,
49+
ITERATOR_EQ,
50+
ITERATOR_ALL)
4951

5052
from tarantool.error import (
5153
NetworkError,
@@ -667,7 +669,13 @@ def select(self, space_name, key=None, **kwargs):
667669
offset = kwargs.get("offset", 0)
668670
limit = kwargs.get("limit", 0xffffffff)
669671
index_name = kwargs.get("index", 0)
670-
iterator_type = kwargs.get("iterator", 0)
672+
iterator_type = kwargs.get("iterator")
673+
674+
if iterator_type == None and \
675+
(key == None or (isinstance(key, (list, tuple)) and len(key) == 0)):
676+
iterator_type = ITERATOR_ALL
677+
else:
678+
iterator_type = ITERATOR_EQ
671679

672680
# Perform smart type checking (scalar / list of scalars / list of
673681
# tuples)

tests/suites/test_dml.py

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import yaml
55
import unittest
66
import tarantool
7+
78
from .lib.tarantool_server import TarantoolServer
89

910
class TestSuite_Request(unittest.TestCase):
@@ -17,15 +18,36 @@ def setUpClass(self):
1718
self.con = tarantool.Connection('localhost', self.srv.args['primary'])
1819
self.adm = self.srv.admin
1920
self.space_created = self.adm("box.schema.create_space('space_1')")
20-
self.adm("box.space['space_1']:create_index('primary', {type = 'tree', parts = {1, 'num'}, unique = true})")
21-
self.adm("box.space['space_1']:create_index('secondary', {type = 'tree', parts = {2, 'num', 3, 'str'}, unique = false})")
21+
self.adm("""
22+
box.space['space_1']:create_index('primary', {
23+
type = 'tree',
24+
parts = {1, 'num'},
25+
unique = true})
26+
""".replace('\n', ' '))
27+
self.adm("""
28+
box.space['space_1']:create_index('secondary', {
29+
type = 'tree',
30+
parts = {2, 'num', 3, 'str'},
31+
unique = false})
32+
""".replace('\n', ' '))
33+
self.space_created = self.adm("box.schema.create_space('space_2')")
34+
self.adm("""
35+
box.space['space_2']:create_index('primary', {
36+
type = 'hash',
37+
parts = {1, 'num'},
38+
unique = true})
39+
""".replace('\n', ' '))
2240
self.adm("json = require('json')")
2341
self.adm("fiber = require('fiber')")
2442
self.adm("uuid = require('uuid')")
2543

2644
def test_00_00_authenticate(self):
27-
self.assertIsNone(self.srv.admin("box.schema.user.create('test', { password = 'test' })"))
28-
self.assertIsNone(self.srv.admin("box.schema.user.grant('test', 'execute,read,write', 'universe')"))
45+
self.assertIsNone(self.srv.admin("""
46+
box.schema.user.create('test', { password = 'test' })
47+
"""))
48+
self.assertIsNone(self.srv.admin("""
49+
box.schema.user.grant('test', 'execute,read,write', 'universe')
50+
"""))
2951
self.assertEqual(self.con.authenticate('test', 'test')._data, None)
3052

3153
def test_00_01_space_created(self):
@@ -40,9 +62,7 @@ def test_00_02_fill_space(self):
4062
[i, i%5, 'tuple_'+str(i)]
4163
)
4264
def test_00_03_answer_repr(self):
43-
repr_str = \
44-
'''- [1, 1, tuple_1]
45-
'''
65+
repr_str = """- [1, 1, tuple_1]\n"""
4666
self.assertEqual(repr(self.con.select('space_1', 1)), repr_str)
4767

4868
def test_02_select(self):
@@ -213,6 +233,17 @@ def test_10_space(self):
213233
[[400, 0, 'tuple_400']])
214234
self.assertEqual(space.delete([900]), [[900, 10, 'foo']])
215235

236+
def test_11_select_all_hash(self):
237+
space = self.con.space('space_2')
238+
cnt = 10
239+
for k in xrange(cnt):
240+
space.insert([k, 'lol'])
241+
self.assertEqual(len(space.select(())), cnt)
242+
self.assertEqual(len(space.select([])), cnt)
243+
self.assertEqual(len(space.select()), cnt)
244+
with self.assertRaises(tarantool.error.DatabaseError):
245+
space.select((), iterator=tarantool.const.ITERATOR_EQ)
246+
216247
@classmethod
217248
def tearDownClass(self):
218249
self.srv.stop()

0 commit comments

Comments
 (0)