lamindb 0.49.3__py3-none-any.whl → 0.50.1__py3-none-any.whl
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.
- lamindb/__init__.py +55 -15
- lamindb/_context.py +25 -25
- lamindb/_delete.py +8 -8
- lamindb/_feature.py +15 -11
- lamindb/_feature_set.py +70 -39
- lamindb/_file.py +80 -56
- lamindb/_filter.py +5 -5
- lamindb/_from_values.py +55 -92
- lamindb/{_manager.py → _query_manager.py} +8 -5
- lamindb/{_queryset.py → _query_set.py} +31 -28
- lamindb/{_orm.py → _registry.py} +53 -294
- lamindb/_save.py +14 -13
- lamindb/_synonym.py +203 -0
- lamindb/_validate.py +134 -0
- lamindb/_view.py +15 -9
- lamindb/dev/__init__.py +13 -6
- lamindb/dev/_data.py +195 -0
- lamindb/dev/_feature_manager.py +102 -0
- lamindb/dev/_settings.py +10 -9
- lamindb/dev/_view_parents.py +36 -17
- lamindb/dev/datasets/__init__.py +5 -3
- lamindb/dev/datasets/_core.py +35 -17
- lamindb/dev/exc.py +4 -0
- lamindb/dev/storage/_backed_access.py +53 -17
- lamindb/dev/storage/file.py +44 -15
- {lamindb-0.49.3.dist-info → lamindb-0.50.1.dist-info}/METADATA +34 -36
- lamindb-0.50.1.dist-info/RECORD +47 -0
- lamindb/_feature_manager.py +0 -237
- lamindb-0.49.3.dist-info/RECORD +0 -43
- {lamindb-0.49.3.dist-info → lamindb-0.50.1.dist-info}/LICENSE +0 -0
- {lamindb-0.49.3.dist-info → lamindb-0.50.1.dist-info}/WHEEL +0 -0
- {lamindb-0.49.3.dist-info → lamindb-0.50.1.dist-info}/entry_points.txt +0 -0
@@ -3,8 +3,8 @@ from typing import Optional
|
|
3
3
|
from django.db import models
|
4
4
|
|
5
5
|
|
6
|
-
class
|
7
|
-
"""
|
6
|
+
class QueryManager(models.Manager):
|
7
|
+
"""Manage queries through fields.
|
8
8
|
|
9
9
|
See Also:
|
10
10
|
|
@@ -44,9 +44,12 @@ class Manager(models.Manager):
|
|
44
44
|
return [item for item in self.values_list(field, flat=True)]
|
45
45
|
|
46
46
|
def df(self, **kwargs):
|
47
|
-
"""Convert to DataFrame.
|
47
|
+
"""Convert to DataFrame.
|
48
|
+
|
49
|
+
For `**kwargs`, see :meth:`lamindb.dev.QuerySet.df`.
|
50
|
+
"""
|
48
51
|
return self.all().df(**kwargs)
|
49
52
|
|
50
53
|
|
51
|
-
setattr(models.Manager, "list",
|
52
|
-
setattr(models.Manager, "df",
|
54
|
+
setattr(models.Manager, "list", QueryManager.list)
|
55
|
+
setattr(models.Manager, "df", QueryManager.df)
|
@@ -4,7 +4,7 @@ from typing import Iterable, List, NamedTuple, Optional
|
|
4
4
|
import pandas as pd
|
5
5
|
from django.db import models
|
6
6
|
from lamindb_setup.dev._docs import doc_args
|
7
|
-
from lnschema_core import
|
7
|
+
from lnschema_core.models import Registry, SynonymsAware, ValidationAware
|
8
8
|
from lnschema_core.types import ListLike, StrField
|
9
9
|
|
10
10
|
|
@@ -23,12 +23,7 @@ def format_and_convert_to_local_time(series: pd.Series):
|
|
23
23
|
|
24
24
|
|
25
25
|
class QuerySet(models.QuerySet):
|
26
|
-
"""
|
27
|
-
|
28
|
-
This brings some of the SQLAlchemy/SQLModel/SQL-inspired calls.
|
29
|
-
|
30
|
-
As LaminDB was based on SQLAlchemy/SQLModel in the beginning, and might
|
31
|
-
support it again in the future, these calls will be supported longtime.
|
26
|
+
"""Lazily loaded queried records returned by queries.
|
32
27
|
|
33
28
|
See Also:
|
34
29
|
|
@@ -114,20 +109,20 @@ class QuerySet(models.QuerySet):
|
|
114
109
|
lookup_str = "__".join(split[1:])
|
115
110
|
else:
|
116
111
|
lookup_str = "id"
|
117
|
-
|
118
|
-
field = getattr(
|
112
|
+
Registry = self.model
|
113
|
+
field = getattr(Registry, field_name)
|
119
114
|
if not isinstance(field.field, models.ManyToManyField):
|
120
115
|
raise ValueError("Only many-to-many fields are allowed here.")
|
121
116
|
related_ORM = (
|
122
117
|
field.field.model
|
123
|
-
if field.field.model !=
|
118
|
+
if field.field.model != Registry
|
124
119
|
else field.field.related_model
|
125
120
|
)
|
126
|
-
if
|
127
|
-
left_side_link_model = f"from_{
|
128
|
-
values_expression = f"to_{
|
121
|
+
if Registry == related_ORM:
|
122
|
+
left_side_link_model = f"from_{Registry.__name__.lower()}"
|
123
|
+
values_expression = f"to_{Registry.__name__.lower()}__{lookup_str}"
|
129
124
|
else:
|
130
|
-
left_side_link_model = f"{
|
125
|
+
left_side_link_model = f"{Registry.__name__.lower()}"
|
131
126
|
values_expression = f"{related_ORM.__name__.lower()}__{lookup_str}"
|
132
127
|
link_df = pd.DataFrame(
|
133
128
|
field.through.objects.values(
|
@@ -141,7 +136,7 @@ class QuerySet(models.QuerySet):
|
|
141
136
|
df.rename(columns={values_expression: expression}, inplace=True)
|
142
137
|
return df
|
143
138
|
|
144
|
-
def list(self, field: Optional[str] = None) -> List[
|
139
|
+
def list(self, field: Optional[str] = None) -> List[Registry]:
|
145
140
|
"""Populate a list with the results.
|
146
141
|
|
147
142
|
Examples:
|
@@ -160,7 +155,7 @@ class QuerySet(models.QuerySet):
|
|
160
155
|
else:
|
161
156
|
return [item for item in self.values_list(field, flat=True)]
|
162
157
|
|
163
|
-
def first(self) -> Optional[
|
158
|
+
def first(self) -> Optional[Registry]:
|
164
159
|
"""If non-empty, the first result in the query set, otherwise None.
|
165
160
|
|
166
161
|
Examples:
|
@@ -173,7 +168,7 @@ class QuerySet(models.QuerySet):
|
|
173
168
|
return None
|
174
169
|
return self[0]
|
175
170
|
|
176
|
-
def one(self) ->
|
171
|
+
def one(self) -> Registry:
|
177
172
|
"""Exactly one result. Throws error if there are more or none.
|
178
173
|
|
179
174
|
Examples:
|
@@ -188,7 +183,7 @@ class QuerySet(models.QuerySet):
|
|
188
183
|
else:
|
189
184
|
return self[0]
|
190
185
|
|
191
|
-
def one_or_none(self) -> Optional[
|
186
|
+
def one_or_none(self) -> Optional[Registry]:
|
192
187
|
"""At most one result. Returns it if there is one, otherwise returns None.
|
193
188
|
|
194
189
|
Examples:
|
@@ -205,31 +200,38 @@ class QuerySet(models.QuerySet):
|
|
205
200
|
else:
|
206
201
|
raise MultipleResultsFound
|
207
202
|
|
208
|
-
@doc_args(
|
203
|
+
@doc_args(Registry.search.__doc__)
|
209
204
|
def search(self, string: str, **kwargs):
|
210
205
|
"""{}"""
|
211
|
-
from .
|
206
|
+
from ._registry import _search
|
212
207
|
|
213
208
|
return _search(cls=self, string=string, **kwargs)
|
214
209
|
|
215
|
-
@doc_args(
|
210
|
+
@doc_args(Registry.lookup.__doc__)
|
216
211
|
def lookup(self, field: Optional[StrField] = None) -> NamedTuple:
|
217
212
|
"""{}"""
|
218
|
-
from .
|
213
|
+
from ._registry import _lookup
|
219
214
|
|
220
215
|
return _lookup(cls=self, field=field)
|
221
216
|
|
222
|
-
@doc_args(
|
223
|
-
def
|
217
|
+
@doc_args(ValidationAware.validate.__doc__)
|
218
|
+
def validate(self, values: ListLike, field: StrField, **kwargs):
|
219
|
+
"""{}"""
|
220
|
+
from ._validate import _validate
|
221
|
+
|
222
|
+
return _validate(cls=self, values=values, field=field, **kwargs)
|
223
|
+
|
224
|
+
@doc_args(ValidationAware.inspect.__doc__)
|
225
|
+
def inspect(self, values: ListLike, field: StrField, **kwargs):
|
224
226
|
"""{}"""
|
225
|
-
from .
|
227
|
+
from ._validate import _inspect
|
226
228
|
|
227
|
-
return _inspect(cls=self,
|
229
|
+
return _inspect(cls=self, values=values, field=field, **kwargs)
|
228
230
|
|
229
|
-
@doc_args(
|
231
|
+
@doc_args(SynonymsAware.map_synonyms.__doc__)
|
230
232
|
def map_synonyms(self, synonyms: Iterable, **kwargs):
|
231
233
|
"""{}"""
|
232
|
-
from .
|
234
|
+
from ._synonym import _map_synonyms
|
233
235
|
|
234
236
|
return _map_synonyms(cls=self, synonyms=synonyms, **kwargs)
|
235
237
|
|
@@ -241,5 +243,6 @@ setattr(models.QuerySet, "one", QuerySet.one)
|
|
241
243
|
setattr(models.QuerySet, "one_or_none", QuerySet.one_or_none)
|
242
244
|
setattr(models.QuerySet, "search", QuerySet.search)
|
243
245
|
setattr(models.QuerySet, "lookup", QuerySet.lookup)
|
246
|
+
setattr(models.QuerySet, "validate", QuerySet.validate)
|
244
247
|
setattr(models.QuerySet, "inspect", QuerySet.inspect)
|
245
248
|
setattr(models.QuerySet, "map_synonyms", QuerySet.map_synonyms)
|