Skip to content

Commit d5ff23f

Browse files
committed
Mature execute_query API
* Renaming `neo4j.RoutingControl.WRITERS` to `WRITE` and `READERS` to `READ`. * Renaming `driver.query_bookmark_manager()` to `execute_query_bookmark_manager()`. * Remove experimental tag from execute_query and its related APIs * `driver.execute_query` * `driver.execute_query_bookmark_manager` * `AsyncBookmarkManager`, `BookmarkManager`, the corresponding config option (session's `bookmark_manager`) and factory method (`driver.bookmark_manager()`) * `RoutingControl` enum * `EagerResult` and `result.to_eager_result()`
1 parent 6a9ab5b commit d5ff23f

File tree

21 files changed

+260
-489
lines changed

21 files changed

+260
-489
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
See also https://github.com/neo4j/neo4j-python-driver/wiki for more details.
44

55
## NEXT RELEASE
6-
- ...
6+
- Renamed experimental `neo4j.RoutingControl.READERS` to `READ` and `WRITERS` to `WRITE`.
7+
- Renamed experimental `driver.query_bookmark_manager` to `execute_query_bookmark_manager`.
78

89

910
## Version 5.7

docs/source/api.rst

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ Closing a driver will immediately shut down all connections in the pool.
156156
:members: session, query_bookmark_manager, encrypted, close,
157157
verify_connectivity, get_server_info
158158

159-
.. method:: execute_query(query, parameters_=None,routing_=neo4j.RoutingControl.WRITERS, database_=None, impersonated_user_=None, bookmark_manager_=self.query_bookmark_manager, result_transformer_=Result.to_eager_result, **kwargs)
159+
.. method:: execute_query(query, parameters_=None,routing_=neo4j.RoutingControl.WRITE, database_=None, impersonated_user_=None, bookmark_manager_=self.query_bookmark_manager, result_transformer_=Result.to_eager_result, **kwargs)
160160

161161
Execute a query in a transaction function and return all results.
162162

@@ -185,9 +185,9 @@ Closing a driver will immediately shut down all connections in the pool.
185185
impersonated_user=impersonated_user_,
186186
bookmark_manager=bookmark_manager_,
187187
) as session:
188-
if routing_ == RoutingControl.WRITERS:
188+
if routing_ == RoutingControl.WRITE:
189189
return session.execute_write(work)
190-
elif routing_ == RoutingControl.READERS:
190+
elif routing_ == RoutingControl.READ:
191191
return session.execute_read(work)
192192

193193
Usage example::
@@ -202,7 +202,7 @@ Closing a driver will immediately shut down all connections in the pool.
202202
records, summary, keys = driver.execute_query(
203203
"MATCH (p:Person {age: $age}) RETURN p.name",
204204
{"age": 42},
205-
routing_=neo4j.RoutingControl.READERS, # or just "r"
205+
routing_=neo4j.RoutingControl.READ, # or just "r"
206206
database_="neo4j",
207207
)
208208
assert keys == ["p.name"] # not needed, just for illustration
@@ -223,7 +223,7 @@ Closing a driver will immediately shut down all connections in the pool.
223223
"SET p.nickname = 'My dear' "
224224
"RETURN count(*)",
225225
# optional routing parameter, as write is default
226-
# routing_=neo4j.RoutingControl.WRITERS, # or just "w",
226+
# routing_=neo4j.RoutingControl.WRITE, # or just "w",
227227
database_="neo4j",
228228
result_transformer_=neo4j.Result.single,
229229
age=15,
@@ -348,15 +348,10 @@ Closing a driver will immediately shut down all connections in the pool.
348348
:returns: the result of the ``result_transformer``
349349
:rtype: T
350350

351-
**This is experimental.** (See :ref:`filter-warnings-ref`)
352-
It might be changed or removed any time even without prior notice.
353-
354-
We are looking for feedback on this feature. Please let us know what
355-
you think about it here:
356-
https://github.com/neo4j/neo4j-python-driver/discussions/896
357-
358351
.. versionadded:: 5.5
359352

353+
.. versionchanged:: 5.8 stabilized from experimental
354+
360355

361356
.. _driver-configuration-ref:
362357

@@ -995,8 +990,7 @@ See :class:`.BookmarkManager` for more information.
995990

996991
.. versionadded:: 5.0
997992

998-
**This is experimental.** (See :ref:`filter-warnings-ref`)
999-
It might be changed or removed any time even without prior notice.
993+
.. versionchanged:: 5.8 stabilized from experimental
1000994

1001995

1002996
.. _session-notifications-min-severity-ref:

docs/source/async_api.rst

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ Closing a driver will immediately shut down all connections in the pool.
138138
:members: session, query_bookmark_manager, encrypted, close,
139139
verify_connectivity, get_server_info
140140

141-
.. method:: execute_query(query, parameters_=None, routing_=neo4j.RoutingControl.WRITERS, database_=None, impersonated_user_=None, bookmark_manager_=self.query_bookmark_manager, result_transformer_=AsyncResult.to_eager_result, **kwargs)
141+
.. method:: execute_query(query, parameters_=None, routing_=neo4j.RoutingControl.WRITE, database_=None, impersonated_user_=None, bookmark_manager_=self.query_bookmark_manager, result_transformer_=AsyncResult.to_eager_result, **kwargs)
142142
:async:
143143

144144
Execute a query in a transaction function and return all results.
@@ -168,9 +168,9 @@ Closing a driver will immediately shut down all connections in the pool.
168168
impersonated_user=impersonated_user_,
169169
bookmark_manager=bookmark_manager_,
170170
) as session:
171-
if routing_ == RoutingControl.WRITERS:
171+
if routing_ == RoutingControl.WRITE:
172172
return await session.execute_write(work)
173-
elif routing_ == RoutingControl.READERS:
173+
elif routing_ == RoutingControl.READ:
174174
return await session.execute_read(work)
175175

176176
Usage example::
@@ -185,7 +185,7 @@ Closing a driver will immediately shut down all connections in the pool.
185185
records, summary, keys = await driver.execute_query(
186186
"MATCH (p:Person {age: $age}) RETURN p.name",
187187
{"age": 42},
188-
routing_=neo4j.RoutingControl.READERS, # or just "r"
188+
routing_=neo4j.RoutingControl.READ, # or just "r"
189189
database_="neo4j",
190190
)
191191
assert keys == ["p.name"] # not needed, just for illustration
@@ -206,7 +206,7 @@ Closing a driver will immediately shut down all connections in the pool.
206206
"SET p.nickname = 'My dear' "
207207
"RETURN count(*)",
208208
# optional routing parameter, as write is default
209-
# routing_=neo4j.RoutingControl.WRITERS, # or just "w",
209+
# routing_=neo4j.RoutingControl.WRITE, # or just "w",
210210
database_="neo4j",
211211
result_transformer_=neo4j.AsyncResult.single,
212212
)
@@ -329,15 +329,10 @@ Closing a driver will immediately shut down all connections in the pool.
329329
:returns: the result of the ``result_transformer``
330330
:rtype: T
331331

332-
**This is experimental.** (See :ref:`filter-warnings-ref`)
333-
It might be changed or removed any time even without prior notice.
334-
335-
We are looking for feedback on this feature. Please let us know what
336-
you think about it here:
337-
https://github.com/neo4j/neo4j-python-driver/discussions/896
338-
339332
.. versionadded:: 5.5
340333

334+
.. versionchanged:: 5.8 stabilized from experimental
335+
341336

342337
.. _async-driver-configuration-ref:
343338

@@ -622,8 +617,7 @@ See :class:`BookmarkManager` for more information.
622617
:Type: :data:`None`, :class:`BookmarkManager`, or :class:`AsyncBookmarkManager`
623618
:Default: :data:`None`
624619

625-
**This is experimental.** (See :ref:`filter-warnings-ref`)
626-
It might be changed or removed any time even without prior notice.
620+
.. versionchanged:: 5.8 stabilized from experimental
627621

628622

629623

src/neo4j/_api.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -208,21 +208,22 @@ class RoutingControl(str, Enum):
208208
Inherits from :class:`str` and :class:`Enum`. Every driver API accepting a
209209
:class:`.RoutingControl` value will also accept a string
210210
211-
>>> RoutingControl.READERS == "r"
211+
>>> RoutingControl.READ == "r"
212212
True
213-
>>> RoutingControl.WRITERS == "w"
213+
>>> RoutingControl.WRITE == "w"
214214
True
215215
216-
**This is experimental.**
217-
It might be changed or removed any time even without prior notice.
218-
219216
.. seealso::
220217
:attr:`.AsyncDriver.execute_query`, :attr:`.Driver.execute_query`
221218
222219
.. versionadded:: 5.5
220+
221+
.. versionchanged:: 5.8
222+
* renamed ``READERS`` to ``READ`` and ``WRITERS`` to ``WRITE``
223+
* stabilized from experimental
223224
"""
224-
READERS = "r"
225-
WRITERS = "w"
225+
READ = "r"
226+
WRITE = "w"
226227

227228

228229
if t.TYPE_CHECKING:

src/neo4j/_async/driver.py

Lines changed: 24 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@
4747
deprecation_warn,
4848
experimental,
4949
experimental_warn,
50-
ExperimentalWarning,
5150
unclosed_resource_warn,
5251
)
5352
from .._work import EagerResult
@@ -261,10 +260,6 @@ def driver(
261260
routing_context=routing_context, **config)
262261

263262
@classmethod
264-
@experimental(
265-
"The bookmark manager feature is experimental. "
266-
"It might be changed or removed any time even without prior notice."
267-
)
268263
def bookmark_manager(
269264
cls,
270265
initial_bookmarks: t.Union[None, Bookmarks, t.Iterable[str]] = None,
@@ -325,9 +320,6 @@ def bookmark_manager(
325320
326321
:returns: A default implementation of :class:`AsyncBookmarkManager`.
327322
328-
**This is experimental.** (See :ref:`filter-warnings-ref`)
329-
It might be changed or removed any time even without prior notice.
330-
331323
.. versionadded:: 5.0
332324
333325
.. versionchanged:: 5.3
@@ -341,6 +333,8 @@ def bookmark_manager(
341333
an argument.
342334
* ``bookmarks_consumer`` no longer receives the database name as
343335
an argument.
336+
337+
.. versionchanged:: 5.8 stabilized from experimental
344338
"""
345339
return AsyncNeo4jBookmarkManager(
346340
initial_bookmarks=initial_bookmarks,
@@ -448,12 +442,7 @@ def __init__(self, pool, default_workspace_config):
448442
assert default_workspace_config is not None
449443
self._pool = pool
450444
self._default_workspace_config = default_workspace_config
451-
with warnings.catch_warnings():
452-
warnings.filterwarnings("ignore",
453-
message=r".*\bbookmark manager\b.*",
454-
category=ExperimentalWarning)
455-
self._query_bookmark_manager = \
456-
AsyncGraphDatabase.bookmark_manager()
445+
self._query_bookmark_manager = AsyncGraphDatabase.bookmark_manager()
457446

458447
async def __aenter__(self) -> AsyncDriver:
459448
return self
@@ -543,7 +532,7 @@ async def execute_query(
543532
self,
544533
query_: str,
545534
parameters_: t.Optional[t.Dict[str, t.Any]] = None,
546-
routing_: T_RoutingControl = RoutingControl.WRITERS,
535+
routing_: T_RoutingControl = RoutingControl.WRITE,
547536
database_: t.Optional[str] = None,
548537
impersonated_user_: t.Optional[str] = None,
549538
bookmark_manager_: t.Union[
@@ -561,7 +550,7 @@ async def execute_query(
561550
self,
562551
query_: str,
563552
parameters_: t.Optional[t.Dict[str, t.Any]] = None,
564-
routing_: T_RoutingControl = RoutingControl.WRITERS,
553+
routing_: T_RoutingControl = RoutingControl.WRITE,
565554
database_: t.Optional[str] = None,
566555
impersonated_user_: t.Optional[str] = None,
567556
bookmark_manager_: t.Union[
@@ -574,15 +563,11 @@ async def execute_query(
574563
) -> _T:
575564
...
576565

577-
@experimental(
578-
"Driver.execute_query is experimental. "
579-
"It might be changed or removed any time even without prior notice."
580-
)
581566
async def execute_query(
582567
self,
583568
query_: str,
584569
parameters_: t.Optional[t.Dict[str, t.Any]] = None,
585-
routing_: T_RoutingControl = RoutingControl.WRITERS,
570+
routing_: T_RoutingControl = RoutingControl.WRITE,
586571
database_: t.Optional[str] = None,
587572
impersonated_user_: t.Optional[str] = None,
588573
bookmark_manager_: t.Union[
@@ -621,9 +606,9 @@ async def work(tx):
621606
impersonated_user=impersonated_user_,
622607
bookmark_manager=bookmark_manager_,
623608
) as session:
624-
if routing_ == RoutingControl.WRITERS:
609+
if routing_ == RoutingControl.WRITE:
625610
return await session.execute_write(work)
626-
elif routing_ == RoutingControl.READERS:
611+
elif routing_ == RoutingControl.READ:
627612
return await session.execute_read(work)
628613
629614
Usage example::
@@ -638,7 +623,7 @@ async def example(driver: neo4j.AsyncDriver) -> List[str]:
638623
records, summary, keys = await driver.execute_query(
639624
"MATCH (p:Person {age: $age}) RETURN p.name",
640625
{"age": 42},
641-
routing_=neo4j.RoutingControl.READERS, # or just "r"
626+
routing_=neo4j.RoutingControl.READ, # or just "r"
642627
database_="neo4j",
643628
)
644629
assert keys == ["p.name"] # not needed, just for illustration
@@ -659,7 +644,7 @@ async def example(driver: neo4j.AsyncDriver) -> int:
659644
"SET p.nickname = 'My dear' "
660645
"RETURN count(*)",
661646
# optional routing parameter, as write is default
662-
# routing_=neo4j.RoutingControl.WRITERS, # or just "w",
647+
# routing_=neo4j.RoutingControl.WRITE, # or just "w",
663648
database_="neo4j",
664649
result_transformer_=neo4j.AsyncResult.single,
665650
)
@@ -782,10 +767,9 @@ async def example(driver: neo4j.AsyncDriver) -> neo4j.Record::
782767
:returns: the result of the ``result_transformer``
783768
:rtype: T
784769
785-
**This is experimental.** (See :ref:`filter-warnings-ref`)
786-
It might be changed or removed any time even without prior notice.
787-
788770
.. versionadded:: 5.5
771+
772+
.. versionchanged:: 5.8 stabilized from experimental
789773
"""
790774
invalid_kwargs = [k for k in kwargs if
791775
k[-2:-1] != "_" and k[-1:] == "_"]
@@ -803,17 +787,13 @@ async def example(driver: neo4j.AsyncDriver) -> neo4j.Record::
803787
bookmark_manager_ = self._query_bookmark_manager
804788
assert bookmark_manager_ is not _default
805789

806-
with warnings.catch_warnings():
807-
warnings.filterwarnings("ignore",
808-
message=r".*\bbookmark_manager\b.*",
809-
category=ExperimentalWarning)
810-
session = self.session(database=database_,
811-
impersonated_user=impersonated_user_,
812-
bookmark_manager=bookmark_manager_)
790+
session = self.session(database=database_,
791+
impersonated_user=impersonated_user_,
792+
bookmark_manager=bookmark_manager_)
813793
async with session:
814-
if routing_ == RoutingControl.WRITERS:
794+
if routing_ == RoutingControl.WRITE:
815795
executor = session.execute_write
816-
elif routing_ == RoutingControl.READERS:
796+
elif routing_ == RoutingControl.READ:
817797
executor = session.execute_read
818798
else:
819799
raise ValueError("Invalid routing control value: %r"
@@ -823,11 +803,7 @@ async def example(driver: neo4j.AsyncDriver) -> neo4j.Record::
823803
)
824804

825805
@property
826-
@experimental(
827-
"Driver.query_bookmark_manager is experimental. "
828-
"It might be changed or removed any time even without prior notice."
829-
)
830-
def query_bookmark_manager(self) -> AsyncBookmarkManager:
806+
def execute_query_bookmark_manager(self) -> AsyncBookmarkManager:
831807
"""The driver's default query bookmark manager.
832808
833809
This is the default :class:`AsyncBookmarkManager` used by
@@ -846,10 +822,12 @@ async def example(driver: neo4j.AsyncDriver) -> None:
846822
# (i.e., can read what was written by <QUERY 2>)
847823
await driver.execute_query("<QUERY 3>")
848824
849-
**This is experimental.** (See :ref:`filter-warnings-ref`)
850-
It might be changed or removed any time even without prior notice.
851-
852825
.. versionadded:: 5.5
826+
827+
.. versionchanged:: 5.8
828+
* renamed from ``query_bookmark_manager`` to
829+
``execute_query_bookmark_manager``
830+
* stabilized from experimental
853831
"""
854832
return self._query_bookmark_manager
855833

@@ -1020,11 +998,7 @@ async def _work(
1020998
) -> _T:
1021999
res = await tx.run(query, parameters)
10221000
if transformer is AsyncResult.to_eager_result:
1023-
with warnings.catch_warnings():
1024-
warnings.filterwarnings("ignore",
1025-
message=r".*\bto_eager_result\b.*",
1026-
category=ExperimentalWarning)
1027-
return await transformer(res)
1001+
return await transformer(res)
10281002
return await transformer(res)
10291003

10301004

0 commit comments

Comments
 (0)