nucliadb 6.7.2.post4874__py3-none-any.whl → 6.10.0.post5705__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.
- migrations/0023_backfill_pg_catalog.py +8 -4
- migrations/0028_extracted_vectors_reference.py +1 -1
- migrations/0029_backfill_field_status.py +3 -4
- migrations/0032_remove_old_relations.py +2 -3
- migrations/0038_backfill_catalog_field_labels.py +8 -4
- migrations/0039_backfill_converation_splits_metadata.py +106 -0
- migrations/0040_migrate_search_configurations.py +79 -0
- migrations/0041_reindex_conversations.py +137 -0
- migrations/pg/0010_shards_index.py +34 -0
- nucliadb/search/api/v1/resource/utils.py → migrations/pg/0011_catalog_statistics.py +5 -6
- migrations/pg/0012_catalog_statistics_undo.py +26 -0
- nucliadb/backups/create.py +2 -15
- nucliadb/backups/restore.py +4 -15
- nucliadb/backups/tasks.py +4 -1
- nucliadb/common/back_pressure/cache.py +2 -3
- nucliadb/common/back_pressure/materializer.py +7 -13
- nucliadb/common/back_pressure/settings.py +6 -6
- nucliadb/common/back_pressure/utils.py +1 -0
- nucliadb/common/cache.py +9 -9
- nucliadb/common/catalog/__init__.py +79 -0
- nucliadb/common/catalog/dummy.py +36 -0
- nucliadb/common/catalog/interface.py +85 -0
- nucliadb/{search/search/pgcatalog.py → common/catalog/pg.py} +330 -232
- nucliadb/common/catalog/utils.py +56 -0
- nucliadb/common/cluster/manager.py +8 -23
- nucliadb/common/cluster/rebalance.py +484 -112
- nucliadb/common/cluster/rollover.py +36 -9
- nucliadb/common/cluster/settings.py +4 -9
- nucliadb/common/cluster/utils.py +34 -8
- nucliadb/common/context/__init__.py +7 -8
- nucliadb/common/context/fastapi.py +1 -2
- nucliadb/common/datamanagers/__init__.py +2 -4
- nucliadb/common/datamanagers/atomic.py +9 -2
- nucliadb/common/datamanagers/cluster.py +1 -2
- nucliadb/common/datamanagers/fields.py +3 -4
- nucliadb/common/datamanagers/kb.py +6 -6
- nucliadb/common/datamanagers/labels.py +2 -3
- nucliadb/common/datamanagers/resources.py +10 -33
- nucliadb/common/datamanagers/rollover.py +5 -7
- nucliadb/common/datamanagers/search_configurations.py +1 -2
- nucliadb/common/datamanagers/synonyms.py +1 -2
- nucliadb/common/datamanagers/utils.py +4 -4
- nucliadb/common/datamanagers/vectorsets.py +4 -4
- nucliadb/common/external_index_providers/base.py +32 -5
- nucliadb/common/external_index_providers/manager.py +5 -34
- nucliadb/common/external_index_providers/settings.py +1 -27
- nucliadb/common/filter_expression.py +129 -41
- nucliadb/common/http_clients/exceptions.py +8 -0
- nucliadb/common/http_clients/processing.py +16 -23
- nucliadb/common/http_clients/utils.py +3 -0
- nucliadb/common/ids.py +82 -58
- nucliadb/common/locking.py +1 -2
- nucliadb/common/maindb/driver.py +9 -8
- nucliadb/common/maindb/local.py +5 -5
- nucliadb/common/maindb/pg.py +9 -8
- nucliadb/common/nidx.py +22 -5
- nucliadb/common/vector_index_config.py +1 -1
- nucliadb/export_import/datamanager.py +4 -3
- nucliadb/export_import/exporter.py +11 -19
- nucliadb/export_import/importer.py +13 -6
- nucliadb/export_import/tasks.py +2 -0
- nucliadb/export_import/utils.py +6 -18
- nucliadb/health.py +2 -2
- nucliadb/ingest/app.py +8 -8
- nucliadb/ingest/consumer/consumer.py +8 -10
- nucliadb/ingest/consumer/pull.py +10 -8
- nucliadb/ingest/consumer/service.py +5 -30
- nucliadb/ingest/consumer/shard_creator.py +16 -5
- nucliadb/ingest/consumer/utils.py +1 -1
- nucliadb/ingest/fields/base.py +37 -49
- nucliadb/ingest/fields/conversation.py +55 -9
- nucliadb/ingest/fields/exceptions.py +1 -2
- nucliadb/ingest/fields/file.py +22 -8
- nucliadb/ingest/fields/link.py +7 -7
- nucliadb/ingest/fields/text.py +2 -3
- nucliadb/ingest/orm/brain_v2.py +89 -57
- nucliadb/ingest/orm/broker_message.py +2 -4
- nucliadb/ingest/orm/entities.py +10 -209
- nucliadb/ingest/orm/index_message.py +128 -113
- nucliadb/ingest/orm/knowledgebox.py +91 -59
- nucliadb/ingest/orm/processor/auditing.py +1 -3
- nucliadb/ingest/orm/processor/data_augmentation.py +1 -2
- nucliadb/ingest/orm/processor/processor.py +98 -153
- nucliadb/ingest/orm/processor/sequence_manager.py +1 -2
- nucliadb/ingest/orm/resource.py +82 -71
- nucliadb/ingest/orm/utils.py +1 -1
- nucliadb/ingest/partitions.py +12 -1
- nucliadb/ingest/processing.py +17 -17
- nucliadb/ingest/serialize.py +202 -145
- nucliadb/ingest/service/writer.py +15 -114
- nucliadb/ingest/settings.py +36 -15
- nucliadb/ingest/utils.py +1 -2
- nucliadb/learning_proxy.py +23 -26
- nucliadb/metrics_exporter.py +20 -6
- nucliadb/middleware/__init__.py +82 -1
- nucliadb/migrator/datamanager.py +4 -11
- nucliadb/migrator/migrator.py +1 -2
- nucliadb/migrator/models.py +1 -2
- nucliadb/migrator/settings.py +1 -2
- nucliadb/models/internal/augment.py +614 -0
- nucliadb/models/internal/processing.py +19 -19
- nucliadb/openapi.py +2 -2
- nucliadb/purge/__init__.py +3 -8
- nucliadb/purge/orphan_shards.py +1 -2
- nucliadb/reader/__init__.py +5 -0
- nucliadb/reader/api/models.py +6 -13
- nucliadb/reader/api/v1/download.py +59 -38
- nucliadb/reader/api/v1/export_import.py +4 -4
- nucliadb/reader/api/v1/knowledgebox.py +37 -9
- nucliadb/reader/api/v1/learning_config.py +33 -14
- nucliadb/reader/api/v1/resource.py +61 -9
- nucliadb/reader/api/v1/services.py +18 -14
- nucliadb/reader/app.py +3 -1
- nucliadb/reader/reader/notifications.py +1 -2
- nucliadb/search/api/v1/__init__.py +3 -0
- nucliadb/search/api/v1/ask.py +3 -4
- nucliadb/search/api/v1/augment.py +585 -0
- nucliadb/search/api/v1/catalog.py +15 -19
- nucliadb/search/api/v1/find.py +16 -22
- nucliadb/search/api/v1/hydrate.py +328 -0
- nucliadb/search/api/v1/knowledgebox.py +1 -2
- nucliadb/search/api/v1/predict_proxy.py +1 -2
- nucliadb/search/api/v1/resource/ask.py +28 -8
- nucliadb/search/api/v1/resource/ingestion_agents.py +5 -6
- nucliadb/search/api/v1/resource/search.py +9 -11
- nucliadb/search/api/v1/retrieve.py +130 -0
- nucliadb/search/api/v1/search.py +28 -32
- nucliadb/search/api/v1/suggest.py +11 -14
- nucliadb/search/api/v1/summarize.py +1 -2
- nucliadb/search/api/v1/utils.py +2 -2
- nucliadb/search/app.py +3 -2
- nucliadb/search/augmentor/__init__.py +21 -0
- nucliadb/search/augmentor/augmentor.py +232 -0
- nucliadb/search/augmentor/fields.py +704 -0
- nucliadb/search/augmentor/metrics.py +24 -0
- nucliadb/search/augmentor/paragraphs.py +334 -0
- nucliadb/search/augmentor/resources.py +238 -0
- nucliadb/search/augmentor/utils.py +33 -0
- nucliadb/search/lifecycle.py +3 -1
- nucliadb/search/predict.py +33 -19
- nucliadb/search/predict_models.py +8 -9
- nucliadb/search/requesters/utils.py +11 -10
- nucliadb/search/search/cache.py +19 -42
- nucliadb/search/search/chat/ask.py +131 -59
- nucliadb/search/search/chat/exceptions.py +3 -5
- nucliadb/search/search/chat/fetcher.py +201 -0
- nucliadb/search/search/chat/images.py +6 -4
- nucliadb/search/search/chat/old_prompt.py +1375 -0
- nucliadb/search/search/chat/parser.py +510 -0
- nucliadb/search/search/chat/prompt.py +563 -615
- nucliadb/search/search/chat/query.py +453 -32
- nucliadb/search/search/chat/rpc.py +85 -0
- nucliadb/search/search/fetch.py +3 -4
- nucliadb/search/search/filters.py +8 -11
- nucliadb/search/search/find.py +33 -31
- nucliadb/search/search/find_merge.py +124 -331
- nucliadb/search/search/graph_strategy.py +14 -12
- nucliadb/search/search/hydrator/__init__.py +49 -0
- nucliadb/search/search/hydrator/fields.py +217 -0
- nucliadb/search/search/hydrator/images.py +130 -0
- nucliadb/search/search/hydrator/paragraphs.py +323 -0
- nucliadb/search/search/hydrator/resources.py +60 -0
- nucliadb/search/search/ingestion_agents.py +5 -5
- nucliadb/search/search/merge.py +90 -94
- nucliadb/search/search/metrics.py +24 -7
- nucliadb/search/search/paragraphs.py +7 -9
- nucliadb/search/search/predict_proxy.py +44 -18
- nucliadb/search/search/query.py +14 -86
- nucliadb/search/search/query_parser/fetcher.py +51 -82
- nucliadb/search/search/query_parser/models.py +19 -48
- nucliadb/search/search/query_parser/old_filters.py +20 -19
- nucliadb/search/search/query_parser/parsers/ask.py +5 -6
- nucliadb/search/search/query_parser/parsers/catalog.py +7 -11
- nucliadb/search/search/query_parser/parsers/common.py +21 -13
- nucliadb/search/search/query_parser/parsers/find.py +6 -29
- nucliadb/search/search/query_parser/parsers/graph.py +18 -28
- nucliadb/search/search/query_parser/parsers/retrieve.py +207 -0
- nucliadb/search/search/query_parser/parsers/search.py +15 -56
- nucliadb/search/search/query_parser/parsers/unit_retrieval.py +8 -29
- nucliadb/search/search/rank_fusion.py +18 -13
- nucliadb/search/search/rerankers.py +6 -7
- nucliadb/search/search/retrieval.py +300 -0
- nucliadb/search/search/summarize.py +5 -6
- nucliadb/search/search/utils.py +3 -4
- nucliadb/search/settings.py +1 -2
- nucliadb/standalone/api_router.py +1 -1
- nucliadb/standalone/app.py +4 -3
- nucliadb/standalone/auth.py +5 -6
- nucliadb/standalone/lifecycle.py +2 -2
- nucliadb/standalone/run.py +5 -4
- nucliadb/standalone/settings.py +5 -6
- nucliadb/standalone/versions.py +3 -4
- nucliadb/tasks/consumer.py +13 -8
- nucliadb/tasks/models.py +2 -1
- nucliadb/tasks/producer.py +3 -3
- nucliadb/tasks/retries.py +8 -7
- nucliadb/train/api/utils.py +1 -3
- nucliadb/train/api/v1/shards.py +1 -2
- nucliadb/train/api/v1/trainset.py +1 -2
- nucliadb/train/app.py +1 -1
- nucliadb/train/generator.py +4 -4
- nucliadb/train/generators/field_classifier.py +2 -2
- nucliadb/train/generators/field_streaming.py +6 -6
- nucliadb/train/generators/image_classifier.py +2 -2
- nucliadb/train/generators/paragraph_classifier.py +2 -2
- nucliadb/train/generators/paragraph_streaming.py +2 -2
- nucliadb/train/generators/question_answer_streaming.py +2 -2
- nucliadb/train/generators/sentence_classifier.py +4 -10
- nucliadb/train/generators/token_classifier.py +3 -2
- nucliadb/train/generators/utils.py +6 -5
- nucliadb/train/nodes.py +3 -3
- nucliadb/train/resource.py +6 -8
- nucliadb/train/settings.py +3 -4
- nucliadb/train/types.py +11 -11
- nucliadb/train/upload.py +3 -2
- nucliadb/train/uploader.py +1 -2
- nucliadb/train/utils.py +1 -2
- nucliadb/writer/api/v1/export_import.py +4 -1
- nucliadb/writer/api/v1/field.py +15 -14
- nucliadb/writer/api/v1/knowledgebox.py +18 -56
- nucliadb/writer/api/v1/learning_config.py +5 -4
- nucliadb/writer/api/v1/resource.py +9 -20
- nucliadb/writer/api/v1/services.py +10 -132
- nucliadb/writer/api/v1/upload.py +73 -72
- nucliadb/writer/app.py +8 -2
- nucliadb/writer/resource/basic.py +12 -15
- nucliadb/writer/resource/field.py +43 -5
- nucliadb/writer/resource/origin.py +7 -0
- nucliadb/writer/settings.py +2 -3
- nucliadb/writer/tus/__init__.py +2 -3
- nucliadb/writer/tus/azure.py +5 -7
- nucliadb/writer/tus/dm.py +3 -3
- nucliadb/writer/tus/exceptions.py +3 -4
- nucliadb/writer/tus/gcs.py +15 -22
- nucliadb/writer/tus/s3.py +2 -3
- nucliadb/writer/tus/storage.py +3 -3
- {nucliadb-6.7.2.post4874.dist-info → nucliadb-6.10.0.post5705.dist-info}/METADATA +10 -11
- nucliadb-6.10.0.post5705.dist-info/RECORD +410 -0
- nucliadb/common/datamanagers/entities.py +0 -139
- nucliadb/common/external_index_providers/pinecone.py +0 -894
- nucliadb/ingest/orm/processor/pgcatalog.py +0 -129
- nucliadb/search/search/hydrator.py +0 -197
- nucliadb-6.7.2.post4874.dist-info/RECORD +0 -383
- {nucliadb-6.7.2.post4874.dist-info → nucliadb-6.10.0.post5705.dist-info}/WHEEL +0 -0
- {nucliadb-6.7.2.post4874.dist-info → nucliadb-6.10.0.post5705.dist-info}/entry_points.txt +0 -0
- {nucliadb-6.7.2.post4874.dist-info → nucliadb-6.10.0.post5705.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
# Copyright (C) 2021 Bosutech XXI S.L.
|
|
2
|
+
#
|
|
3
|
+
# nucliadb is offered under the AGPL v3.0 and as commercial software.
|
|
4
|
+
# For commercial licensing, contact us at info@nuclia.com.
|
|
5
|
+
#
|
|
6
|
+
# AGPL:
|
|
7
|
+
# This program is free software: you can redistribute it and/or modify
|
|
8
|
+
# it under the terms of the GNU Affero General Public License as
|
|
9
|
+
# published by the Free Software Foundation, either version 3 of the
|
|
10
|
+
# License, or (at your option) any later version.
|
|
11
|
+
#
|
|
12
|
+
# This program is distributed in the hope that it will be useful,
|
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15
|
+
# GNU Affero General Public License for more details.
|
|
16
|
+
#
|
|
17
|
+
# You should have received a copy of the GNU Affero General Public License
|
|
18
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
19
|
+
#
|
|
20
|
+
import asyncio
|
|
21
|
+
from typing import Any
|
|
22
|
+
|
|
23
|
+
from typing_extensions import assert_never
|
|
24
|
+
|
|
25
|
+
import nucliadb_models
|
|
26
|
+
from nucliadb.common import datamanagers
|
|
27
|
+
from nucliadb.common.ids import FIELD_TYPE_NAME_TO_STR, FieldId, ParagraphId
|
|
28
|
+
from nucliadb.models.internal.augment import (
|
|
29
|
+
Augment,
|
|
30
|
+
Augmented,
|
|
31
|
+
AugmentedField,
|
|
32
|
+
AugmentedParagraph,
|
|
33
|
+
AugmentedResource,
|
|
34
|
+
)
|
|
35
|
+
from nucliadb.search.augmentor.utils import limited_concurrency
|
|
36
|
+
from nucliadb.search.search.hydrator import ResourceHydrationOptions
|
|
37
|
+
from nucliadb_models.common import FieldTypeName
|
|
38
|
+
from nucliadb_models.resource import Resource
|
|
39
|
+
|
|
40
|
+
from .fields import augment_field
|
|
41
|
+
from .paragraphs import augment_paragraph
|
|
42
|
+
from .resources import augment_resource, augment_resource_deep
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
async def augment(
|
|
46
|
+
kbid: str,
|
|
47
|
+
augmentations: list[Augment],
|
|
48
|
+
*,
|
|
49
|
+
concurrency_control: asyncio.Semaphore | None = None,
|
|
50
|
+
) -> Augmented:
|
|
51
|
+
"""Process multiple augmentations concurrently and return the augmented content.
|
|
52
|
+
|
|
53
|
+
This is a heavy operation that can lead to many I/O operations with maindb
|
|
54
|
+
and/or blob storage. For improved performance, make sure this is called
|
|
55
|
+
inside the context of `nucliadb.search.search.cache` `request_caches`
|
|
56
|
+
|
|
57
|
+
"""
|
|
58
|
+
augments: dict[str, Any] = {
|
|
59
|
+
"resources": {},
|
|
60
|
+
"resources.deep": {},
|
|
61
|
+
"fields": {},
|
|
62
|
+
"paragraphs": {},
|
|
63
|
+
}
|
|
64
|
+
for augmentation in augmentations:
|
|
65
|
+
if augmentation.from_ == "resources":
|
|
66
|
+
for id in augmentation.given:
|
|
67
|
+
if isinstance(id, str):
|
|
68
|
+
rid = id
|
|
69
|
+
elif isinstance(id, FieldId):
|
|
70
|
+
rid = id.rid
|
|
71
|
+
elif isinstance(id, ParagraphId):
|
|
72
|
+
rid = id.rid
|
|
73
|
+
else: # pragma: no cover
|
|
74
|
+
assert_never(id)
|
|
75
|
+
|
|
76
|
+
augments["resources"].setdefault(rid, []).extend(augmentation.select)
|
|
77
|
+
|
|
78
|
+
elif augmentation.from_ == "resources.deep":
|
|
79
|
+
for rid in augmentation.given:
|
|
80
|
+
opts = augments["resources.deep"].setdefault(rid, ResourceHydrationOptions())
|
|
81
|
+
opts.show.extend(augmentation.show)
|
|
82
|
+
opts.extracted.extend(augmentation.extracted)
|
|
83
|
+
opts.field_type_filter.extend(augmentation.field_type_filter)
|
|
84
|
+
|
|
85
|
+
elif augmentation.from_ == "fields":
|
|
86
|
+
unfiltered_field_ids: list[FieldId] = []
|
|
87
|
+
for id in augmentation.given:
|
|
88
|
+
if isinstance(id, str):
|
|
89
|
+
# augmenting resource fields
|
|
90
|
+
rid = id
|
|
91
|
+
all_field_ids = await datamanagers.atomic.resources.get_all_field_ids(
|
|
92
|
+
kbid=kbid, rid=rid, for_update=False
|
|
93
|
+
)
|
|
94
|
+
if all_field_ids is None:
|
|
95
|
+
continue
|
|
96
|
+
|
|
97
|
+
unfiltered_field_ids.extend(
|
|
98
|
+
FieldId.from_pb(
|
|
99
|
+
rid=rid, field_type=field_id_pb.field_type, key=field_id_pb.field
|
|
100
|
+
)
|
|
101
|
+
for field_id_pb in all_field_ids.fields
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
elif isinstance(id, FieldId):
|
|
105
|
+
unfiltered_field_ids.append(id)
|
|
106
|
+
|
|
107
|
+
elif isinstance(id, ParagraphId):
|
|
108
|
+
unfiltered_field_ids.append(id.field_id)
|
|
109
|
+
|
|
110
|
+
else: # pragma: no cover
|
|
111
|
+
assert_never(id)
|
|
112
|
+
|
|
113
|
+
if not augmentation.filter:
|
|
114
|
+
field_ids = unfiltered_field_ids
|
|
115
|
+
else:
|
|
116
|
+
field_ids = []
|
|
117
|
+
for field_id in unfiltered_field_ids:
|
|
118
|
+
for filter in augmentation.filter:
|
|
119
|
+
if isinstance(filter, nucliadb_models.filters.Field):
|
|
120
|
+
if filter.type == field_id.type and (
|
|
121
|
+
filter.name is None or filter.name == field_id.key
|
|
122
|
+
):
|
|
123
|
+
field_ids.append(field_id)
|
|
124
|
+
|
|
125
|
+
elif isinstance(filter, nucliadb_models.filters.Generated):
|
|
126
|
+
# generated fields are always text fields starting with "da-"
|
|
127
|
+
if field_id.type == FIELD_TYPE_NAME_TO_STR[FieldTypeName.TEXT] and (
|
|
128
|
+
filter.da_task is None
|
|
129
|
+
or field_id.key.startswith(f"da-{filter.da_task}-")
|
|
130
|
+
):
|
|
131
|
+
field_ids.append(field_id)
|
|
132
|
+
|
|
133
|
+
else: # pragma: no cover
|
|
134
|
+
assert_never(filter)
|
|
135
|
+
|
|
136
|
+
for field_id in field_ids:
|
|
137
|
+
augments["fields"].setdefault(field_id, []).extend(augmentation.select)
|
|
138
|
+
|
|
139
|
+
elif augmentation.from_ == "files" or augmentation.from_ == "conversations":
|
|
140
|
+
for id in augmentation.given:
|
|
141
|
+
if isinstance(id, FieldId):
|
|
142
|
+
field_id = id
|
|
143
|
+
elif isinstance(id, ParagraphId):
|
|
144
|
+
field_id = id.field_id
|
|
145
|
+
else: # pragma: no cover
|
|
146
|
+
assert_never(id)
|
|
147
|
+
|
|
148
|
+
augments["fields"].setdefault(field_id, []).extend(augmentation.select)
|
|
149
|
+
|
|
150
|
+
elif augmentation.from_ == "paragraphs":
|
|
151
|
+
for paragraph in augmentation.given:
|
|
152
|
+
select, metadata = augments["paragraphs"].setdefault(paragraph.id, ([], None))
|
|
153
|
+
select.extend(augmentation.select)
|
|
154
|
+
# we keep the first metadata object we see
|
|
155
|
+
metadata = metadata or paragraph.metadata
|
|
156
|
+
augments["paragraphs"][paragraph.id] = (select, metadata)
|
|
157
|
+
|
|
158
|
+
else: # pragma: no cover
|
|
159
|
+
assert_never(augmentation.from_)
|
|
160
|
+
|
|
161
|
+
ops = { # type: ignore[var-annotated]
|
|
162
|
+
"resources": [],
|
|
163
|
+
"resources.deep": [],
|
|
164
|
+
"fields": [],
|
|
165
|
+
"paragraphs": [],
|
|
166
|
+
}
|
|
167
|
+
for rid, select in augments["resources"].items():
|
|
168
|
+
task = asyncio.create_task(
|
|
169
|
+
limited_concurrency(
|
|
170
|
+
augment_resource( # type: ignore[arg-type]
|
|
171
|
+
kbid, rid, select
|
|
172
|
+
),
|
|
173
|
+
max_ops=concurrency_control,
|
|
174
|
+
)
|
|
175
|
+
)
|
|
176
|
+
ops["resources"].append(task)
|
|
177
|
+
|
|
178
|
+
for rid, opts in augments["resources.deep"].items():
|
|
179
|
+
task = asyncio.create_task(
|
|
180
|
+
limited_concurrency(
|
|
181
|
+
augment_resource_deep( # type: ignore[arg-type]
|
|
182
|
+
kbid, rid, opts
|
|
183
|
+
),
|
|
184
|
+
max_ops=concurrency_control,
|
|
185
|
+
)
|
|
186
|
+
)
|
|
187
|
+
ops["resources.deep"].append(task)
|
|
188
|
+
|
|
189
|
+
for field_id, select in augments["fields"].items():
|
|
190
|
+
task = asyncio.create_task(
|
|
191
|
+
limited_concurrency(
|
|
192
|
+
augment_field( # type: ignore[arg-type]
|
|
193
|
+
kbid, field_id, select
|
|
194
|
+
),
|
|
195
|
+
max_ops=concurrency_control,
|
|
196
|
+
)
|
|
197
|
+
)
|
|
198
|
+
ops["fields"].append(task)
|
|
199
|
+
|
|
200
|
+
for paragraph_id, (select, metadata) in augments["paragraphs"].items():
|
|
201
|
+
task = asyncio.create_task(
|
|
202
|
+
limited_concurrency(
|
|
203
|
+
augment_paragraph( # type: ignore[arg-type]
|
|
204
|
+
kbid, paragraph_id, select, metadata
|
|
205
|
+
),
|
|
206
|
+
max_ops=concurrency_control,
|
|
207
|
+
)
|
|
208
|
+
)
|
|
209
|
+
ops["paragraphs"].append(task)
|
|
210
|
+
|
|
211
|
+
results = await asyncio.gather(
|
|
212
|
+
*ops["resources"], *ops["resources.deep"], *ops["fields"], *ops["paragraphs"]
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
resources: list[AugmentedResource] = results[: len(ops["resources"])]
|
|
216
|
+
del results[: len(ops["resources"])]
|
|
217
|
+
resources_deep: list[Resource] = results[: len(ops["resources.deep"])]
|
|
218
|
+
del results[: len(ops["resources.deep"])]
|
|
219
|
+
fields: list[AugmentedField] = results[: len(ops["fields"])]
|
|
220
|
+
del results[: len(ops["fields"])]
|
|
221
|
+
paragraphs: list[AugmentedParagraph] = results[: len(ops["paragraphs"])]
|
|
222
|
+
|
|
223
|
+
return Augmented(
|
|
224
|
+
resources={resource.id: resource for resource in resources if resource is not None},
|
|
225
|
+
resources_deep={
|
|
226
|
+
resource_deep.id: resource_deep
|
|
227
|
+
for resource_deep in resources_deep
|
|
228
|
+
if resource_deep is not None
|
|
229
|
+
},
|
|
230
|
+
fields={field.id: field for field in fields if field is not None},
|
|
231
|
+
paragraphs={paragraph.id: paragraph for paragraph in paragraphs if paragraph is not None},
|
|
232
|
+
)
|