Skip to content

Commit 771c70e

Browse files
committed
DevAPI: Define action on adding empty list of documents
Adding an empty list of documents is treated as no-operation and never throws any errors. This behaviour is enforced even with no connection to MySQLx Server and non-existent collections. Added tests in mysqlx_crud.
1 parent 3674266 commit 771c70e

File tree

4 files changed

+46
-7
lines changed

4 files changed

+46
-7
lines changed

lib/mysqlx/connection.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@ def __init__(self, settings):
8080
self.reader_writer = None
8181
self.protocol = None
8282

83+
def fetch_active_result(self):
84+
if self._active_result is not None:
85+
self._active_result.fetch_all()
86+
self._active_result = None
87+
8388
def connect(self):
8489
self.stream.connect(self._host, self._port)
8590
self.reader_writer = MessageReaderWriter(self.stream)

lib/mysqlx/result.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -574,14 +574,16 @@ class BaseResult(object):
574574
"""
575575
def __init__(self, connection):
576576
self._connection = connection
577-
self._protocol = self._connection.protocol
578577
self._closed = False
579578
self._rows_affected = 0
580579
self._generated_id = -1
581580
self._warnings = []
582-
if connection._active_result is not None:
583-
connection._active_result.fetch_all()
584-
connection._active_result = None
581+
582+
if connection is None:
583+
self._protocol = None
584+
else:
585+
self._protocol = connection.protocol
586+
connection.fetch_active_result()
585587

586588
def get_warnings(self):
587589
"""Returns the warnings.
@@ -608,10 +610,12 @@ class Result(BaseResult):
608610
connection (mysqlx.connection.Connection): The Connection object.
609611
ids (list): A list of IDs.
610612
"""
611-
def __init__(self, connection, ids=None):
613+
def __init__(self, connection=None, ids=None):
612614
super(Result, self).__init__(connection)
613615
self._ids = ids
614-
self._protocol.close_result(self)
616+
617+
if connection is not None:
618+
self._protocol.close_result(self)
615619

616620
def get_affected_items_count(self):
617621
"""Returns the number of affected items for the last operation.

lib/mysqlx/statement.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
from .compat import STRING_TYPES
3131
from .dbdoc import DbDoc
3232
from .protobuf import mysqlx_crud_pb2 as MySQLxCrud
33-
from .result import SqlResult
33+
from .result import SqlResult, Result
3434

3535

3636
class Statement(object):
@@ -238,6 +238,9 @@ def execute(self):
238238
Returns:
239239
mysqlx.Result: Result object.
240240
"""
241+
if len(self._values) == 0:
242+
return Result()
243+
241244
for doc in self._values:
242245
self._ids.append(doc.ensure_id())
243246

tests/test_mysqlx_crud.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,33 @@ def test_add(self):
187187
self.assertEqual(result.get_affected_items_count(), 2)
188188
self.assertEqual(5, collection.count())
189189

190+
# add an array of dictionaries (flexible params)
191+
result = collection.add([{"name": "Wilma", "age": 33},
192+
{"name": "Barney", "age": 42}]).execute()
193+
self.assertEqual(result.get_affected_items_count(), 2)
194+
self.assertEqual(7, collection.count())
195+
196+
# add empty documents
197+
session = mysqlx.get_session(self.connect_kwargs)
198+
schema = session.get_schema(self.schema_name)
199+
valid_col = schema.get_collection(collection_name)
200+
invalid_col = schema.get_collection('invalid_col')
201+
202+
result = valid_col.add().execute()
203+
self.assertEqual(0, result.get_affected_items_count())
204+
205+
result = invalid_col.add().execute()
206+
self.assertEqual(0, result.get_affected_items_count())
207+
208+
# can add empty documents even with no connection
209+
session.close()
210+
result = valid_col.add().execute()
211+
self.assertEqual(0, result.get_affected_items_count())
212+
213+
result = invalid_col.add().execute()
214+
self.assertEqual(0, result.get_affected_items_count())
215+
216+
>>>>>>> 0bc7d3b... DevAPI: Define action on adding empty list of documents
190217
def test_get_document_ids(self):
191218
collection_name = "collection_test"
192219
collection = self.schema.create_collection(collection_name)

0 commit comments

Comments
 (0)