Skip to content

Commit f687e9b

Browse files
committed
Added peek
1 parent 41f2442 commit f687e9b

File tree

2 files changed

+56
-2
lines changed

2 files changed

+56
-2
lines changed

neo4j/v1/session.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,20 @@ def single(self):
268268
else:
269269
return records[0]
270270

271+
def peek(self):
272+
""" Return the next record without advancing the cursor. Fails
273+
if no records remain.
274+
"""
275+
if self._buffer:
276+
values = self._buffer[0]
277+
return Record(self.keys(), tuple(map(hydrated, values)))
278+
while not self._buffer and not self._consumed:
279+
self.connection.fetch()
280+
if self._buffer:
281+
values = self._buffer[0]
282+
return Record(self.keys(), tuple(map(hydrated, values)))
283+
raise ResultError("End of stream")
284+
271285

272286
class ResultSummary(object):
273287
""" A summary of execution returned with a :class:`.StatementResult` object.

test/test_session.py

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -586,16 +586,56 @@ def test_single_with_no_records(self):
586586
session = self.driver.session()
587587
result = session.run("CREATE ()")
588588
with self.assertRaises(ResultError):
589-
_ = result.single()
589+
result.single()
590590

591591
def test_single_with_multiple_records(self):
592592
session = self.driver.session()
593593
result = session.run("UNWIND range(1, 3) AS n RETURN n")
594594
with self.assertRaises(ResultError):
595-
_ = result.single()
595+
result.single()
596596

597597
def test_single_consumes_entire_result(self):
598598
session = self.driver.session()
599599
result = session.run("UNWIND range(1, 1) AS n RETURN n")
600600
_ = result.single()
601601
assert result._consumed
602+
603+
def test_peek_can_look_one_ahead(self):
604+
session = self.driver.session()
605+
result = session.run("UNWIND range(1, 3) AS n RETURN n")
606+
record = result.peek()
607+
assert list(record.values()) == [1]
608+
609+
def test_peek_fails_if_nothing_remains(self):
610+
session = self.driver.session()
611+
result = session.run("CREATE ()")
612+
with self.assertRaises(ResultError):
613+
result.peek()
614+
615+
def test_peek_does_not_advance_cursor(self):
616+
session = self.driver.session()
617+
result = session.run("UNWIND range(1, 3) AS n RETURN n")
618+
result.peek()
619+
assert [record[0] for record in result] == [1, 2, 3]
620+
621+
def test_peek_at_different_stages(self):
622+
session = self.driver.session()
623+
result = session.run("UNWIND range(0, 9) AS n RETURN n")
624+
# Peek ahead to the first record
625+
expected_next = 0
626+
upcoming = result.peek()
627+
assert upcoming[0] == expected_next
628+
# Then look through all the other records
629+
for expected, record in enumerate(result):
630+
# Check this record is as expected
631+
assert record[0] == expected
632+
# Check the upcoming record is as expected...
633+
if expected < 9:
634+
# ...when one should follow
635+
expected_next = expected + 1
636+
upcoming = result.peek()
637+
assert upcoming[0] == expected_next
638+
else:
639+
# ...when none should follow
640+
with self.assertRaises(ResultError):
641+
result.peek()

0 commit comments

Comments
 (0)