beaver-db 0.19.2__tar.gz → 0.20.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of beaver-db might be problematic. Click here for more details.

Files changed (138) hide show
  1. {beaver_db-0.19.2 → beaver_db-0.20.1}/PKG-INFO +1 -1
  2. {beaver_db-0.19.2 → beaver_db-0.20.1}/beaver/__init__.py +1 -1
  3. {beaver_db-0.19.2 → beaver_db-0.20.1}/beaver/blobs.py +36 -1
  4. {beaver_db-0.19.2 → beaver_db-0.20.1}/beaver/collections.py +39 -3
  5. {beaver_db-0.19.2 → beaver_db-0.20.1}/beaver/core.py +4 -4
  6. {beaver_db-0.19.2 → beaver_db-0.20.1}/beaver/dicts.py +36 -3
  7. {beaver_db-0.19.2 → beaver_db-0.20.1}/beaver/lists.py +37 -3
  8. {beaver_db-0.19.2 → beaver_db-0.20.1}/beaver/locks.py +20 -7
  9. {beaver_db-0.19.2 → beaver_db-0.20.1}/beaver/queues.py +38 -3
  10. beaver_db-0.20.1/docs/.gitignore +2 -0
  11. beaver_db-0.20.1/docs/.quarto/cites/index.json +1 -0
  12. beaver_db-0.20.1/docs/.quarto/idx/dev-architecture.qmd.json +1 -0
  13. beaver_db-0.20.1/docs/.quarto/idx/dev-concurrency.qmd.json +1 -0
  14. beaver_db-0.20.1/docs/.quarto/idx/dev-contributing.qmd.json +1 -0
  15. beaver_db-0.20.1/docs/.quarto/idx/dev-search.qmd.json +1 -0
  16. beaver_db-0.20.1/docs/.quarto/idx/guide-collections.qmd.json +1 -0
  17. beaver_db-0.20.1/docs/.quarto/idx/guide-concurrency.qmd.json +1 -0
  18. beaver_db-0.20.1/docs/.quarto/idx/guide-deployment.qmd.json +1 -0
  19. beaver_db-0.20.1/docs/.quarto/idx/guide-dicts-blobs.qmd.json +1 -0
  20. beaver_db-0.20.1/docs/.quarto/idx/guide-lists-queues.qmd.json +1 -0
  21. beaver_db-0.20.1/docs/.quarto/idx/guide-realtime.qmd.json +1 -0
  22. beaver_db-0.20.1/docs/.quarto/idx/index.qmd.json +1 -0
  23. beaver_db-0.20.1/docs/.quarto/idx/quickstart.qmd.json +1 -0
  24. beaver_db-0.20.1/docs/.quarto/project-cache/08c652dc55400ed7625e092b14557eff +399 -0
  25. beaver_db-0.20.1/docs/.quarto/project-cache/78e7cce51608b23bc20ef50628d80ee9 +461 -0
  26. beaver_db-0.20.1/docs/.quarto/project-cache/deno-kv-file +0 -0
  27. beaver_db-0.20.1/docs/.quarto/project-cache/efb0c620c38ca7c31075f463c90f647b +461 -0
  28. beaver_db-0.20.1/docs/.quarto/xref/1e84074e +1 -0
  29. beaver_db-0.20.1/docs/.quarto/xref/41b07c8e +1 -0
  30. beaver_db-0.20.1/docs/.quarto/xref/4a9bbebe +1 -0
  31. beaver_db-0.20.1/docs/.quarto/xref/57337df9 +1 -0
  32. beaver_db-0.20.1/docs/.quarto/xref/674e8fe6 +1 -0
  33. beaver_db-0.20.1/docs/.quarto/xref/6a721ef9 +1 -0
  34. beaver_db-0.20.1/docs/.quarto/xref/807a23ea +1 -0
  35. beaver_db-0.20.1/docs/.quarto/xref/9c486562 +1 -0
  36. beaver_db-0.20.1/docs/.quarto/xref/INDEX +47 -0
  37. beaver_db-0.20.1/docs/.quarto/xref/b2f009dd +1 -0
  38. beaver_db-0.20.1/docs/.quarto/xref/c40f73a8 +1 -0
  39. beaver_db-0.20.1/docs/.quarto/xref/cf0735bd +1 -0
  40. beaver_db-0.20.1/docs/.quarto/xref/d7f66f00 +1 -0
  41. beaver_db-0.20.1/docs/.quarto/xref/f22e8d4c +1 -0
  42. beaver_db-0.20.1/docs/.quarto/xref/f9d58622 +1 -0
  43. beaver_db-0.20.1/docs/.quarto/xref/fa9f9ca6 +1 -0
  44. beaver_db-0.20.1/docs/_book/dev-architecture.html +870 -0
  45. beaver_db-0.20.1/docs/_book/dev-concurrency.html +687 -0
  46. beaver_db-0.20.1/docs/_book/dev-contributing.html +675 -0
  47. beaver_db-0.20.1/docs/_book/dev-search.html +681 -0
  48. beaver_db-0.20.1/docs/_book/guide-collections.html +877 -0
  49. beaver_db-0.20.1/docs/_book/guide-concurrency.html +863 -0
  50. beaver_db-0.20.1/docs/_book/guide-deployment.html +869 -0
  51. beaver_db-0.20.1/docs/_book/guide-dicts-blobs.html +682 -0
  52. beaver_db-0.20.1/docs/_book/guide-lists-queues.html +865 -0
  53. beaver_db-0.20.1/docs/_book/guide-realtime.html +865 -0
  54. beaver_db-0.20.1/docs/_book/index.html +928 -0
  55. beaver_db-0.20.1/docs/_book/quickstart.html +795 -0
  56. beaver_db-0.20.1/docs/_book/search.json +200 -0
  57. beaver_db-0.20.1/docs/_book/site_libs/bootstrap/bootstrap-5d653dd4d7566aed16f42eb06e547978.min.css +12 -0
  58. beaver_db-0.20.1/docs/_book/site_libs/bootstrap/bootstrap-dark-5cc7fd2e95cc32b4ed915ed1d7e2d366.min.css +12 -0
  59. beaver_db-0.20.1/docs/_book/site_libs/bootstrap/bootstrap-icons.css +2078 -0
  60. beaver_db-0.20.1/docs/_book/site_libs/bootstrap/bootstrap-icons.woff +0 -0
  61. beaver_db-0.20.1/docs/_book/site_libs/bootstrap/bootstrap.min.js +7 -0
  62. beaver_db-0.20.1/docs/_book/site_libs/clipboard/clipboard.min.js +7 -0
  63. beaver_db-0.20.1/docs/_book/site_libs/quarto-html/anchor.min.js +9 -0
  64. beaver_db-0.20.1/docs/_book/site_libs/quarto-html/popper.min.js +6 -0
  65. beaver_db-0.20.1/docs/_book/site_libs/quarto-html/quarto-syntax-highlighting-dark-2b3e328b71be8d25427581baeb23079b.css +219 -0
  66. beaver_db-0.20.1/docs/_book/site_libs/quarto-html/quarto-syntax-highlighting-de070a7b0ab54f8780927367ac907214.css +236 -0
  67. beaver_db-0.20.1/docs/_book/site_libs/quarto-html/quarto.js +845 -0
  68. beaver_db-0.20.1/docs/_book/site_libs/quarto-html/tabsets/tabsets.js +95 -0
  69. beaver_db-0.20.1/docs/_book/site_libs/quarto-html/tippy.css +1 -0
  70. beaver_db-0.20.1/docs/_book/site_libs/quarto-html/tippy.umd.min.js +2 -0
  71. beaver_db-0.20.1/docs/_book/site_libs/quarto-nav/quarto-nav.js +325 -0
  72. beaver_db-0.20.1/docs/_book/site_libs/quarto-search/autocomplete.umd.js +3 -0
  73. beaver_db-0.20.1/docs/_book/site_libs/quarto-search/fuse.min.js +9 -0
  74. beaver_db-0.20.1/docs/_book/site_libs/quarto-search/quarto-search.js +1290 -0
  75. beaver_db-0.20.1/docs/_quarto.yml +64 -0
  76. beaver_db-0.20.1/docs/cover.png +0 -0
  77. beaver_db-0.20.1/docs/dev-architecture.qmd +15 -0
  78. beaver_db-0.20.1/docs/dev-concurrency.qmd +15 -0
  79. beaver_db-0.20.1/docs/dev-contributing.qmd +9 -0
  80. beaver_db-0.20.1/docs/dev-search.qmd +11 -0
  81. beaver_db-0.20.1/docs/guide-collections.qmd +20 -0
  82. beaver_db-0.20.1/docs/guide-concurrency.qmd +10 -0
  83. beaver_db-0.20.1/docs/guide-deployment.qmd +14 -0
  84. beaver_db-0.20.1/docs/guide-dicts-blobs.qmd +12 -0
  85. beaver_db-0.20.1/docs/guide-lists-queues.qmd +12 -0
  86. beaver_db-0.20.1/docs/guide-realtime.qmd +12 -0
  87. beaver_db-0.20.1/docs/index.qmd +89 -0
  88. beaver_db-0.20.1/docs/logo.png +0 -0
  89. beaver_db-0.20.1/docs/quickstart.qmd +120 -0
  90. beaver_db-0.20.1/issues/closed/10-expose-dblock-functionality-on-all-high-level-data-managers.md +86 -0
  91. beaver_db-0.20.1/issues/closed/11-a-new-issue-for-gabriel.md +8 -0
  92. beaver_db-0.20.1/logo.png +0 -0
  93. {beaver_db-0.19.2 → beaver_db-0.20.1}/pyproject.toml +1 -1
  94. {beaver_db-0.19.2 → beaver_db-0.20.1}/.dockerignore +0 -0
  95. {beaver_db-0.19.2 → beaver_db-0.20.1}/.gitignore +0 -0
  96. {beaver_db-0.19.2 → beaver_db-0.20.1}/.python-version +0 -0
  97. {beaver_db-0.19.2 → beaver_db-0.20.1}/LICENSE +0 -0
  98. {beaver_db-0.19.2 → beaver_db-0.20.1}/README.md +0 -0
  99. {beaver_db-0.19.2 → beaver_db-0.20.1}/beaver/channels.py +0 -0
  100. {beaver_db-0.19.2 → beaver_db-0.20.1}/beaver/cli.py +0 -0
  101. {beaver_db-0.19.2 → beaver_db-0.20.1}/beaver/logs.py +0 -0
  102. {beaver_db-0.19.2 → beaver_db-0.20.1}/beaver/server.py +0 -0
  103. {beaver_db-0.19.2 → beaver_db-0.20.1}/beaver/types.py +0 -0
  104. {beaver_db-0.19.2 → beaver_db-0.20.1}/beaver/vectors.py +0 -0
  105. {beaver_db-0.19.2 → beaver_db-0.20.1}/design.md +0 -0
  106. {beaver_db-0.19.2 → beaver_db-0.20.1}/dockerfile +0 -0
  107. {beaver_db-0.19.2 → beaver_db-0.20.1/docs/_book}/logo.png +0 -0
  108. {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/async_pubsub.py +0 -0
  109. {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/blobs.py +0 -0
  110. {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/cache.py +0 -0
  111. {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/fts.py +0 -0
  112. {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/fuzzy.py +0 -0
  113. {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/general_test.py +0 -0
  114. {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/graph.py +0 -0
  115. {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/kvstore.py +0 -0
  116. {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/list.py +0 -0
  117. {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/locks.py +0 -0
  118. {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/logs.py +0 -0
  119. {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/pqueue.py +0 -0
  120. {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/producer_consumer.py +0 -0
  121. {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/publisher.py +0 -0
  122. {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/pubsub.py +0 -0
  123. {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/rerank.py +0 -0
  124. {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/stress_vectors.py +0 -0
  125. {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/subscriber.py +0 -0
  126. {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/textual_chat.css +0 -0
  127. {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/textual_chat.py +0 -0
  128. {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/type_hints.py +0 -0
  129. {beaver_db-0.19.2 → beaver_db-0.20.1}/examples/vector.py +0 -0
  130. {beaver_db-0.19.2 → beaver_db-0.20.1}/issues/2-comprehensive-async-wrappers.md +0 -0
  131. {beaver_db-0.19.2 → beaver_db-0.20.1}/issues/6-drop-in-replacement-for-beaver-rest-server-client.md +0 -0
  132. {beaver_db-0.19.2 → beaver_db-0.20.1}/issues/7-replace-faiss-with-simpler-linear-numpy-vectorial-search.md +0 -0
  133. {beaver_db-0.19.2 → beaver_db-0.20.1}/issues/9-type-safe-wrappers-based-on-pydantic-compatible-models.md +0 -0
  134. {beaver_db-0.19.2 → beaver_db-0.20.1}/issues/closed/1-refactor-vector-store-to-use-faiss.md +0 -0
  135. {beaver_db-0.19.2 → beaver_db-0.20.1}/issues/closed/5-add-dblock-for-inter-process-synchronization.md +0 -0
  136. {beaver_db-0.19.2 → beaver_db-0.20.1}/issues/closed/8-first-class-synchronization-primitive.md +0 -0
  137. {beaver_db-0.19.2 → beaver_db-0.20.1}/makefile +0 -0
  138. {beaver_db-0.19.2 → beaver_db-0.20.1}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: beaver-db
3
- Version: 0.19.2
3
+ Version: 0.20.1
4
4
  Summary: Fast, embedded, and multi-modal DB based on SQLite for AI-powered applications.
5
5
  License-File: LICENSE
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -2,4 +2,4 @@ from .core import BeaverDB
2
2
  from .types import Model
3
3
  from .collections import Document, WalkDirection
4
4
 
5
- __version__ = "0.19.2"
5
+ __version__ = "0.20.1"
@@ -1,8 +1,8 @@
1
1
  import json
2
2
  import sqlite3
3
3
  from typing import Any, Dict, Iterator, NamedTuple, Optional, Type, TypeVar
4
-
5
4
  from .types import JsonSerializable, IDatabase
5
+ from .locks import LockManager
6
6
 
7
7
 
8
8
  class Blob[M](NamedTuple):
@@ -16,10 +16,13 @@ class Blob[M](NamedTuple):
16
16
  class BlobManager[M]:
17
17
  """A wrapper providing a Pythonic interface to a blob store in the database."""
18
18
 
19
+ # In beaver/blobs.py, inside class BlobManager[M]:
19
20
  def __init__(self, name: str, db: IDatabase, model: Type[M] | None = None):
20
21
  self._name = name
21
22
  self._db = db
22
23
  self._model = model
24
+ lock_name = f"__lock__blob__{name}"
25
+ self._lock = LockManager(db, lock_name)
23
26
 
24
27
  def _serialize(self, value: M) -> str | None:
25
28
  """Serializes the given value to a JSON string."""
@@ -135,3 +138,35 @@ class BlobManager[M]:
135
138
 
136
139
  def __repr__(self) -> str:
137
140
  return f"BlobManager(name='{self._name}')"
141
+
142
+ def acquire(
143
+ self,
144
+ timeout: Optional[float] = None,
145
+ lock_ttl: Optional[float] = None,
146
+ poll_interval: Optional[float] = None,
147
+ ) -> "BlobManager[M]":
148
+ """
149
+ Acquires an inter-process lock on this blob store, blocking until acquired.
150
+
151
+ Parameters override the default settings of the underlying LockManager.
152
+ """
153
+ self._lock.acquire(
154
+ timeout=timeout,
155
+ lock_ttl=lock_ttl,
156
+ poll_interval=poll_interval
157
+ )
158
+ return self
159
+
160
+ def release(self):
161
+ """
162
+ Releases the inter-process lock on this blob store.
163
+ """
164
+ self._lock.release()
165
+
166
+ def __enter__(self) -> "BlobManager[M]":
167
+ """Acquires the lock upon entering a 'with' statement."""
168
+ return self.acquire()
169
+
170
+ def __exit__(self, exc_type, exc_val, exc_tb):
171
+ """Releases the lock when exiting a 'with' statement."""
172
+ self.release()
@@ -3,15 +3,16 @@ import sqlite3
3
3
  import threading
4
4
  import uuid
5
5
  from enum import Enum
6
- from typing import Any, Iterator, List, Literal, Tuple, Type, TypeVar
6
+ from typing import Any, Iterator, List, Literal, Tuple, Type, TypeVar, Optional
7
7
  from .types import Model, stub, IDatabase
8
+ from .locks import LockManager
8
9
 
9
10
  try:
10
11
  import numpy as np
11
12
  from .vectors import VectorIndex
12
13
  except ImportError:
13
- np = stub("This feature requires to install beaver-db[faiss]")()
14
- VectorIndex = stub("This feature requires to install beaver-db[faiss]")
14
+ np = stub("This feature requires to install beaver-db[vector]")()
15
+ VectorIndex = stub("This feature requires to install beaver-db[vector]")
15
16
 
16
17
  # --- Fuzzy Search Helper Functions ---
17
18
 
@@ -135,6 +136,9 @@ class CollectionManager[D: Document]:
135
136
  self._compaction_lock = threading.Lock()
136
137
  self._compaction_thread: threading.Thread | None = None
137
138
 
139
+ lock_name = f"__lock__collection__{name}"
140
+ self._lock = LockManager(db, lock_name)
141
+
138
142
  def _flatten_metadata(self, metadata: dict, prefix: str = "") -> dict[str, Any]:
139
143
  """Flattens a nested dictionary for indexing."""
140
144
  flat_dict = {}
@@ -643,6 +647,38 @@ class CollectionManager[D: Document]:
643
647
  cursor.close()
644
648
  return count
645
649
 
650
+ def acquire(
651
+ self,
652
+ timeout: Optional[float] = None,
653
+ lock_ttl: Optional[float] = None,
654
+ poll_interval: Optional[float] = None,
655
+ ) -> "CollectionManager[D]":
656
+ """
657
+ Acquires an inter-process lock on this collection, blocking until acquired.
658
+ This guarantees exclusive access for multi-step atomic operations
659
+ (e.g., index + connect).
660
+
661
+ Parameters override the default settings of the underlying LockManager.
662
+ """
663
+ self._lock.acquire(
664
+ timeout=timeout, lock_ttl=lock_ttl, poll_interval=poll_interval
665
+ )
666
+ return self
667
+
668
+ def release(self):
669
+ """
670
+ Releases the inter-process lock on this collection.
671
+ """
672
+ self._lock.release()
673
+
674
+ def __enter__(self) -> "CollectionManager[D]":
675
+ """Acquires the lock upon entering a 'with' statement."""
676
+ return self.acquire()
677
+
678
+ def __exit__(self, exc_type, exc_val, exc_tb):
679
+ """Releases the lock when exiting a 'with' statement."""
680
+ self.release()
681
+
646
682
 
647
683
  def rerank[D: Document](
648
684
  *results: list[D], weights: list[float] | None = None, k: int = 60
@@ -167,7 +167,7 @@ class BeaverDB:
167
167
  """Creates the table to store the serialized base ANN index."""
168
168
  self.connection.execute(
169
169
  """
170
- CREATE TABLE IF NOT EXISTS _beaver_ann_indexes (
170
+ CREATE TABLE IF NOT EXISTS beaver_ann_indexes (
171
171
  collection_name TEXT PRIMARY KEY,
172
172
  index_data BLOB,
173
173
  base_index_version INTEGER NOT NULL DEFAULT 0
@@ -179,7 +179,7 @@ class BeaverDB:
179
179
  """Creates the log for new vector additions."""
180
180
  self.connection.execute(
181
181
  """
182
- CREATE TABLE IF NOT EXISTS _beaver_ann_pending_log (
182
+ CREATE TABLE IF NOT EXISTS beaver_ann_pending_log (
183
183
  collection_name TEXT NOT NULL,
184
184
  str_id TEXT NOT NULL,
185
185
  PRIMARY KEY (collection_name, str_id)
@@ -191,7 +191,7 @@ class BeaverDB:
191
191
  """Creates the log for vector deletions (tombstones)."""
192
192
  self.connection.execute(
193
193
  """
194
- CREATE TABLE IF NOT EXISTS _beaver_ann_deletions_log (
194
+ CREATE TABLE IF NOT EXISTS beaver_ann_deletions_log (
195
195
  collection_name TEXT NOT NULL,
196
196
  int_id INTEGER NOT NULL,
197
197
  PRIMARY KEY (collection_name, int_id)
@@ -203,7 +203,7 @@ class BeaverDB:
203
203
  """Creates the table to map string IDs to integer IDs for Faiss."""
204
204
  self.connection.execute(
205
205
  """
206
- CREATE TABLE IF NOT EXISTS _beaver_ann_id_mapping (
206
+ CREATE TABLE IF NOT EXISTS beaver_ann_id_mapping (
207
207
  collection_name TEXT NOT NULL,
208
208
  str_id TEXT NOT NULL,
209
209
  int_id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -1,9 +1,9 @@
1
1
  import json
2
2
  import sqlite3
3
3
  import time
4
- from typing import Any, Iterator, Tuple, Type
5
-
4
+ from typing import Any, Iterator, Tuple, Type, Optional
6
5
  from .types import JsonSerializable, IDatabase
6
+ from .locks import LockManager
7
7
 
8
8
  class DictManager[T]:
9
9
  """A wrapper providing a Pythonic interface to a dictionary in the database."""
@@ -12,6 +12,8 @@ class DictManager[T]:
12
12
  self._name = name
13
13
  self._db = db
14
14
  self._model = model
15
+ lock_name = f"__lock__dict__{name}"
16
+ self._lock = LockManager(db, lock_name)
15
17
 
16
18
  def _serialize(self, value: T) -> str:
17
19
  """Serializes the given value to a JSON string."""
@@ -147,4 +149,35 @@ class DictManager[T]:
147
149
  cursor.close()
148
150
 
149
151
  def __repr__(self) -> str:
150
- return f"DictManager(name='{self._name}')"
152
+ return f"DictManager(name='{self._name}')"
153
+
154
+ def acquire(
155
+ self,
156
+ timeout: Optional[float] = None,
157
+ lock_ttl: Optional[float] = None,
158
+ poll_interval: Optional[float] = None,
159
+ ) -> "DictManager[T]":
160
+ """
161
+ Acquires an inter-process lock on this dictionary, blocking until acquired.
162
+ Parameters override the default settings of the underlying LockManager.
163
+ """
164
+ self._lock.acquire(
165
+ timeout=timeout,
166
+ lock_ttl=lock_ttl,
167
+ poll_interval=poll_interval
168
+ )
169
+ return self
170
+
171
+ def release(self):
172
+ """
173
+ Releases the inter-process lock on this dictionary.
174
+ """
175
+ self._lock.release()
176
+
177
+ def __enter__(self) -> "DictManager[T]":
178
+ """Acquires the lock upon entering a 'with' statement."""
179
+ return self.acquire()
180
+
181
+ def __exit__(self, exc_type, exc_val, exc_tb):
182
+ """Releases the lock when exiting a 'with' statement."""
183
+ self.release()
@@ -1,8 +1,8 @@
1
1
  import json
2
2
  import sqlite3
3
- from typing import Any, Iterator, Type, Union
4
-
3
+ from typing import Any, Iterator, Type, Union, Optional
5
4
  from .types import JsonSerializable, IDatabase
5
+ from .locks import LockManager
6
6
 
7
7
 
8
8
  class ListManager[T]:
@@ -12,6 +12,8 @@ class ListManager[T]:
12
12
  self._name = name
13
13
  self._db = db
14
14
  self._model = model
15
+ lock_name = f"__lock__list__{name}"
16
+ self._lock = LockManager(db, lock_name)
15
17
 
16
18
  def _serialize(self, value: T) -> str:
17
19
  """Serializes the given value to a JSON string."""
@@ -261,4 +263,36 @@ class ListManager[T]:
261
263
  cursor.execute(
262
264
  "DELETE FROM beaver_lists WHERE rowid = ?", (rowid_to_delete,)
263
265
  )
264
- return self._deserialize(value_to_return)
266
+ return self._deserialize(value_to_return)
267
+
268
+ def acquire(
269
+ self,
270
+ timeout: Optional[float] = None,
271
+ lock_ttl: Optional[float] = None,
272
+ poll_interval: Optional[float] = None,
273
+ ) -> "ListManager[T]":
274
+ """
275
+ Acquires an inter-process lock on this list, blocking until acquired.
276
+
277
+ Parameters override the default settings of the underlying LockManager.
278
+ """
279
+ self._lock.acquire(
280
+ timeout=timeout,
281
+ lock_ttl=lock_ttl,
282
+ poll_interval=poll_interval
283
+ )
284
+ return self
285
+
286
+ def release(self):
287
+ """
288
+ Releases the inter-process lock on this list, allowing the next waiting process access.
289
+ """
290
+ self._lock.release()
291
+
292
+ def __enter__(self) -> "ListManager[T]":
293
+ """Acquires the lock upon entering a 'with' statement."""
294
+ return self.acquire()
295
+
296
+ def __exit__(self, exc_type, exc_val, exc_tb):
297
+ """Releases the lock when exiting a 'with' statement."""
298
+ self.release()
@@ -55,7 +55,11 @@ class LockManager:
55
55
  self._waiter_id = f"pid:{os.getpid()}:id:{uuid.uuid4()}"
56
56
  self._acquired = False # State to track if this instance holds the lock
57
57
 
58
- def acquire(self) -> "LockManager":
58
+ def acquire(self,
59
+ timeout: float|None = None,
60
+ lock_ttl: float |None = None,
61
+ poll_interval: float |None = None,
62
+ ) -> "LockManager":
59
63
  """
60
64
  Blocks until the lock is acquired or the timeout expires.
61
65
 
@@ -66,9 +70,18 @@ class LockManager:
66
70
  # This instance already holds the lock
67
71
  return self
68
72
 
73
+ if timeout is None:
74
+ timeout = self._timeout
75
+
76
+ if lock_ttl is None:
77
+ lock_ttl = self._lock_ttl
78
+
79
+ if poll_interval is None:
80
+ poll_interval = self._poll_interval
81
+
69
82
  start_time = time.time()
70
83
  requested_at = time.time()
71
- expires_at = requested_at + self._lock_ttl
84
+ expires_at = requested_at + lock_ttl
72
85
 
73
86
  conn = self._db.connection
74
87
 
@@ -113,19 +126,19 @@ class LockManager:
113
126
  return self
114
127
 
115
128
  # 5. Check for timeout
116
- if self._timeout is not None:
117
- if (time.time() - start_time) > self._timeout:
129
+ if timeout is not None:
130
+ if (time.time() - start_time) > timeout:
118
131
  # We timed out. Remove ourselves from the queue and raise.
119
132
  self._release_from_queue()
120
133
  raise TimeoutError(
121
- f"Failed to acquire lock '{self._lock_name}' within {self._timeout}s."
134
+ f"Failed to acquire lock '{self._lock_name}' within {timeout}s."
122
135
  )
123
136
 
124
137
  # 6. Wait politely before polling again
125
138
  # Add +/- 10% jitter to the poll interval to avoid thundering herd
126
- jitter = self._poll_interval * 0.1
139
+ jitter = poll_interval * 0.1
127
140
  sleep_time = random.uniform(
128
- self._poll_interval - jitter, self._poll_interval + jitter
141
+ poll_interval - jitter, poll_interval + jitter
129
142
  )
130
143
  time.sleep(sleep_time)
131
144
 
@@ -2,10 +2,9 @@ import asyncio
2
2
  import json
3
3
  import sqlite3
4
4
  import time
5
- from typing import Any, Literal, NamedTuple, Type, overload
6
-
5
+ from typing import Any, Literal, NamedTuple, Type, overload, Optional
7
6
  from .types import JsonSerializable, IDatabase
8
-
7
+ from .locks import LockManager
9
8
 
10
9
  class QueueItem[T](NamedTuple):
11
10
  """A data class representing a single item retrieved from the queue."""
@@ -54,6 +53,8 @@ class QueueManager[T]:
54
53
  self._name = name
55
54
  self._db = db
56
55
  self._model = model
56
+ lock_name = f"__lock__queue__{name}"
57
+ self._lock = LockManager(db, lock_name)
57
58
 
58
59
  def _serialize(self, value: T) -> str:
59
60
  """Serializes the given value to a JSON string."""
@@ -184,3 +185,37 @@ class QueueManager[T]:
184
185
 
185
186
  def __repr__(self) -> str:
186
187
  return f"QueueManager(name='{self._name}')"
188
+
189
+ def acquire(
190
+ self,
191
+ timeout: Optional[float] = None,
192
+ lock_ttl: Optional[float] = None,
193
+ poll_interval: Optional[float] = None,
194
+ ) -> "QueueManager[T]":
195
+ """
196
+ Acquires an inter-process lock on this queue, blocking until acquired.
197
+ This ensures that a sequence of operations (e.g., batch-getting tasks)
198
+ is performed atomically without interruption from other processes.
199
+
200
+ Parameters override the default settings of the underlying LockManager.
201
+ """
202
+ self._lock.acquire(
203
+ timeout=timeout,
204
+ lock_ttl=lock_ttl,
205
+ poll_interval=poll_interval
206
+ )
207
+ return self
208
+
209
+ def release(self):
210
+ """
211
+ Releases the inter-process lock on this queue.
212
+ """
213
+ self._lock.release()
214
+
215
+ def __enter__(self) -> "QueueManager[T]":
216
+ """Acquires the lock upon entering a 'with' statement."""
217
+ return self.acquire()
218
+
219
+ def __exit__(self, exc_type, exc_val, exc_tb):
220
+ """Releases the lock when exiting a 'with' statement."""
221
+ self.release()
@@ -0,0 +1,2 @@
1
+ /.quarto/
2
+ /_book/
@@ -0,0 +1 @@
1
+ {"dev-architecture.qmd":[],"dev-concurrency.qmd":[],"dev-contributing.qmd":[],"dev-search.qmd":[],"guide-collections.qmd":[],"guide-concurrency.qmd":[],"guide-deployment.qmd":[],"guide-dicts-blobs.qmd":[],"guide-lists-queues.qmd":[],"guide-realtime.qmd":[],"index.qmd":[],"intro.qmd":["knuth84"],"quickstart.qmd":[],"references.qmd":[],"summary.qmd":[]}
@@ -0,0 +1 @@
1
+ {"title":"Core Architecture & Design","markdown":{"headingText":"Core Architecture & Design","containsRefs":false,"markdown":"\n**Chapter Outline:**\n\n* **9.1. Guiding Principles (Developer Focus)**\n * A deeper dive into the \"Why\" from `design.md`.\n * Standard SQLite Compatibility as a \"no-magic\" rule.\n * Convention over Configuration.\n* **9.2. The Manager Delegation Pattern**\n * How `BeaverDB` acts as a factory.\n * How managers (e.g., `DictManager`) are initialized with a reference to the core `BeaverDB` connection pool.\n * How all tables are prefixed with `beaver_` to avoid user-space conflicts.\n* **9.3. Type-Safe Models (`beaver.Model`)**\n * Using the `model=...` parameter for automatic serialization and deserialization.\n * Inheriting from `beaver.Model` for a lightweight, Pydantic-compatible solution.\n","srcMarkdownNoYaml":""},"formats":{"html":{"identifier":{"display-name":"HTML","target-format":"html","base-format":"html"},"execute":{"fig-width":7,"fig-height":5,"fig-format":"retina","fig-dpi":96,"df-print":"default","error":false,"eval":true,"cache":null,"freeze":false,"echo":true,"output":true,"warning":true,"include":true,"keep-md":false,"keep-ipynb":false,"ipynb":null,"enabled":null,"daemon":null,"daemon-restart":false,"debug":false,"ipynb-filters":[],"ipynb-shell-interactivity":null,"plotly-connected":true,"engine":"markdown"},"render":{"keep-tex":false,"keep-typ":false,"keep-source":false,"keep-hidden":false,"prefer-html":false,"output-divs":true,"output-ext":"html","fig-align":"default","fig-pos":null,"fig-env":null,"code-fold":true,"code-overflow":"scroll","code-link":false,"code-line-numbers":true,"code-tools":false,"tbl-colwidths":"auto","merge-includes":true,"inline-includes":false,"preserve-yaml":false,"latex-auto-mk":true,"latex-auto-install":true,"latex-clean":true,"latex-min-runs":1,"latex-max-runs":10,"latex-makeindex":"makeindex","latex-makeindex-opts":[],"latex-tlmgr-opts":[],"latex-input-paths":[],"latex-output-dir":null,"link-external-icon":false,"link-external-newwindow":false,"self-contained-math":false,"format-resources":[],"notebook-links":true},"pandoc":{"standalone":true,"wrap":"none","default-image-extension":"png","to":"html","toc":true,"toc-depth":3,"output-file":"dev-architecture.html"},"language":{"toc-title-document":"Table of contents","toc-title-website":"On this page","related-formats-title":"Other Formats","related-notebooks-title":"Notebooks","source-notebooks-prefix":"Source","other-links-title":"Other Links","code-links-title":"Code Links","launch-dev-container-title":"Launch Dev Container","launch-binder-title":"Launch Binder","article-notebook-label":"Article Notebook","notebook-preview-download":"Download Notebook","notebook-preview-download-src":"Download Source","notebook-preview-back":"Back to Article","manuscript-meca-bundle":"MECA Bundle","section-title-abstract":"Abstract","section-title-appendices":"Appendices","section-title-footnotes":"Footnotes","section-title-references":"References","section-title-reuse":"Reuse","section-title-copyright":"Copyright","section-title-citation":"Citation","appendix-attribution-cite-as":"For attribution, please cite this work as:","appendix-attribution-bibtex":"BibTeX citation:","appendix-view-license":"View License","title-block-author-single":"Author","title-block-author-plural":"Authors","title-block-affiliation-single":"Affiliation","title-block-affiliation-plural":"Affiliations","title-block-published":"Published","title-block-modified":"Modified","title-block-keywords":"Keywords","callout-tip-title":"Tip","callout-note-title":"Note","callout-warning-title":"Warning","callout-important-title":"Important","callout-caution-title":"Caution","code-summary":"Code","code-tools-menu-caption":"Code","code-tools-show-all-code":"Show All Code","code-tools-hide-all-code":"Hide All Code","code-tools-view-source":"View Source","code-tools-source-code":"Source Code","tools-share":"Share","tools-download":"Download","code-line":"Line","code-lines":"Lines","copy-button-tooltip":"Copy to Clipboard","copy-button-tooltip-success":"Copied!","repo-action-links-edit":"Edit this page","repo-action-links-source":"View source","repo-action-links-issue":"Report an issue","back-to-top":"Back to top","search-no-results-text":"No results","search-matching-documents-text":"matching documents","search-copy-link-title":"Copy link to search","search-hide-matches-text":"Hide additional matches","search-more-match-text":"more match in this document","search-more-matches-text":"more matches in this document","search-clear-button-title":"Clear","search-text-placeholder":"","search-detached-cancel-button-title":"Cancel","search-submit-button-title":"Submit","search-label":"Search","toggle-section":"Toggle section","toggle-sidebar":"Toggle sidebar navigation","toggle-dark-mode":"Toggle dark mode","toggle-reader-mode":"Toggle reader mode","toggle-navigation":"Toggle navigation","crossref-fig-title":"Figure","crossref-tbl-title":"Table","crossref-lst-title":"Listing","crossref-thm-title":"Theorem","crossref-lem-title":"Lemma","crossref-cor-title":"Corollary","crossref-prp-title":"Proposition","crossref-cnj-title":"Conjecture","crossref-def-title":"Definition","crossref-exm-title":"Example","crossref-exr-title":"Exercise","crossref-ch-prefix":"Chapter","crossref-apx-prefix":"Appendix","crossref-sec-prefix":"Section","crossref-eq-prefix":"Equation","crossref-lof-title":"List of Figures","crossref-lot-title":"List of Tables","crossref-lol-title":"List of Listings","environment-proof-title":"Proof","environment-remark-title":"Remark","environment-solution-title":"Solution","listing-page-order-by":"Order By","listing-page-order-by-default":"Default","listing-page-order-by-date-asc":"Oldest","listing-page-order-by-date-desc":"Newest","listing-page-order-by-number-desc":"High to Low","listing-page-order-by-number-asc":"Low to High","listing-page-field-date":"Date","listing-page-field-title":"Title","listing-page-field-description":"Description","listing-page-field-author":"Author","listing-page-field-filename":"File Name","listing-page-field-filemodified":"Modified","listing-page-field-subtitle":"Subtitle","listing-page-field-readingtime":"Reading Time","listing-page-field-wordcount":"Word Count","listing-page-field-categories":"Categories","listing-page-minutes-compact":"{0} min","listing-page-category-all":"All","listing-page-no-matches":"No matching items","listing-page-words":"{0} words","listing-page-filter":"Filter","draft":"Draft"},"metadata":{"lang":"en","fig-responsive":true,"quarto-version":"1.7.30","theme":{"light":"cosmo","dark":"cyborg"},"code-copy":true,"mainfont":"Inter"},"extensions":{"book":{"multiFile":true}}},"pdf":{"identifier":{"display-name":"PDF","target-format":"pdf","base-format":"pdf"},"execute":{"fig-width":5.5,"fig-height":3.5,"fig-format":"pdf","fig-dpi":300,"df-print":"default","error":false,"eval":true,"cache":null,"freeze":false,"echo":true,"output":true,"warning":true,"include":true,"keep-md":false,"keep-ipynb":false,"ipynb":null,"enabled":null,"daemon":null,"daemon-restart":false,"debug":false,"ipynb-filters":[],"ipynb-shell-interactivity":null,"plotly-connected":true,"engine":"markdown"},"render":{"keep-tex":false,"keep-typ":false,"keep-source":false,"keep-hidden":false,"prefer-html":false,"output-divs":true,"output-ext":"pdf","fig-align":"default","fig-pos":null,"fig-env":null,"code-fold":"none","code-overflow":"scroll","code-link":false,"code-line-numbers":false,"code-tools":false,"tbl-colwidths":true,"merge-includes":true,"inline-includes":false,"preserve-yaml":false,"latex-auto-mk":true,"latex-auto-install":true,"latex-clean":true,"latex-min-runs":1,"latex-max-runs":10,"latex-makeindex":"makeindex","latex-makeindex-opts":[],"latex-tlmgr-opts":[],"latex-input-paths":[],"latex-output-dir":null,"link-external-icon":false,"link-external-newwindow":false,"self-contained-math":false,"format-resources":[]},"pandoc":{"pdf-engine":"xelatex","standalone":true,"variables":{"graphics":true,"tables":true},"default-image-extension":"pdf","to":"pdf","toc":true,"toc-depth":3,"number-sections":true,"output-file":"dev-architecture.pdf"},"language":{"toc-title-document":"Table of contents","toc-title-website":"On this page","related-formats-title":"Other Formats","related-notebooks-title":"Notebooks","source-notebooks-prefix":"Source","other-links-title":"Other Links","code-links-title":"Code Links","launch-dev-container-title":"Launch Dev Container","launch-binder-title":"Launch Binder","article-notebook-label":"Article Notebook","notebook-preview-download":"Download Notebook","notebook-preview-download-src":"Download Source","notebook-preview-back":"Back to Article","manuscript-meca-bundle":"MECA Bundle","section-title-abstract":"Abstract","section-title-appendices":"Appendices","section-title-footnotes":"Footnotes","section-title-references":"References","section-title-reuse":"Reuse","section-title-copyright":"Copyright","section-title-citation":"Citation","appendix-attribution-cite-as":"For attribution, please cite this work as:","appendix-attribution-bibtex":"BibTeX citation:","appendix-view-license":"View License","title-block-author-single":"Author","title-block-author-plural":"Authors","title-block-affiliation-single":"Affiliation","title-block-affiliation-plural":"Affiliations","title-block-published":"Published","title-block-modified":"Modified","title-block-keywords":"Keywords","callout-tip-title":"Tip","callout-note-title":"Note","callout-warning-title":"Warning","callout-important-title":"Important","callout-caution-title":"Caution","code-summary":"Code","code-tools-menu-caption":"Code","code-tools-show-all-code":"Show All Code","code-tools-hide-all-code":"Hide All Code","code-tools-view-source":"View Source","code-tools-source-code":"Source Code","tools-share":"Share","tools-download":"Download","code-line":"Line","code-lines":"Lines","copy-button-tooltip":"Copy to Clipboard","copy-button-tooltip-success":"Copied!","repo-action-links-edit":"Edit this page","repo-action-links-source":"View source","repo-action-links-issue":"Report an issue","back-to-top":"Back to top","search-no-results-text":"No results","search-matching-documents-text":"matching documents","search-copy-link-title":"Copy link to search","search-hide-matches-text":"Hide additional matches","search-more-match-text":"more match in this document","search-more-matches-text":"more matches in this document","search-clear-button-title":"Clear","search-text-placeholder":"","search-detached-cancel-button-title":"Cancel","search-submit-button-title":"Submit","search-label":"Search","toggle-section":"Toggle section","toggle-sidebar":"Toggle sidebar navigation","toggle-dark-mode":"Toggle dark mode","toggle-reader-mode":"Toggle reader mode","toggle-navigation":"Toggle navigation","crossref-fig-title":"Figure","crossref-tbl-title":"Table","crossref-lst-title":"Listing","crossref-thm-title":"Theorem","crossref-lem-title":"Lemma","crossref-cor-title":"Corollary","crossref-prp-title":"Proposition","crossref-cnj-title":"Conjecture","crossref-def-title":"Definition","crossref-exm-title":"Example","crossref-exr-title":"Exercise","crossref-ch-prefix":"Chapter","crossref-apx-prefix":"Appendix","crossref-sec-prefix":"Section","crossref-eq-prefix":"Equation","crossref-lof-title":"List of Figures","crossref-lot-title":"List of Tables","crossref-lol-title":"List of Listings","environment-proof-title":"Proof","environment-remark-title":"Remark","environment-solution-title":"Solution","listing-page-order-by":"Order By","listing-page-order-by-default":"Default","listing-page-order-by-date-asc":"Oldest","listing-page-order-by-date-desc":"Newest","listing-page-order-by-number-desc":"High to Low","listing-page-order-by-number-asc":"Low to High","listing-page-field-date":"Date","listing-page-field-title":"Title","listing-page-field-description":"Description","listing-page-field-author":"Author","listing-page-field-filename":"File Name","listing-page-field-filemodified":"Modified","listing-page-field-subtitle":"Subtitle","listing-page-field-readingtime":"Reading Time","listing-page-field-wordcount":"Word Count","listing-page-field-categories":"Categories","listing-page-minutes-compact":"{0} min","listing-page-category-all":"All","listing-page-no-matches":"No matching items","listing-page-words":"{0} words","listing-page-filter":"Filter","draft":"Draft"},"metadata":{"block-headings":true,"documentclass":"scrreprt","papersize":"a4","colorlinks":true},"extensions":{"book":{"selfContainedOutput":true}}}},"projectFormats":["html","pdf"]}
@@ -0,0 +1 @@
1
+ {"title":"Concurrency Model","markdown":{"headingText":"Concurrency Model","containsRefs":false,"markdown":"\n**Chapter Outline:**\n\n* **10.1. Thread Safety (`threading.local`)**\n * How BeaverDB provides a unique `sqlite3.Connection` for *every thread*.\n * Why this is the key to preventing thread-related errors.\n * Enabling WAL (Write-Ahead Logging) for concurrent reads.\n* **10.2. Inter-Process Locking (The Implementation)**\n * How `db.lock()` works under the hood.\n * The `beaver_lock_waiters` table as a fair (FIFO) queue.\n * The `expires_at` column as a deadlock-prevention (TTL) mechanism.\n* **10.3. The Asynchronous `.as_async()` Pattern**\n * How the `Async...Manager` wrappers are implemented.\n * Using `asyncio.to_thread` to run blocking I/O without blocking the event loop.\n","srcMarkdownNoYaml":""},"formats":{"html":{"identifier":{"display-name":"HTML","target-format":"html","base-format":"html"},"execute":{"fig-width":7,"fig-height":5,"fig-format":"retina","fig-dpi":96,"df-print":"default","error":false,"eval":true,"cache":null,"freeze":false,"echo":true,"output":true,"warning":true,"include":true,"keep-md":false,"keep-ipynb":false,"ipynb":null,"enabled":null,"daemon":null,"daemon-restart":false,"debug":false,"ipynb-filters":[],"ipynb-shell-interactivity":null,"plotly-connected":true,"engine":"markdown"},"render":{"keep-tex":false,"keep-typ":false,"keep-source":false,"keep-hidden":false,"prefer-html":false,"output-divs":true,"output-ext":"html","fig-align":"default","fig-pos":null,"fig-env":null,"code-fold":true,"code-overflow":"scroll","code-link":false,"code-line-numbers":true,"code-tools":false,"tbl-colwidths":"auto","merge-includes":true,"inline-includes":false,"preserve-yaml":false,"latex-auto-mk":true,"latex-auto-install":true,"latex-clean":true,"latex-min-runs":1,"latex-max-runs":10,"latex-makeindex":"makeindex","latex-makeindex-opts":[],"latex-tlmgr-opts":[],"latex-input-paths":[],"latex-output-dir":null,"link-external-icon":false,"link-external-newwindow":false,"self-contained-math":false,"format-resources":[],"notebook-links":true},"pandoc":{"standalone":true,"wrap":"none","default-image-extension":"png","to":"html","toc":true,"toc-depth":3,"output-file":"dev-concurrency.html"},"language":{"toc-title-document":"Table of contents","toc-title-website":"On this page","related-formats-title":"Other Formats","related-notebooks-title":"Notebooks","source-notebooks-prefix":"Source","other-links-title":"Other Links","code-links-title":"Code Links","launch-dev-container-title":"Launch Dev Container","launch-binder-title":"Launch Binder","article-notebook-label":"Article Notebook","notebook-preview-download":"Download Notebook","notebook-preview-download-src":"Download Source","notebook-preview-back":"Back to Article","manuscript-meca-bundle":"MECA Bundle","section-title-abstract":"Abstract","section-title-appendices":"Appendices","section-title-footnotes":"Footnotes","section-title-references":"References","section-title-reuse":"Reuse","section-title-copyright":"Copyright","section-title-citation":"Citation","appendix-attribution-cite-as":"For attribution, please cite this work as:","appendix-attribution-bibtex":"BibTeX citation:","appendix-view-license":"View License","title-block-author-single":"Author","title-block-author-plural":"Authors","title-block-affiliation-single":"Affiliation","title-block-affiliation-plural":"Affiliations","title-block-published":"Published","title-block-modified":"Modified","title-block-keywords":"Keywords","callout-tip-title":"Tip","callout-note-title":"Note","callout-warning-title":"Warning","callout-important-title":"Important","callout-caution-title":"Caution","code-summary":"Code","code-tools-menu-caption":"Code","code-tools-show-all-code":"Show All Code","code-tools-hide-all-code":"Hide All Code","code-tools-view-source":"View Source","code-tools-source-code":"Source Code","tools-share":"Share","tools-download":"Download","code-line":"Line","code-lines":"Lines","copy-button-tooltip":"Copy to Clipboard","copy-button-tooltip-success":"Copied!","repo-action-links-edit":"Edit this page","repo-action-links-source":"View source","repo-action-links-issue":"Report an issue","back-to-top":"Back to top","search-no-results-text":"No results","search-matching-documents-text":"matching documents","search-copy-link-title":"Copy link to search","search-hide-matches-text":"Hide additional matches","search-more-match-text":"more match in this document","search-more-matches-text":"more matches in this document","search-clear-button-title":"Clear","search-text-placeholder":"","search-detached-cancel-button-title":"Cancel","search-submit-button-title":"Submit","search-label":"Search","toggle-section":"Toggle section","toggle-sidebar":"Toggle sidebar navigation","toggle-dark-mode":"Toggle dark mode","toggle-reader-mode":"Toggle reader mode","toggle-navigation":"Toggle navigation","crossref-fig-title":"Figure","crossref-tbl-title":"Table","crossref-lst-title":"Listing","crossref-thm-title":"Theorem","crossref-lem-title":"Lemma","crossref-cor-title":"Corollary","crossref-prp-title":"Proposition","crossref-cnj-title":"Conjecture","crossref-def-title":"Definition","crossref-exm-title":"Example","crossref-exr-title":"Exercise","crossref-ch-prefix":"Chapter","crossref-apx-prefix":"Appendix","crossref-sec-prefix":"Section","crossref-eq-prefix":"Equation","crossref-lof-title":"List of Figures","crossref-lot-title":"List of Tables","crossref-lol-title":"List of Listings","environment-proof-title":"Proof","environment-remark-title":"Remark","environment-solution-title":"Solution","listing-page-order-by":"Order By","listing-page-order-by-default":"Default","listing-page-order-by-date-asc":"Oldest","listing-page-order-by-date-desc":"Newest","listing-page-order-by-number-desc":"High to Low","listing-page-order-by-number-asc":"Low to High","listing-page-field-date":"Date","listing-page-field-title":"Title","listing-page-field-description":"Description","listing-page-field-author":"Author","listing-page-field-filename":"File Name","listing-page-field-filemodified":"Modified","listing-page-field-subtitle":"Subtitle","listing-page-field-readingtime":"Reading Time","listing-page-field-wordcount":"Word Count","listing-page-field-categories":"Categories","listing-page-minutes-compact":"{0} min","listing-page-category-all":"All","listing-page-no-matches":"No matching items","listing-page-words":"{0} words","listing-page-filter":"Filter","draft":"Draft"},"metadata":{"lang":"en","fig-responsive":true,"quarto-version":"1.7.30","theme":{"light":"cosmo","dark":"cyborg"},"code-copy":true,"mainfont":"Inter"},"extensions":{"book":{"multiFile":true}}},"pdf":{"identifier":{"display-name":"PDF","target-format":"pdf","base-format":"pdf"},"execute":{"fig-width":5.5,"fig-height":3.5,"fig-format":"pdf","fig-dpi":300,"df-print":"default","error":false,"eval":true,"cache":null,"freeze":false,"echo":true,"output":true,"warning":true,"include":true,"keep-md":false,"keep-ipynb":false,"ipynb":null,"enabled":null,"daemon":null,"daemon-restart":false,"debug":false,"ipynb-filters":[],"ipynb-shell-interactivity":null,"plotly-connected":true,"engine":"markdown"},"render":{"keep-tex":false,"keep-typ":false,"keep-source":false,"keep-hidden":false,"prefer-html":false,"output-divs":true,"output-ext":"pdf","fig-align":"default","fig-pos":null,"fig-env":null,"code-fold":"none","code-overflow":"scroll","code-link":false,"code-line-numbers":false,"code-tools":false,"tbl-colwidths":true,"merge-includes":true,"inline-includes":false,"preserve-yaml":false,"latex-auto-mk":true,"latex-auto-install":true,"latex-clean":true,"latex-min-runs":1,"latex-max-runs":10,"latex-makeindex":"makeindex","latex-makeindex-opts":[],"latex-tlmgr-opts":[],"latex-input-paths":[],"latex-output-dir":null,"link-external-icon":false,"link-external-newwindow":false,"self-contained-math":false,"format-resources":[]},"pandoc":{"pdf-engine":"xelatex","standalone":true,"variables":{"graphics":true,"tables":true},"default-image-extension":"pdf","to":"pdf","toc":true,"toc-depth":3,"number-sections":true,"output-file":"dev-concurrency.pdf"},"language":{"toc-title-document":"Table of contents","toc-title-website":"On this page","related-formats-title":"Other Formats","related-notebooks-title":"Notebooks","source-notebooks-prefix":"Source","other-links-title":"Other Links","code-links-title":"Code Links","launch-dev-container-title":"Launch Dev Container","launch-binder-title":"Launch Binder","article-notebook-label":"Article Notebook","notebook-preview-download":"Download Notebook","notebook-preview-download-src":"Download Source","notebook-preview-back":"Back to Article","manuscript-meca-bundle":"MECA Bundle","section-title-abstract":"Abstract","section-title-appendices":"Appendices","section-title-footnotes":"Footnotes","section-title-references":"References","section-title-reuse":"Reuse","section-title-copyright":"Copyright","section-title-citation":"Citation","appendix-attribution-cite-as":"For attribution, please cite this work as:","appendix-attribution-bibtex":"BibTeX citation:","appendix-view-license":"View License","title-block-author-single":"Author","title-block-author-plural":"Authors","title-block-affiliation-single":"Affiliation","title-block-affiliation-plural":"Affiliations","title-block-published":"Published","title-block-modified":"Modified","title-block-keywords":"Keywords","callout-tip-title":"Tip","callout-note-title":"Note","callout-warning-title":"Warning","callout-important-title":"Important","callout-caution-title":"Caution","code-summary":"Code","code-tools-menu-caption":"Code","code-tools-show-all-code":"Show All Code","code-tools-hide-all-code":"Hide All Code","code-tools-view-source":"View Source","code-tools-source-code":"Source Code","tools-share":"Share","tools-download":"Download","code-line":"Line","code-lines":"Lines","copy-button-tooltip":"Copy to Clipboard","copy-button-tooltip-success":"Copied!","repo-action-links-edit":"Edit this page","repo-action-links-source":"View source","repo-action-links-issue":"Report an issue","back-to-top":"Back to top","search-no-results-text":"No results","search-matching-documents-text":"matching documents","search-copy-link-title":"Copy link to search","search-hide-matches-text":"Hide additional matches","search-more-match-text":"more match in this document","search-more-matches-text":"more matches in this document","search-clear-button-title":"Clear","search-text-placeholder":"","search-detached-cancel-button-title":"Cancel","search-submit-button-title":"Submit","search-label":"Search","toggle-section":"Toggle section","toggle-sidebar":"Toggle sidebar navigation","toggle-dark-mode":"Toggle dark mode","toggle-reader-mode":"Toggle reader mode","toggle-navigation":"Toggle navigation","crossref-fig-title":"Figure","crossref-tbl-title":"Table","crossref-lst-title":"Listing","crossref-thm-title":"Theorem","crossref-lem-title":"Lemma","crossref-cor-title":"Corollary","crossref-prp-title":"Proposition","crossref-cnj-title":"Conjecture","crossref-def-title":"Definition","crossref-exm-title":"Example","crossref-exr-title":"Exercise","crossref-ch-prefix":"Chapter","crossref-apx-prefix":"Appendix","crossref-sec-prefix":"Section","crossref-eq-prefix":"Equation","crossref-lof-title":"List of Figures","crossref-lot-title":"List of Tables","crossref-lol-title":"List of Listings","environment-proof-title":"Proof","environment-remark-title":"Remark","environment-solution-title":"Solution","listing-page-order-by":"Order By","listing-page-order-by-default":"Default","listing-page-order-by-date-asc":"Oldest","listing-page-order-by-date-desc":"Newest","listing-page-order-by-number-desc":"High to Low","listing-page-order-by-number-asc":"Low to High","listing-page-field-date":"Date","listing-page-field-title":"Title","listing-page-field-description":"Description","listing-page-field-author":"Author","listing-page-field-filename":"File Name","listing-page-field-filemodified":"Modified","listing-page-field-subtitle":"Subtitle","listing-page-field-readingtime":"Reading Time","listing-page-field-wordcount":"Word Count","listing-page-field-categories":"Categories","listing-page-minutes-compact":"{0} min","listing-page-category-all":"All","listing-page-no-matches":"No matching items","listing-page-words":"{0} words","listing-page-filter":"Filter","draft":"Draft"},"metadata":{"block-headings":true,"documentclass":"scrreprt","papersize":"a4","colorlinks":true},"extensions":{"book":{"selfContainedOutput":true}}}},"projectFormats":["html","pdf"]}
@@ -0,0 +1 @@
1
+ {"title":"Future Roadmap & Contributing","markdown":{"headingText":"Future Roadmap & Contributing","containsRefs":false,"markdown":"\n**Chapter Outline:**\n\n* **12.1. The Future of BeaverDB**\n * The `BeaverClient` as a drop-in network client.\n * Replacing `faiss` with a simpler, pure-`numpy` linear search.\n* **12.2. How to Contribute**\n * (Standard contribution guidelines, linking to Makefile, etc.)\n","srcMarkdownNoYaml":""},"formats":{"html":{"identifier":{"display-name":"HTML","target-format":"html","base-format":"html"},"execute":{"fig-width":7,"fig-height":5,"fig-format":"retina","fig-dpi":96,"df-print":"default","error":false,"eval":true,"cache":null,"freeze":false,"echo":true,"output":true,"warning":true,"include":true,"keep-md":false,"keep-ipynb":false,"ipynb":null,"enabled":null,"daemon":null,"daemon-restart":false,"debug":false,"ipynb-filters":[],"ipynb-shell-interactivity":null,"plotly-connected":true,"engine":"markdown"},"render":{"keep-tex":false,"keep-typ":false,"keep-source":false,"keep-hidden":false,"prefer-html":false,"output-divs":true,"output-ext":"html","fig-align":"default","fig-pos":null,"fig-env":null,"code-fold":true,"code-overflow":"scroll","code-link":false,"code-line-numbers":true,"code-tools":false,"tbl-colwidths":"auto","merge-includes":true,"inline-includes":false,"preserve-yaml":false,"latex-auto-mk":true,"latex-auto-install":true,"latex-clean":true,"latex-min-runs":1,"latex-max-runs":10,"latex-makeindex":"makeindex","latex-makeindex-opts":[],"latex-tlmgr-opts":[],"latex-input-paths":[],"latex-output-dir":null,"link-external-icon":false,"link-external-newwindow":false,"self-contained-math":false,"format-resources":[],"notebook-links":true},"pandoc":{"standalone":true,"wrap":"none","default-image-extension":"png","to":"html","toc":true,"toc-depth":3,"output-file":"dev-contributing.html"},"language":{"toc-title-document":"Table of contents","toc-title-website":"On this page","related-formats-title":"Other Formats","related-notebooks-title":"Notebooks","source-notebooks-prefix":"Source","other-links-title":"Other Links","code-links-title":"Code Links","launch-dev-container-title":"Launch Dev Container","launch-binder-title":"Launch Binder","article-notebook-label":"Article Notebook","notebook-preview-download":"Download Notebook","notebook-preview-download-src":"Download Source","notebook-preview-back":"Back to Article","manuscript-meca-bundle":"MECA Bundle","section-title-abstract":"Abstract","section-title-appendices":"Appendices","section-title-footnotes":"Footnotes","section-title-references":"References","section-title-reuse":"Reuse","section-title-copyright":"Copyright","section-title-citation":"Citation","appendix-attribution-cite-as":"For attribution, please cite this work as:","appendix-attribution-bibtex":"BibTeX citation:","appendix-view-license":"View License","title-block-author-single":"Author","title-block-author-plural":"Authors","title-block-affiliation-single":"Affiliation","title-block-affiliation-plural":"Affiliations","title-block-published":"Published","title-block-modified":"Modified","title-block-keywords":"Keywords","callout-tip-title":"Tip","callout-note-title":"Note","callout-warning-title":"Warning","callout-important-title":"Important","callout-caution-title":"Caution","code-summary":"Code","code-tools-menu-caption":"Code","code-tools-show-all-code":"Show All Code","code-tools-hide-all-code":"Hide All Code","code-tools-view-source":"View Source","code-tools-source-code":"Source Code","tools-share":"Share","tools-download":"Download","code-line":"Line","code-lines":"Lines","copy-button-tooltip":"Copy to Clipboard","copy-button-tooltip-success":"Copied!","repo-action-links-edit":"Edit this page","repo-action-links-source":"View source","repo-action-links-issue":"Report an issue","back-to-top":"Back to top","search-no-results-text":"No results","search-matching-documents-text":"matching documents","search-copy-link-title":"Copy link to search","search-hide-matches-text":"Hide additional matches","search-more-match-text":"more match in this document","search-more-matches-text":"more matches in this document","search-clear-button-title":"Clear","search-text-placeholder":"","search-detached-cancel-button-title":"Cancel","search-submit-button-title":"Submit","search-label":"Search","toggle-section":"Toggle section","toggle-sidebar":"Toggle sidebar navigation","toggle-dark-mode":"Toggle dark mode","toggle-reader-mode":"Toggle reader mode","toggle-navigation":"Toggle navigation","crossref-fig-title":"Figure","crossref-tbl-title":"Table","crossref-lst-title":"Listing","crossref-thm-title":"Theorem","crossref-lem-title":"Lemma","crossref-cor-title":"Corollary","crossref-prp-title":"Proposition","crossref-cnj-title":"Conjecture","crossref-def-title":"Definition","crossref-exm-title":"Example","crossref-exr-title":"Exercise","crossref-ch-prefix":"Chapter","crossref-apx-prefix":"Appendix","crossref-sec-prefix":"Section","crossref-eq-prefix":"Equation","crossref-lof-title":"List of Figures","crossref-lot-title":"List of Tables","crossref-lol-title":"List of Listings","environment-proof-title":"Proof","environment-remark-title":"Remark","environment-solution-title":"Solution","listing-page-order-by":"Order By","listing-page-order-by-default":"Default","listing-page-order-by-date-asc":"Oldest","listing-page-order-by-date-desc":"Newest","listing-page-order-by-number-desc":"High to Low","listing-page-order-by-number-asc":"Low to High","listing-page-field-date":"Date","listing-page-field-title":"Title","listing-page-field-description":"Description","listing-page-field-author":"Author","listing-page-field-filename":"File Name","listing-page-field-filemodified":"Modified","listing-page-field-subtitle":"Subtitle","listing-page-field-readingtime":"Reading Time","listing-page-field-wordcount":"Word Count","listing-page-field-categories":"Categories","listing-page-minutes-compact":"{0} min","listing-page-category-all":"All","listing-page-no-matches":"No matching items","listing-page-words":"{0} words","listing-page-filter":"Filter","draft":"Draft"},"metadata":{"lang":"en","fig-responsive":true,"quarto-version":"1.7.30","theme":{"light":"cosmo","dark":"cyborg"},"code-copy":true,"mainfont":"Inter"},"extensions":{"book":{"multiFile":true}}},"pdf":{"identifier":{"display-name":"PDF","target-format":"pdf","base-format":"pdf"},"execute":{"fig-width":5.5,"fig-height":3.5,"fig-format":"pdf","fig-dpi":300,"df-print":"default","error":false,"eval":true,"cache":null,"freeze":false,"echo":true,"output":true,"warning":true,"include":true,"keep-md":false,"keep-ipynb":false,"ipynb":null,"enabled":null,"daemon":null,"daemon-restart":false,"debug":false,"ipynb-filters":[],"ipynb-shell-interactivity":null,"plotly-connected":true,"engine":"markdown"},"render":{"keep-tex":false,"keep-typ":false,"keep-source":false,"keep-hidden":false,"prefer-html":false,"output-divs":true,"output-ext":"pdf","fig-align":"default","fig-pos":null,"fig-env":null,"code-fold":"none","code-overflow":"scroll","code-link":false,"code-line-numbers":false,"code-tools":false,"tbl-colwidths":true,"merge-includes":true,"inline-includes":false,"preserve-yaml":false,"latex-auto-mk":true,"latex-auto-install":true,"latex-clean":true,"latex-min-runs":1,"latex-max-runs":10,"latex-makeindex":"makeindex","latex-makeindex-opts":[],"latex-tlmgr-opts":[],"latex-input-paths":[],"latex-output-dir":null,"link-external-icon":false,"link-external-newwindow":false,"self-contained-math":false,"format-resources":[]},"pandoc":{"pdf-engine":"xelatex","standalone":true,"variables":{"graphics":true,"tables":true},"default-image-extension":"pdf","to":"pdf","toc":true,"toc-depth":3,"number-sections":true,"output-file":"dev-contributing.pdf"},"language":{"toc-title-document":"Table of contents","toc-title-website":"On this page","related-formats-title":"Other Formats","related-notebooks-title":"Notebooks","source-notebooks-prefix":"Source","other-links-title":"Other Links","code-links-title":"Code Links","launch-dev-container-title":"Launch Dev Container","launch-binder-title":"Launch Binder","article-notebook-label":"Article Notebook","notebook-preview-download":"Download Notebook","notebook-preview-download-src":"Download Source","notebook-preview-back":"Back to Article","manuscript-meca-bundle":"MECA Bundle","section-title-abstract":"Abstract","section-title-appendices":"Appendices","section-title-footnotes":"Footnotes","section-title-references":"References","section-title-reuse":"Reuse","section-title-copyright":"Copyright","section-title-citation":"Citation","appendix-attribution-cite-as":"For attribution, please cite this work as:","appendix-attribution-bibtex":"BibTeX citation:","appendix-view-license":"View License","title-block-author-single":"Author","title-block-author-plural":"Authors","title-block-affiliation-single":"Affiliation","title-block-affiliation-plural":"Affiliations","title-block-published":"Published","title-block-modified":"Modified","title-block-keywords":"Keywords","callout-tip-title":"Tip","callout-note-title":"Note","callout-warning-title":"Warning","callout-important-title":"Important","callout-caution-title":"Caution","code-summary":"Code","code-tools-menu-caption":"Code","code-tools-show-all-code":"Show All Code","code-tools-hide-all-code":"Hide All Code","code-tools-view-source":"View Source","code-tools-source-code":"Source Code","tools-share":"Share","tools-download":"Download","code-line":"Line","code-lines":"Lines","copy-button-tooltip":"Copy to Clipboard","copy-button-tooltip-success":"Copied!","repo-action-links-edit":"Edit this page","repo-action-links-source":"View source","repo-action-links-issue":"Report an issue","back-to-top":"Back to top","search-no-results-text":"No results","search-matching-documents-text":"matching documents","search-copy-link-title":"Copy link to search","search-hide-matches-text":"Hide additional matches","search-more-match-text":"more match in this document","search-more-matches-text":"more matches in this document","search-clear-button-title":"Clear","search-text-placeholder":"","search-detached-cancel-button-title":"Cancel","search-submit-button-title":"Submit","search-label":"Search","toggle-section":"Toggle section","toggle-sidebar":"Toggle sidebar navigation","toggle-dark-mode":"Toggle dark mode","toggle-reader-mode":"Toggle reader mode","toggle-navigation":"Toggle navigation","crossref-fig-title":"Figure","crossref-tbl-title":"Table","crossref-lst-title":"Listing","crossref-thm-title":"Theorem","crossref-lem-title":"Lemma","crossref-cor-title":"Corollary","crossref-prp-title":"Proposition","crossref-cnj-title":"Conjecture","crossref-def-title":"Definition","crossref-exm-title":"Example","crossref-exr-title":"Exercise","crossref-ch-prefix":"Chapter","crossref-apx-prefix":"Appendix","crossref-sec-prefix":"Section","crossref-eq-prefix":"Equation","crossref-lof-title":"List of Figures","crossref-lot-title":"List of Tables","crossref-lol-title":"List of Listings","environment-proof-title":"Proof","environment-remark-title":"Remark","environment-solution-title":"Solution","listing-page-order-by":"Order By","listing-page-order-by-default":"Default","listing-page-order-by-date-asc":"Oldest","listing-page-order-by-date-desc":"Newest","listing-page-order-by-number-desc":"High to Low","listing-page-order-by-number-asc":"Low to High","listing-page-field-date":"Date","listing-page-field-title":"Title","listing-page-field-description":"Description","listing-page-field-author":"Author","listing-page-field-filename":"File Name","listing-page-field-filemodified":"Modified","listing-page-field-subtitle":"Subtitle","listing-page-field-readingtime":"Reading Time","listing-page-field-wordcount":"Word Count","listing-page-field-categories":"Categories","listing-page-minutes-compact":"{0} min","listing-page-category-all":"All","listing-page-no-matches":"No matching items","listing-page-words":"{0} words","listing-page-filter":"Filter","draft":"Draft"},"metadata":{"block-headings":true,"documentclass":"scrreprt","papersize":"a4","colorlinks":true},"extensions":{"book":{"selfContainedOutput":true}}}},"projectFormats":["html","pdf"]}
@@ -0,0 +1 @@
1
+ {"title":"Search Architecture","markdown":{"headingText":"Search Architecture","containsRefs":false,"markdown":"\n**Chapter Outline:**\n\n* **11.1. Vector Search (ANN) Internals**\n * The \"Hybrid Index System\": Base Index and Delta Index.\n * **Crash-Safe Logging:** How additions and deletions are written to SQLite logs (`_beaver_ann_...` tables).\n * **Background Compaction:** The `compact()` process.\n* **11.2. Text Search (FTS & Fuzzy) Internals**\n * **FTS:** How `beaver_fts_index` is a `fts5` virtual table.\n * **Fuzzy Search:** How BeaverDB builds a custom trigram index (`beaver_trigrams` table) and uses Levenshtein distance.\n","srcMarkdownNoYaml":""},"formats":{"html":{"identifier":{"display-name":"HTML","target-format":"html","base-format":"html"},"execute":{"fig-width":7,"fig-height":5,"fig-format":"retina","fig-dpi":96,"df-print":"default","error":false,"eval":true,"cache":null,"freeze":false,"echo":true,"output":true,"warning":true,"include":true,"keep-md":false,"keep-ipynb":false,"ipynb":null,"enabled":null,"daemon":null,"daemon-restart":false,"debug":false,"ipynb-filters":[],"ipynb-shell-interactivity":null,"plotly-connected":true,"engine":"markdown"},"render":{"keep-tex":false,"keep-typ":false,"keep-source":false,"keep-hidden":false,"prefer-html":false,"output-divs":true,"output-ext":"html","fig-align":"default","fig-pos":null,"fig-env":null,"code-fold":true,"code-overflow":"scroll","code-link":false,"code-line-numbers":true,"code-tools":false,"tbl-colwidths":"auto","merge-includes":true,"inline-includes":false,"preserve-yaml":false,"latex-auto-mk":true,"latex-auto-install":true,"latex-clean":true,"latex-min-runs":1,"latex-max-runs":10,"latex-makeindex":"makeindex","latex-makeindex-opts":[],"latex-tlmgr-opts":[],"latex-input-paths":[],"latex-output-dir":null,"link-external-icon":false,"link-external-newwindow":false,"self-contained-math":false,"format-resources":[],"notebook-links":true},"pandoc":{"standalone":true,"wrap":"none","default-image-extension":"png","to":"html","toc":true,"toc-depth":3,"output-file":"dev-search.html"},"language":{"toc-title-document":"Table of contents","toc-title-website":"On this page","related-formats-title":"Other Formats","related-notebooks-title":"Notebooks","source-notebooks-prefix":"Source","other-links-title":"Other Links","code-links-title":"Code Links","launch-dev-container-title":"Launch Dev Container","launch-binder-title":"Launch Binder","article-notebook-label":"Article Notebook","notebook-preview-download":"Download Notebook","notebook-preview-download-src":"Download Source","notebook-preview-back":"Back to Article","manuscript-meca-bundle":"MECA Bundle","section-title-abstract":"Abstract","section-title-appendices":"Appendices","section-title-footnotes":"Footnotes","section-title-references":"References","section-title-reuse":"Reuse","section-title-copyright":"Copyright","section-title-citation":"Citation","appendix-attribution-cite-as":"For attribution, please cite this work as:","appendix-attribution-bibtex":"BibTeX citation:","appendix-view-license":"View License","title-block-author-single":"Author","title-block-author-plural":"Authors","title-block-affiliation-single":"Affiliation","title-block-affiliation-plural":"Affiliations","title-block-published":"Published","title-block-modified":"Modified","title-block-keywords":"Keywords","callout-tip-title":"Tip","callout-note-title":"Note","callout-warning-title":"Warning","callout-important-title":"Important","callout-caution-title":"Caution","code-summary":"Code","code-tools-menu-caption":"Code","code-tools-show-all-code":"Show All Code","code-tools-hide-all-code":"Hide All Code","code-tools-view-source":"View Source","code-tools-source-code":"Source Code","tools-share":"Share","tools-download":"Download","code-line":"Line","code-lines":"Lines","copy-button-tooltip":"Copy to Clipboard","copy-button-tooltip-success":"Copied!","repo-action-links-edit":"Edit this page","repo-action-links-source":"View source","repo-action-links-issue":"Report an issue","back-to-top":"Back to top","search-no-results-text":"No results","search-matching-documents-text":"matching documents","search-copy-link-title":"Copy link to search","search-hide-matches-text":"Hide additional matches","search-more-match-text":"more match in this document","search-more-matches-text":"more matches in this document","search-clear-button-title":"Clear","search-text-placeholder":"","search-detached-cancel-button-title":"Cancel","search-submit-button-title":"Submit","search-label":"Search","toggle-section":"Toggle section","toggle-sidebar":"Toggle sidebar navigation","toggle-dark-mode":"Toggle dark mode","toggle-reader-mode":"Toggle reader mode","toggle-navigation":"Toggle navigation","crossref-fig-title":"Figure","crossref-tbl-title":"Table","crossref-lst-title":"Listing","crossref-thm-title":"Theorem","crossref-lem-title":"Lemma","crossref-cor-title":"Corollary","crossref-prp-title":"Proposition","crossref-cnj-title":"Conjecture","crossref-def-title":"Definition","crossref-exm-title":"Example","crossref-exr-title":"Exercise","crossref-ch-prefix":"Chapter","crossref-apx-prefix":"Appendix","crossref-sec-prefix":"Section","crossref-eq-prefix":"Equation","crossref-lof-title":"List of Figures","crossref-lot-title":"List of Tables","crossref-lol-title":"List of Listings","environment-proof-title":"Proof","environment-remark-title":"Remark","environment-solution-title":"Solution","listing-page-order-by":"Order By","listing-page-order-by-default":"Default","listing-page-order-by-date-asc":"Oldest","listing-page-order-by-date-desc":"Newest","listing-page-order-by-number-desc":"High to Low","listing-page-order-by-number-asc":"Low to High","listing-page-field-date":"Date","listing-page-field-title":"Title","listing-page-field-description":"Description","listing-page-field-author":"Author","listing-page-field-filename":"File Name","listing-page-field-filemodified":"Modified","listing-page-field-subtitle":"Subtitle","listing-page-field-readingtime":"Reading Time","listing-page-field-wordcount":"Word Count","listing-page-field-categories":"Categories","listing-page-minutes-compact":"{0} min","listing-page-category-all":"All","listing-page-no-matches":"No matching items","listing-page-words":"{0} words","listing-page-filter":"Filter","draft":"Draft"},"metadata":{"lang":"en","fig-responsive":true,"quarto-version":"1.7.30","theme":{"light":"cosmo","dark":"cyborg"},"code-copy":true,"mainfont":"Inter"},"extensions":{"book":{"multiFile":true}}},"pdf":{"identifier":{"display-name":"PDF","target-format":"pdf","base-format":"pdf"},"execute":{"fig-width":5.5,"fig-height":3.5,"fig-format":"pdf","fig-dpi":300,"df-print":"default","error":false,"eval":true,"cache":null,"freeze":false,"echo":true,"output":true,"warning":true,"include":true,"keep-md":false,"keep-ipynb":false,"ipynb":null,"enabled":null,"daemon":null,"daemon-restart":false,"debug":false,"ipynb-filters":[],"ipynb-shell-interactivity":null,"plotly-connected":true,"engine":"markdown"},"render":{"keep-tex":false,"keep-typ":false,"keep-source":false,"keep-hidden":false,"prefer-html":false,"output-divs":true,"output-ext":"pdf","fig-align":"default","fig-pos":null,"fig-env":null,"code-fold":"none","code-overflow":"scroll","code-link":false,"code-line-numbers":false,"code-tools":false,"tbl-colwidths":true,"merge-includes":true,"inline-includes":false,"preserve-yaml":false,"latex-auto-mk":true,"latex-auto-install":true,"latex-clean":true,"latex-min-runs":1,"latex-max-runs":10,"latex-makeindex":"makeindex","latex-makeindex-opts":[],"latex-tlmgr-opts":[],"latex-input-paths":[],"latex-output-dir":null,"link-external-icon":false,"link-external-newwindow":false,"self-contained-math":false,"format-resources":[]},"pandoc":{"pdf-engine":"xelatex","standalone":true,"variables":{"graphics":true,"tables":true},"default-image-extension":"pdf","to":"pdf","toc":true,"toc-depth":3,"number-sections":true,"output-file":"dev-search.pdf"},"language":{"toc-title-document":"Table of contents","toc-title-website":"On this page","related-formats-title":"Other Formats","related-notebooks-title":"Notebooks","source-notebooks-prefix":"Source","other-links-title":"Other Links","code-links-title":"Code Links","launch-dev-container-title":"Launch Dev Container","launch-binder-title":"Launch Binder","article-notebook-label":"Article Notebook","notebook-preview-download":"Download Notebook","notebook-preview-download-src":"Download Source","notebook-preview-back":"Back to Article","manuscript-meca-bundle":"MECA Bundle","section-title-abstract":"Abstract","section-title-appendices":"Appendices","section-title-footnotes":"Footnotes","section-title-references":"References","section-title-reuse":"Reuse","section-title-copyright":"Copyright","section-title-citation":"Citation","appendix-attribution-cite-as":"For attribution, please cite this work as:","appendix-attribution-bibtex":"BibTeX citation:","appendix-view-license":"View License","title-block-author-single":"Author","title-block-author-plural":"Authors","title-block-affiliation-single":"Affiliation","title-block-affiliation-plural":"Affiliations","title-block-published":"Published","title-block-modified":"Modified","title-block-keywords":"Keywords","callout-tip-title":"Tip","callout-note-title":"Note","callout-warning-title":"Warning","callout-important-title":"Important","callout-caution-title":"Caution","code-summary":"Code","code-tools-menu-caption":"Code","code-tools-show-all-code":"Show All Code","code-tools-hide-all-code":"Hide All Code","code-tools-view-source":"View Source","code-tools-source-code":"Source Code","tools-share":"Share","tools-download":"Download","code-line":"Line","code-lines":"Lines","copy-button-tooltip":"Copy to Clipboard","copy-button-tooltip-success":"Copied!","repo-action-links-edit":"Edit this page","repo-action-links-source":"View source","repo-action-links-issue":"Report an issue","back-to-top":"Back to top","search-no-results-text":"No results","search-matching-documents-text":"matching documents","search-copy-link-title":"Copy link to search","search-hide-matches-text":"Hide additional matches","search-more-match-text":"more match in this document","search-more-matches-text":"more matches in this document","search-clear-button-title":"Clear","search-text-placeholder":"","search-detached-cancel-button-title":"Cancel","search-submit-button-title":"Submit","search-label":"Search","toggle-section":"Toggle section","toggle-sidebar":"Toggle sidebar navigation","toggle-dark-mode":"Toggle dark mode","toggle-reader-mode":"Toggle reader mode","toggle-navigation":"Toggle navigation","crossref-fig-title":"Figure","crossref-tbl-title":"Table","crossref-lst-title":"Listing","crossref-thm-title":"Theorem","crossref-lem-title":"Lemma","crossref-cor-title":"Corollary","crossref-prp-title":"Proposition","crossref-cnj-title":"Conjecture","crossref-def-title":"Definition","crossref-exm-title":"Example","crossref-exr-title":"Exercise","crossref-ch-prefix":"Chapter","crossref-apx-prefix":"Appendix","crossref-sec-prefix":"Section","crossref-eq-prefix":"Equation","crossref-lof-title":"List of Figures","crossref-lot-title":"List of Tables","crossref-lol-title":"List of Listings","environment-proof-title":"Proof","environment-remark-title":"Remark","environment-solution-title":"Solution","listing-page-order-by":"Order By","listing-page-order-by-default":"Default","listing-page-order-by-date-asc":"Oldest","listing-page-order-by-date-desc":"Newest","listing-page-order-by-number-desc":"High to Low","listing-page-order-by-number-asc":"Low to High","listing-page-field-date":"Date","listing-page-field-title":"Title","listing-page-field-description":"Description","listing-page-field-author":"Author","listing-page-field-filename":"File Name","listing-page-field-filemodified":"Modified","listing-page-field-subtitle":"Subtitle","listing-page-field-readingtime":"Reading Time","listing-page-field-wordcount":"Word Count","listing-page-field-categories":"Categories","listing-page-minutes-compact":"{0} min","listing-page-category-all":"All","listing-page-no-matches":"No matching items","listing-page-words":"{0} words","listing-page-filter":"Filter","draft":"Draft"},"metadata":{"block-headings":true,"documentclass":"scrreprt","papersize":"a4","colorlinks":true},"extensions":{"book":{"selfContainedOutput":true}}}},"projectFormats":["html","pdf"]}