Skip to content

Commit af1bd0b

Browse files
committed
Added n and qid to DISCARD (renamed from DISCARD_ALL)
1 parent 9bff14d commit af1bd0b

File tree

5 files changed

+83
-6
lines changed

5 files changed

+83
-6
lines changed

neo4j/io/__init__.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,8 +178,14 @@ def run(self, statement, parameters=None, mode=None, bookmarks=None, metadata=No
178178
:return: :class:`neo4j.io._bolt3.Response` object
179179
"""
180180

181-
def discard_all(self, **handlers):
182-
raise NotImplementedError
181+
def discard(self, n=-1, qid=-1, **handlers):
182+
""" Appends a DISCARD message to the output stream.
183+
184+
:param n: number of records to discard, default = -1 (ALL)
185+
:param qid: query ID to discard for, default = -1 (last query)
186+
:param handlers: handler functions passed into the returned Response object
187+
:return: :class:`neo4j.io._bolt3.Response` object
188+
"""
183189

184190
def pull_all(self, **handlers):
185191
raise NotImplementedError

neo4j/io/_bolt3.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,11 @@ def run(self, statement, parameters=None, mode=None, bookmarks=None, metadata=No
173173
else:
174174
self._append(b"\x10", fields, Response(self, **handlers))
175175

176-
def discard_all(self, **handlers):
176+
def discard(self, n=-1, qid=-1, **handlers):
177+
if n != -1:
178+
raise ValueError("Incremental discard is not supported in Bolt 3")
179+
if qid != -1:
180+
raise ValueError("Query selection on discard is not supported in Bolt 3")
177181
log.debug("[#%04X] C: DISCARD_ALL", self.local_port)
178182
self._append(b"\x2F", (), Response(self, **handlers))
179183

neo4j/io/_bolt4x0.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,9 +173,14 @@ def run(self, statement, parameters=None, mode=None, bookmarks=None, metadata=No
173173
else:
174174
self._append(b"\x10", fields, Response(self, **handlers))
175175

176-
def discard_all(self, **handlers):
177-
log.debug("[#%04X] C: DISCARD_ALL", self.local_port)
178-
self._append(b"\x2F", (), Response(self, **handlers))
176+
def discard(self, n=-1, qid=-1, **handlers):
177+
# TODO: find out whether qid is optional, and optimise if so
178+
extra = {
179+
"n": n,
180+
"qid": qid,
181+
}
182+
log.debug("[#%04X] C: DISCARD %r", self.local_port, extra)
183+
self._append(b"\x2F", (extra,), Response(self, **handlers))
179184

180185
def pull_all(self, **handlers):
181186
log.debug("[#%04X] C: PULL_ALL", self.local_port)

tests/unit/io/test_class_bolt3.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,29 @@ def test_db_extra_not_supported_in_run(fake_socket):
5454
connection = Bolt3(address, fake_socket(address))
5555
with pytest.raises(ValueError):
5656
connection.run("", db="something")
57+
58+
59+
def test_simple_discard(fake_socket):
60+
address = ("127.0.0.1", 7687)
61+
socket = fake_socket(address)
62+
connection = Bolt3(address, socket)
63+
connection.discard()
64+
connection.send_all()
65+
tag, fields = socket.pop_message()
66+
assert tag == b"\x2F"
67+
assert len(fields) == 0
68+
69+
70+
def test_n_extra_not_supported_in_discard(fake_socket):
71+
address = ("127.0.0.1", 7687)
72+
connection = Bolt3(address, fake_socket(address))
73+
with pytest.raises(ValueError):
74+
connection.discard(n=666)
75+
76+
77+
def test_qid_extra_not_supported_in_discard(fake_socket):
78+
address = ("127.0.0.1", 7687)
79+
connection = Bolt3(address, fake_socket(address))
80+
with pytest.raises(ValueError):
81+
connection.discard(qid=666)
82+

tests/unit/io/test_class_bolt4x0.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,39 @@ def test_db_extra_in_run(fake_socket):
6464
assert fields[0] == ""
6565
assert fields[1] == {}
6666
assert fields[2] == {"db": "something"}
67+
68+
69+
def test_n_extra_in_discard(fake_socket):
70+
address = ("127.0.0.1", 7687)
71+
socket = fake_socket(address)
72+
connection = Bolt4x0(address, socket)
73+
connection.discard(n=666)
74+
connection.send_all()
75+
tag, fields = socket.pop_message()
76+
assert tag == b"\x2F"
77+
assert len(fields) == 1
78+
assert fields[0] == {"n": 666, "qid": -1}
79+
80+
81+
def test_qid_extra_in_discard(fake_socket):
82+
address = ("127.0.0.1", 7687)
83+
socket = fake_socket(address)
84+
connection = Bolt4x0(address, socket)
85+
connection.discard(qid=666)
86+
connection.send_all()
87+
tag, fields = socket.pop_message()
88+
assert tag == b"\x2F"
89+
assert len(fields) == 1
90+
assert fields[0] == {"n": -1, "qid": 666}
91+
92+
93+
def test_n_and_qid_extras_in_discard(fake_socket):
94+
address = ("127.0.0.1", 7687)
95+
socket = fake_socket(address)
96+
connection = Bolt4x0(address, socket)
97+
connection.discard(n=666, qid=777)
98+
connection.send_all()
99+
tag, fields = socket.pop_message()
100+
assert tag == b"\x2F"
101+
assert len(fields) == 1
102+
assert fields[0] == {"n": 666, "qid": 777}

0 commit comments

Comments
 (0)