nucliadb 4.0.0.post542__py3-none-any.whl → 6.2.1.post2798__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/0003_allfields_key.py +1 -35
- migrations/0009_upgrade_relations_and_texts_to_v2.py +4 -2
- migrations/0010_fix_corrupt_indexes.py +10 -10
- migrations/0011_materialize_labelset_ids.py +1 -16
- migrations/0012_rollover_shards.py +5 -10
- migrations/0014_rollover_shards.py +4 -5
- migrations/0015_targeted_rollover.py +5 -10
- migrations/0016_upgrade_to_paragraphs_v2.py +25 -28
- migrations/0017_multiple_writable_shards.py +2 -4
- migrations/0018_purge_orphan_kbslugs.py +5 -7
- migrations/0019_upgrade_to_paragraphs_v3.py +25 -28
- migrations/0020_drain_nodes_from_cluster.py +3 -3
- nucliadb/standalone/tests/unit/test_run.py → migrations/0021_overwrite_vectorsets_key.py +16 -19
- nucliadb/tests/unit/test_openapi.py → migrations/0022_fix_paragraph_deletion_bug.py +16 -11
- migrations/0023_backfill_pg_catalog.py +80 -0
- migrations/0025_assign_models_to_kbs_v2.py +113 -0
- migrations/0026_fix_high_cardinality_content_types.py +61 -0
- migrations/0027_rollover_texts3.py +73 -0
- nucliadb/ingest/fields/date.py → migrations/pg/0001_bootstrap.py +10 -12
- migrations/pg/0002_catalog.py +42 -0
- nucliadb/ingest/tests/unit/test_settings.py → migrations/pg/0003_catalog_kbid_index.py +5 -3
- nucliadb/common/cluster/base.py +30 -16
- nucliadb/common/cluster/discovery/base.py +6 -14
- nucliadb/common/cluster/discovery/k8s.py +9 -19
- nucliadb/common/cluster/discovery/manual.py +1 -3
- nucliadb/common/cluster/discovery/utils.py +1 -3
- nucliadb/common/cluster/grpc_node_dummy.py +3 -11
- nucliadb/common/cluster/index_node.py +10 -19
- nucliadb/common/cluster/manager.py +174 -59
- nucliadb/common/cluster/rebalance.py +27 -29
- nucliadb/common/cluster/rollover.py +353 -194
- nucliadb/common/cluster/settings.py +6 -0
- nucliadb/common/cluster/standalone/grpc_node_binding.py +13 -64
- nucliadb/common/cluster/standalone/index_node.py +4 -11
- nucliadb/common/cluster/standalone/service.py +2 -6
- nucliadb/common/cluster/standalone/utils.py +2 -6
- nucliadb/common/cluster/utils.py +29 -22
- nucliadb/common/constants.py +20 -0
- nucliadb/common/context/__init__.py +3 -0
- nucliadb/common/context/fastapi.py +8 -5
- nucliadb/{tests/knowledgeboxes/__init__.py → common/counters.py} +8 -2
- nucliadb/common/datamanagers/__init__.py +7 -1
- nucliadb/common/datamanagers/atomic.py +22 -4
- nucliadb/common/datamanagers/cluster.py +5 -5
- nucliadb/common/datamanagers/entities.py +6 -16
- nucliadb/common/datamanagers/fields.py +84 -0
- nucliadb/common/datamanagers/kb.py +83 -37
- nucliadb/common/datamanagers/labels.py +26 -56
- nucliadb/common/datamanagers/processing.py +2 -6
- nucliadb/common/datamanagers/resources.py +41 -103
- nucliadb/common/datamanagers/rollover.py +76 -15
- nucliadb/common/datamanagers/synonyms.py +1 -1
- nucliadb/common/datamanagers/utils.py +15 -6
- nucliadb/common/datamanagers/vectorsets.py +110 -0
- nucliadb/common/external_index_providers/base.py +257 -0
- nucliadb/{ingest/tests/unit/orm/test_orm_utils.py → common/external_index_providers/exceptions.py} +9 -8
- nucliadb/common/external_index_providers/manager.py +101 -0
- nucliadb/common/external_index_providers/pinecone.py +933 -0
- nucliadb/common/external_index_providers/settings.py +52 -0
- nucliadb/common/http_clients/auth.py +3 -6
- nucliadb/common/http_clients/processing.py +6 -11
- nucliadb/common/http_clients/utils.py +1 -3
- nucliadb/common/ids.py +240 -0
- nucliadb/common/locking.py +29 -7
- nucliadb/common/maindb/driver.py +11 -35
- nucliadb/common/maindb/exceptions.py +3 -0
- nucliadb/common/maindb/local.py +22 -9
- nucliadb/common/maindb/pg.py +206 -111
- nucliadb/common/maindb/utils.py +11 -42
- nucliadb/common/models_utils/from_proto.py +479 -0
- nucliadb/common/models_utils/to_proto.py +60 -0
- nucliadb/common/nidx.py +260 -0
- nucliadb/export_import/datamanager.py +25 -19
- nucliadb/export_import/exporter.py +5 -11
- nucliadb/export_import/importer.py +5 -7
- nucliadb/export_import/models.py +3 -3
- nucliadb/export_import/tasks.py +4 -4
- nucliadb/export_import/utils.py +25 -37
- nucliadb/health.py +1 -3
- nucliadb/ingest/app.py +15 -11
- nucliadb/ingest/consumer/auditing.py +21 -19
- nucliadb/ingest/consumer/consumer.py +82 -47
- nucliadb/ingest/consumer/materializer.py +5 -12
- nucliadb/ingest/consumer/pull.py +12 -27
- nucliadb/ingest/consumer/service.py +19 -17
- nucliadb/ingest/consumer/shard_creator.py +2 -4
- nucliadb/ingest/consumer/utils.py +1 -3
- nucliadb/ingest/fields/base.py +137 -105
- nucliadb/ingest/fields/conversation.py +18 -5
- nucliadb/ingest/fields/exceptions.py +1 -4
- nucliadb/ingest/fields/file.py +7 -16
- nucliadb/ingest/fields/link.py +5 -10
- nucliadb/ingest/fields/text.py +9 -4
- nucliadb/ingest/orm/brain.py +200 -213
- nucliadb/ingest/orm/broker_message.py +181 -0
- nucliadb/ingest/orm/entities.py +36 -51
- nucliadb/ingest/orm/exceptions.py +12 -0
- nucliadb/ingest/orm/knowledgebox.py +322 -197
- nucliadb/ingest/orm/processor/__init__.py +2 -700
- nucliadb/ingest/orm/processor/auditing.py +4 -23
- nucliadb/ingest/orm/processor/data_augmentation.py +164 -0
- nucliadb/ingest/orm/processor/pgcatalog.py +84 -0
- nucliadb/ingest/orm/processor/processor.py +752 -0
- nucliadb/ingest/orm/processor/sequence_manager.py +1 -1
- nucliadb/ingest/orm/resource.py +249 -403
- nucliadb/ingest/orm/utils.py +4 -4
- nucliadb/ingest/partitions.py +3 -9
- nucliadb/ingest/processing.py +70 -73
- nucliadb/ingest/py.typed +0 -0
- nucliadb/ingest/serialize.py +37 -167
- nucliadb/ingest/service/__init__.py +1 -3
- nucliadb/ingest/service/writer.py +185 -412
- nucliadb/ingest/settings.py +10 -20
- nucliadb/ingest/utils.py +3 -6
- nucliadb/learning_proxy.py +242 -55
- nucliadb/metrics_exporter.py +30 -19
- nucliadb/middleware/__init__.py +1 -3
- nucliadb/migrator/command.py +1 -3
- nucliadb/migrator/datamanager.py +13 -13
- nucliadb/migrator/migrator.py +47 -30
- nucliadb/migrator/utils.py +18 -10
- nucliadb/purge/__init__.py +139 -33
- nucliadb/purge/orphan_shards.py +7 -13
- nucliadb/reader/__init__.py +1 -3
- nucliadb/reader/api/models.py +1 -12
- nucliadb/reader/api/v1/__init__.py +0 -1
- nucliadb/reader/api/v1/download.py +21 -88
- nucliadb/reader/api/v1/export_import.py +1 -1
- nucliadb/reader/api/v1/knowledgebox.py +10 -10
- nucliadb/reader/api/v1/learning_config.py +2 -6
- nucliadb/reader/api/v1/resource.py +62 -88
- nucliadb/reader/api/v1/services.py +64 -83
- nucliadb/reader/app.py +12 -29
- nucliadb/reader/lifecycle.py +18 -4
- nucliadb/reader/py.typed +0 -0
- nucliadb/reader/reader/notifications.py +10 -28
- nucliadb/search/__init__.py +1 -3
- nucliadb/search/api/v1/__init__.py +1 -2
- nucliadb/search/api/v1/ask.py +17 -10
- nucliadb/search/api/v1/catalog.py +184 -0
- nucliadb/search/api/v1/feedback.py +16 -24
- nucliadb/search/api/v1/find.py +36 -36
- nucliadb/search/api/v1/knowledgebox.py +89 -60
- nucliadb/search/api/v1/resource/ask.py +2 -8
- nucliadb/search/api/v1/resource/search.py +49 -70
- nucliadb/search/api/v1/search.py +44 -210
- nucliadb/search/api/v1/suggest.py +39 -54
- nucliadb/search/app.py +12 -32
- nucliadb/search/lifecycle.py +10 -3
- nucliadb/search/predict.py +136 -187
- nucliadb/search/py.typed +0 -0
- nucliadb/search/requesters/utils.py +25 -58
- nucliadb/search/search/cache.py +149 -20
- nucliadb/search/search/chat/ask.py +571 -123
- nucliadb/search/{tests/unit/test_run.py → search/chat/exceptions.py} +14 -14
- nucliadb/search/search/chat/images.py +41 -17
- nucliadb/search/search/chat/prompt.py +817 -266
- nucliadb/search/search/chat/query.py +213 -309
- nucliadb/{tests/migrations/__init__.py → search/search/cut.py} +8 -8
- nucliadb/search/search/fetch.py +43 -36
- nucliadb/search/search/filters.py +9 -15
- nucliadb/search/search/find.py +214 -53
- nucliadb/search/search/find_merge.py +408 -391
- nucliadb/search/search/hydrator.py +191 -0
- nucliadb/search/search/merge.py +187 -223
- nucliadb/search/search/metrics.py +73 -2
- nucliadb/search/search/paragraphs.py +64 -106
- nucliadb/search/search/pgcatalog.py +233 -0
- nucliadb/search/search/predict_proxy.py +1 -1
- nucliadb/search/search/query.py +305 -150
- nucliadb/search/search/query_parser/exceptions.py +22 -0
- nucliadb/search/search/query_parser/models.py +101 -0
- nucliadb/search/search/query_parser/parser.py +183 -0
- nucliadb/search/search/rank_fusion.py +204 -0
- nucliadb/search/search/rerankers.py +270 -0
- nucliadb/search/search/shards.py +3 -32
- nucliadb/search/search/summarize.py +7 -18
- nucliadb/search/search/utils.py +27 -4
- nucliadb/search/settings.py +15 -1
- nucliadb/standalone/api_router.py +4 -10
- nucliadb/standalone/app.py +8 -14
- nucliadb/standalone/auth.py +7 -21
- nucliadb/standalone/config.py +7 -10
- nucliadb/standalone/lifecycle.py +26 -25
- nucliadb/standalone/migrations.py +1 -3
- nucliadb/standalone/purge.py +1 -1
- nucliadb/standalone/py.typed +0 -0
- nucliadb/standalone/run.py +3 -6
- nucliadb/standalone/settings.py +9 -16
- nucliadb/standalone/versions.py +15 -5
- nucliadb/tasks/consumer.py +8 -12
- nucliadb/tasks/producer.py +7 -6
- nucliadb/tests/config.py +53 -0
- nucliadb/train/__init__.py +1 -3
- nucliadb/train/api/utils.py +1 -2
- nucliadb/train/api/v1/shards.py +1 -1
- nucliadb/train/api/v1/trainset.py +2 -4
- nucliadb/train/app.py +10 -31
- nucliadb/train/generator.py +10 -19
- nucliadb/train/generators/field_classifier.py +7 -19
- nucliadb/train/generators/field_streaming.py +156 -0
- nucliadb/train/generators/image_classifier.py +12 -18
- nucliadb/train/generators/paragraph_classifier.py +5 -9
- nucliadb/train/generators/paragraph_streaming.py +6 -9
- nucliadb/train/generators/question_answer_streaming.py +19 -20
- nucliadb/train/generators/sentence_classifier.py +9 -15
- nucliadb/train/generators/token_classifier.py +48 -39
- nucliadb/train/generators/utils.py +14 -18
- nucliadb/train/lifecycle.py +7 -3
- nucliadb/train/nodes.py +23 -32
- nucliadb/train/py.typed +0 -0
- nucliadb/train/servicer.py +13 -21
- nucliadb/train/settings.py +2 -6
- nucliadb/train/types.py +13 -10
- nucliadb/train/upload.py +3 -6
- nucliadb/train/uploader.py +19 -23
- nucliadb/train/utils.py +1 -1
- nucliadb/writer/__init__.py +1 -3
- nucliadb/{ingest/fields/keywordset.py → writer/api/utils.py} +13 -10
- nucliadb/writer/api/v1/export_import.py +67 -14
- nucliadb/writer/api/v1/field.py +16 -269
- nucliadb/writer/api/v1/knowledgebox.py +218 -68
- nucliadb/writer/api/v1/resource.py +68 -88
- nucliadb/writer/api/v1/services.py +51 -70
- nucliadb/writer/api/v1/slug.py +61 -0
- nucliadb/writer/api/v1/transaction.py +67 -0
- nucliadb/writer/api/v1/upload.py +143 -117
- nucliadb/writer/app.py +6 -43
- nucliadb/writer/back_pressure.py +16 -38
- nucliadb/writer/exceptions.py +0 -4
- nucliadb/writer/lifecycle.py +21 -15
- nucliadb/writer/py.typed +0 -0
- nucliadb/writer/resource/audit.py +2 -1
- nucliadb/writer/resource/basic.py +48 -46
- nucliadb/writer/resource/field.py +37 -128
- nucliadb/writer/resource/origin.py +1 -2
- nucliadb/writer/settings.py +6 -2
- nucliadb/writer/tus/__init__.py +17 -15
- nucliadb/writer/tus/azure.py +111 -0
- nucliadb/writer/tus/dm.py +17 -5
- nucliadb/writer/tus/exceptions.py +1 -3
- nucliadb/writer/tus/gcs.py +49 -84
- nucliadb/writer/tus/local.py +21 -37
- nucliadb/writer/tus/s3.py +28 -68
- nucliadb/writer/tus/storage.py +5 -56
- nucliadb/writer/vectorsets.py +125 -0
- nucliadb-6.2.1.post2798.dist-info/METADATA +148 -0
- nucliadb-6.2.1.post2798.dist-info/RECORD +343 -0
- {nucliadb-4.0.0.post542.dist-info → nucliadb-6.2.1.post2798.dist-info}/WHEEL +1 -1
- nucliadb/common/maindb/redis.py +0 -194
- nucliadb/common/maindb/tikv.py +0 -433
- nucliadb/ingest/fields/layout.py +0 -58
- nucliadb/ingest/tests/conftest.py +0 -30
- nucliadb/ingest/tests/fixtures.py +0 -764
- nucliadb/ingest/tests/integration/consumer/__init__.py +0 -18
- nucliadb/ingest/tests/integration/consumer/test_auditing.py +0 -78
- nucliadb/ingest/tests/integration/consumer/test_materializer.py +0 -126
- nucliadb/ingest/tests/integration/consumer/test_pull.py +0 -144
- nucliadb/ingest/tests/integration/consumer/test_service.py +0 -81
- nucliadb/ingest/tests/integration/consumer/test_shard_creator.py +0 -68
- nucliadb/ingest/tests/integration/ingest/test_ingest.py +0 -684
- nucliadb/ingest/tests/integration/ingest/test_processing_engine.py +0 -95
- nucliadb/ingest/tests/integration/ingest/test_relations.py +0 -272
- nucliadb/ingest/tests/unit/consumer/__init__.py +0 -18
- nucliadb/ingest/tests/unit/consumer/test_auditing.py +0 -139
- nucliadb/ingest/tests/unit/consumer/test_consumer.py +0 -69
- nucliadb/ingest/tests/unit/consumer/test_pull.py +0 -60
- nucliadb/ingest/tests/unit/consumer/test_shard_creator.py +0 -140
- nucliadb/ingest/tests/unit/consumer/test_utils.py +0 -67
- nucliadb/ingest/tests/unit/orm/__init__.py +0 -19
- nucliadb/ingest/tests/unit/orm/test_brain.py +0 -247
- nucliadb/ingest/tests/unit/orm/test_brain_vectors.py +0 -74
- nucliadb/ingest/tests/unit/orm/test_processor.py +0 -131
- nucliadb/ingest/tests/unit/orm/test_resource.py +0 -331
- nucliadb/ingest/tests/unit/test_cache.py +0 -31
- nucliadb/ingest/tests/unit/test_partitions.py +0 -40
- nucliadb/ingest/tests/unit/test_processing.py +0 -171
- nucliadb/middleware/transaction.py +0 -117
- nucliadb/reader/api/v1/learning_collector.py +0 -63
- nucliadb/reader/tests/__init__.py +0 -19
- nucliadb/reader/tests/conftest.py +0 -31
- nucliadb/reader/tests/fixtures.py +0 -136
- nucliadb/reader/tests/test_list_resources.py +0 -75
- nucliadb/reader/tests/test_reader_file_download.py +0 -273
- nucliadb/reader/tests/test_reader_resource.py +0 -353
- nucliadb/reader/tests/test_reader_resource_field.py +0 -219
- nucliadb/search/api/v1/chat.py +0 -263
- nucliadb/search/api/v1/resource/chat.py +0 -174
- nucliadb/search/tests/__init__.py +0 -19
- nucliadb/search/tests/conftest.py +0 -33
- nucliadb/search/tests/fixtures.py +0 -199
- nucliadb/search/tests/node.py +0 -466
- nucliadb/search/tests/unit/__init__.py +0 -18
- nucliadb/search/tests/unit/api/__init__.py +0 -19
- nucliadb/search/tests/unit/api/v1/__init__.py +0 -19
- nucliadb/search/tests/unit/api/v1/resource/__init__.py +0 -19
- nucliadb/search/tests/unit/api/v1/resource/test_chat.py +0 -98
- nucliadb/search/tests/unit/api/v1/test_ask.py +0 -120
- nucliadb/search/tests/unit/api/v1/test_chat.py +0 -96
- nucliadb/search/tests/unit/api/v1/test_predict_proxy.py +0 -98
- nucliadb/search/tests/unit/api/v1/test_summarize.py +0 -99
- nucliadb/search/tests/unit/search/__init__.py +0 -18
- nucliadb/search/tests/unit/search/requesters/__init__.py +0 -18
- nucliadb/search/tests/unit/search/requesters/test_utils.py +0 -211
- nucliadb/search/tests/unit/search/search/__init__.py +0 -19
- nucliadb/search/tests/unit/search/search/test_shards.py +0 -45
- nucliadb/search/tests/unit/search/search/test_utils.py +0 -82
- nucliadb/search/tests/unit/search/test_chat_prompt.py +0 -270
- nucliadb/search/tests/unit/search/test_fetch.py +0 -108
- nucliadb/search/tests/unit/search/test_filters.py +0 -125
- nucliadb/search/tests/unit/search/test_paragraphs.py +0 -157
- nucliadb/search/tests/unit/search/test_predict_proxy.py +0 -106
- nucliadb/search/tests/unit/search/test_query.py +0 -153
- nucliadb/search/tests/unit/test_app.py +0 -79
- nucliadb/search/tests/unit/test_find_merge.py +0 -112
- nucliadb/search/tests/unit/test_merge.py +0 -34
- nucliadb/search/tests/unit/test_predict.py +0 -525
- nucliadb/standalone/tests/__init__.py +0 -19
- nucliadb/standalone/tests/conftest.py +0 -33
- nucliadb/standalone/tests/fixtures.py +0 -38
- nucliadb/standalone/tests/unit/__init__.py +0 -18
- nucliadb/standalone/tests/unit/test_api_router.py +0 -61
- nucliadb/standalone/tests/unit/test_auth.py +0 -169
- nucliadb/standalone/tests/unit/test_introspect.py +0 -35
- nucliadb/standalone/tests/unit/test_migrations.py +0 -63
- nucliadb/standalone/tests/unit/test_versions.py +0 -68
- nucliadb/tests/benchmarks/__init__.py +0 -19
- nucliadb/tests/benchmarks/test_search.py +0 -99
- nucliadb/tests/conftest.py +0 -32
- nucliadb/tests/fixtures.py +0 -735
- nucliadb/tests/knowledgeboxes/philosophy_books.py +0 -202
- nucliadb/tests/knowledgeboxes/ten_dummy_resources.py +0 -107
- nucliadb/tests/migrations/test_migration_0017.py +0 -76
- nucliadb/tests/migrations/test_migration_0018.py +0 -95
- nucliadb/tests/tikv.py +0 -240
- nucliadb/tests/unit/__init__.py +0 -19
- nucliadb/tests/unit/common/__init__.py +0 -19
- nucliadb/tests/unit/common/cluster/__init__.py +0 -19
- nucliadb/tests/unit/common/cluster/discovery/__init__.py +0 -19
- nucliadb/tests/unit/common/cluster/discovery/test_k8s.py +0 -172
- nucliadb/tests/unit/common/cluster/standalone/__init__.py +0 -18
- nucliadb/tests/unit/common/cluster/standalone/test_service.py +0 -114
- nucliadb/tests/unit/common/cluster/standalone/test_utils.py +0 -61
- nucliadb/tests/unit/common/cluster/test_cluster.py +0 -408
- nucliadb/tests/unit/common/cluster/test_kb_shard_manager.py +0 -173
- nucliadb/tests/unit/common/cluster/test_rebalance.py +0 -38
- nucliadb/tests/unit/common/cluster/test_rollover.py +0 -282
- nucliadb/tests/unit/common/maindb/__init__.py +0 -18
- nucliadb/tests/unit/common/maindb/test_driver.py +0 -127
- nucliadb/tests/unit/common/maindb/test_tikv.py +0 -53
- nucliadb/tests/unit/common/maindb/test_utils.py +0 -92
- nucliadb/tests/unit/common/test_context.py +0 -36
- nucliadb/tests/unit/export_import/__init__.py +0 -19
- nucliadb/tests/unit/export_import/test_datamanager.py +0 -37
- nucliadb/tests/unit/export_import/test_utils.py +0 -301
- nucliadb/tests/unit/migrator/__init__.py +0 -19
- nucliadb/tests/unit/migrator/test_migrator.py +0 -87
- nucliadb/tests/unit/tasks/__init__.py +0 -19
- nucliadb/tests/unit/tasks/conftest.py +0 -42
- nucliadb/tests/unit/tasks/test_consumer.py +0 -92
- nucliadb/tests/unit/tasks/test_producer.py +0 -95
- nucliadb/tests/unit/tasks/test_tasks.py +0 -58
- nucliadb/tests/unit/test_field_ids.py +0 -49
- nucliadb/tests/unit/test_health.py +0 -86
- nucliadb/tests/unit/test_kb_slugs.py +0 -54
- nucliadb/tests/unit/test_learning_proxy.py +0 -252
- nucliadb/tests/unit/test_metrics_exporter.py +0 -77
- nucliadb/tests/unit/test_purge.py +0 -136
- nucliadb/tests/utils/__init__.py +0 -74
- nucliadb/tests/utils/aiohttp_session.py +0 -44
- nucliadb/tests/utils/broker_messages/__init__.py +0 -171
- nucliadb/tests/utils/broker_messages/fields.py +0 -197
- nucliadb/tests/utils/broker_messages/helpers.py +0 -33
- nucliadb/tests/utils/entities.py +0 -78
- nucliadb/train/api/v1/check.py +0 -60
- nucliadb/train/tests/__init__.py +0 -19
- nucliadb/train/tests/conftest.py +0 -29
- nucliadb/train/tests/fixtures.py +0 -342
- nucliadb/train/tests/test_field_classification.py +0 -122
- nucliadb/train/tests/test_get_entities.py +0 -80
- nucliadb/train/tests/test_get_info.py +0 -51
- nucliadb/train/tests/test_get_ontology.py +0 -34
- nucliadb/train/tests/test_get_ontology_count.py +0 -63
- nucliadb/train/tests/test_image_classification.py +0 -221
- nucliadb/train/tests/test_list_fields.py +0 -39
- nucliadb/train/tests/test_list_paragraphs.py +0 -73
- nucliadb/train/tests/test_list_resources.py +0 -39
- nucliadb/train/tests/test_list_sentences.py +0 -71
- nucliadb/train/tests/test_paragraph_classification.py +0 -123
- nucliadb/train/tests/test_paragraph_streaming.py +0 -118
- nucliadb/train/tests/test_question_answer_streaming.py +0 -239
- nucliadb/train/tests/test_sentence_classification.py +0 -143
- nucliadb/train/tests/test_token_classification.py +0 -136
- nucliadb/train/tests/utils.py +0 -101
- nucliadb/writer/layouts/__init__.py +0 -51
- nucliadb/writer/layouts/v1.py +0 -59
- nucliadb/writer/tests/__init__.py +0 -19
- nucliadb/writer/tests/conftest.py +0 -31
- nucliadb/writer/tests/fixtures.py +0 -191
- nucliadb/writer/tests/test_fields.py +0 -475
- nucliadb/writer/tests/test_files.py +0 -740
- nucliadb/writer/tests/test_knowledgebox.py +0 -49
- nucliadb/writer/tests/test_reprocess_file_field.py +0 -133
- nucliadb/writer/tests/test_resources.py +0 -476
- nucliadb/writer/tests/test_service.py +0 -137
- nucliadb/writer/tests/test_tus.py +0 -203
- nucliadb/writer/tests/utils.py +0 -35
- nucliadb/writer/tus/pg.py +0 -125
- nucliadb-4.0.0.post542.dist-info/METADATA +0 -135
- nucliadb-4.0.0.post542.dist-info/RECORD +0 -462
- {nucliadb/ingest/tests → migrations/pg}/__init__.py +0 -0
- /nucliadb/{ingest/tests/integration → common/external_index_providers}/__init__.py +0 -0
- /nucliadb/{ingest/tests/integration/ingest → common/models_utils}/__init__.py +0 -0
- /nucliadb/{ingest/tests/unit → search/search/query_parser}/__init__.py +0 -0
- /nucliadb/{ingest/tests → tests}/vectors.py +0 -0
- {nucliadb-4.0.0.post542.dist-info → nucliadb-6.2.1.post2798.dist-info}/entry_points.txt +0 -0
- {nucliadb-4.0.0.post542.dist-info → nucliadb-6.2.1.post2798.dist-info}/top_level.txt +0 -0
- {nucliadb-4.0.0.post542.dist-info → nucliadb-6.2.1.post2798.dist-info}/zip-safe +0 -0
@@ -28,14 +28,14 @@ from fastapi_versioning import version
|
|
28
28
|
from starlette.datastructures import Headers
|
29
29
|
from starlette.responses import StreamingResponse
|
30
30
|
|
31
|
-
from nucliadb.
|
31
|
+
from nucliadb.common.ids import FIELD_TYPE_PB_TO_STR
|
32
|
+
from nucliadb.common.models_utils import to_proto
|
32
33
|
from nucliadb.ingest.serialize import get_resource_uuid_by_slug
|
33
34
|
from nucliadb.reader import SERVICE_NAME, logger
|
34
|
-
from nucliadb.reader.api.models import FIELD_NAMES_TO_PB_TYPE_MAP
|
35
35
|
from nucliadb_models.common import FieldTypeName
|
36
36
|
from nucliadb_models.resource import NucliaDBRoles
|
37
37
|
from nucliadb_utils.authentication import requires_one
|
38
|
-
from nucliadb_utils.storages.storage import
|
38
|
+
from nucliadb_utils.storages.storage import ObjectMetadata, Range, StorageField
|
39
39
|
from nucliadb_utils.utilities import get_storage
|
40
40
|
|
41
41
|
from .router import KB_PREFIX, RESOURCE_PREFIX, RSLUG_PREFIX, api
|
@@ -62,9 +62,7 @@ async def download_extract_file_rslug_prefix(
|
|
62
62
|
field_id: str,
|
63
63
|
download_field: str,
|
64
64
|
) -> Response:
|
65
|
-
return await _download_extract_file(
|
66
|
-
request, kbid, field_type, field_id, download_field, rslug=rslug
|
67
|
-
)
|
65
|
+
return await _download_extract_file(request, kbid, field_type, field_id, download_field, rslug=rslug)
|
68
66
|
|
69
67
|
|
70
68
|
@api.get(
|
@@ -83,9 +81,7 @@ async def download_extract_file_rid_prefix(
|
|
83
81
|
field_id: str,
|
84
82
|
download_field: str,
|
85
83
|
) -> Response:
|
86
|
-
return await _download_extract_file(
|
87
|
-
request, kbid, field_type, field_id, download_field, rid=rid
|
88
|
-
)
|
84
|
+
return await _download_extract_file(request, kbid, field_type, field_id, download_field, rid=rid)
|
89
85
|
|
90
86
|
|
91
87
|
async def _download_extract_file(
|
@@ -101,8 +97,8 @@ async def _download_extract_file(
|
|
101
97
|
|
102
98
|
storage = await get_storage(service_name=SERVICE_NAME)
|
103
99
|
|
104
|
-
pb_field_type =
|
105
|
-
field_type_letter =
|
100
|
+
pb_field_type = to_proto.field_type_name(field_type)
|
101
|
+
field_type_letter = FIELD_TYPE_PB_TO_STR[pb_field_type]
|
106
102
|
|
107
103
|
sf = storage.file_extracted(kbid, rid, field_type_letter, field_id, download_field)
|
108
104
|
|
@@ -124,9 +120,7 @@ async def download_field_file_rslug_prefix(
|
|
124
120
|
field_id: str,
|
125
121
|
inline: bool = False,
|
126
122
|
) -> Response:
|
127
|
-
return await _download_field_file(
|
128
|
-
request, kbid, field_id, rslug=rslug, inline=inline
|
129
|
-
)
|
123
|
+
return await _download_field_file(request, kbid, field_id, rslug=rslug, inline=inline)
|
130
124
|
|
131
125
|
|
132
126
|
@api.get(
|
@@ -164,63 +158,6 @@ async def _download_field_file(
|
|
164
158
|
return await download_api(sf, request.headers, inline=inline)
|
165
159
|
|
166
160
|
|
167
|
-
@api.get(
|
168
|
-
f"/{KB_PREFIX}/{{kbid}}/{RSLUG_PREFIX}/{{rslug}}/layout/{{field_id}}/download/field/{{download_field}}",
|
169
|
-
tags=["Resource fields"],
|
170
|
-
status_code=200,
|
171
|
-
summary="Download layout binary field (by slug)",
|
172
|
-
)
|
173
|
-
@requires_one([NucliaDBRoles.READER])
|
174
|
-
@version(1)
|
175
|
-
async def download_field_layout_rslug_prefix(
|
176
|
-
request: Request,
|
177
|
-
kbid: str,
|
178
|
-
rslug: str,
|
179
|
-
field_id: str,
|
180
|
-
download_field: str,
|
181
|
-
) -> Response:
|
182
|
-
return await _download_field_layout(
|
183
|
-
request, kbid, field_id, download_field, rslug=rslug
|
184
|
-
)
|
185
|
-
|
186
|
-
|
187
|
-
@api.get(
|
188
|
-
f"/{KB_PREFIX}/{{kbid}}/{RESOURCE_PREFIX}/{{rid}}/layout/{{field_id}}/download/field/{{download_field}}",
|
189
|
-
tags=["Resource fields"],
|
190
|
-
status_code=200,
|
191
|
-
summary="Download layout binary field (by id)",
|
192
|
-
)
|
193
|
-
@requires_one([NucliaDBRoles.READER])
|
194
|
-
@version(1)
|
195
|
-
async def download_field_layout_rid_prefix(
|
196
|
-
request: Request,
|
197
|
-
kbid: str,
|
198
|
-
rid: str,
|
199
|
-
field_id: str,
|
200
|
-
download_field: str,
|
201
|
-
) -> Response:
|
202
|
-
return await _download_field_layout(
|
203
|
-
request, kbid, field_id, download_field, rid=rid
|
204
|
-
)
|
205
|
-
|
206
|
-
|
207
|
-
async def _download_field_layout(
|
208
|
-
request: Request,
|
209
|
-
kbid: str,
|
210
|
-
field_id: str,
|
211
|
-
download_field: str,
|
212
|
-
rid: Optional[str] = None,
|
213
|
-
rslug: Optional[str] = None,
|
214
|
-
) -> Response:
|
215
|
-
rid = await _get_resource_uuid_from_params(kbid, rid, rslug)
|
216
|
-
|
217
|
-
storage = await get_storage(service_name=SERVICE_NAME)
|
218
|
-
|
219
|
-
sf = storage.layout_field(kbid, rid, field_id, download_field)
|
220
|
-
|
221
|
-
return await download_api(sf, request.headers)
|
222
|
-
|
223
|
-
|
224
161
|
@api.get(
|
225
162
|
f"/{KB_PREFIX}/{{kbid}}/{RSLUG_PREFIX}/{{rslug}}/conversation/{{field_id}}/download/field/{{message_id}}/{{file_num}}", # noqa
|
226
163
|
tags=["Resource fields"],
|
@@ -237,9 +174,7 @@ async def download_field_conversation_rslug_prefix(
|
|
237
174
|
message_id: str,
|
238
175
|
file_num: int,
|
239
176
|
) -> Response:
|
240
|
-
return await _download_field_conversation(
|
241
|
-
request, kbid, field_id, message_id, file_num, rslug=rslug
|
242
|
-
)
|
177
|
+
return await _download_field_conversation(request, kbid, field_id, message_id, file_num, rslug=rslug)
|
243
178
|
|
244
179
|
|
245
180
|
@api.get(
|
@@ -258,9 +193,7 @@ async def download_field_conversation_rid_prefix(
|
|
258
193
|
message_id: str,
|
259
194
|
file_num: int,
|
260
195
|
) -> Response:
|
261
|
-
return await _download_field_conversation(
|
262
|
-
request, kbid, field_id, message_id, file_num, rid=rid
|
263
|
-
)
|
196
|
+
return await _download_field_conversation(request, kbid, field_id, message_id, file_num, rid=rid)
|
264
197
|
|
265
198
|
|
266
199
|
async def _download_field_conversation(
|
@@ -282,13 +215,13 @@ async def _download_field_conversation(
|
|
282
215
|
|
283
216
|
|
284
217
|
async def download_api(sf: StorageField, headers: Headers, inline: bool = False):
|
285
|
-
metadata = await sf.exists()
|
218
|
+
metadata: Optional[ObjectMetadata] = await sf.exists()
|
286
219
|
if metadata is None:
|
287
220
|
raise HTTPException(status_code=404, detail="Specified file doesn't exist")
|
288
221
|
|
289
|
-
file_size =
|
290
|
-
content_type = metadata.
|
291
|
-
filename = metadata.
|
222
|
+
file_size = metadata.size or -1
|
223
|
+
content_type = metadata.content_type or "application/octet-stream"
|
224
|
+
filename = metadata.filename or "file"
|
292
225
|
filename = safe_http_header_encode(filename)
|
293
226
|
|
294
227
|
status_code = 200
|
@@ -299,8 +232,10 @@ async def download_api(sf: StorageField, headers: Headers, inline: bool = False)
|
|
299
232
|
"Content-Type": content_type,
|
300
233
|
"Content-Disposition": content_disposition,
|
301
234
|
}
|
302
|
-
|
235
|
+
|
236
|
+
range = Range()
|
303
237
|
if "range" in headers and file_size > -1:
|
238
|
+
status_code = 206
|
304
239
|
range_request = headers["range"]
|
305
240
|
try:
|
306
241
|
start, end, range_size = parse_media_range(range_request, file_size)
|
@@ -341,23 +276,21 @@ async def download_api(sf: StorageField, headers: Headers, inline: bool = False)
|
|
341
276
|
headers={"Content-Range": f"bytes */{file_size}"},
|
342
277
|
status_code=416,
|
343
278
|
)
|
344
|
-
status_code = 206
|
345
279
|
logger.debug(f"Range request: {range_request}")
|
346
280
|
extra_headers["Content-Length"] = f"{range_size}"
|
347
281
|
extra_headers["Content-Range"] = f"bytes {start}-{end}/{file_size}"
|
348
|
-
|
282
|
+
range.start = start
|
283
|
+
range.end = end
|
349
284
|
|
350
285
|
return StreamingResponse(
|
351
|
-
sf.storage.download(sf.bucket, sf.key,
|
286
|
+
sf.storage.download(sf.bucket, sf.key, range=range),
|
352
287
|
status_code=status_code,
|
353
288
|
media_type=content_type,
|
354
289
|
headers=extra_headers,
|
355
290
|
)
|
356
291
|
|
357
292
|
|
358
|
-
async def _get_resource_uuid_from_params(
|
359
|
-
kbid, rid: Optional[str], rslug: Optional[str]
|
360
|
-
) -> str:
|
293
|
+
async def _get_resource_uuid_from_params(kbid, rid: Optional[str], rslug: Optional[str]) -> str:
|
361
294
|
if not any([rid, rslug]):
|
362
295
|
raise ValueError("Either rid or slug must be set")
|
363
296
|
|
@@ -160,5 +160,5 @@ async def _get_status(
|
|
160
160
|
|
161
161
|
|
162
162
|
async def exists_kb(kbid: str) -> bool:
|
163
|
-
async with datamanagers.
|
163
|
+
async with datamanagers.with_ro_transaction() as txn:
|
164
164
|
return await datamanagers.kb.exists_kb(txn, kbid=kbid)
|
@@ -18,14 +18,14 @@
|
|
18
18
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
19
19
|
#
|
20
20
|
from fastapi import HTTPException
|
21
|
-
from fastapi_versioning import version
|
21
|
+
from fastapi_versioning import version
|
22
22
|
from starlette.requests import Request
|
23
23
|
|
24
24
|
from nucliadb.common import datamanagers
|
25
25
|
from nucliadb.common.maindb.utils import get_driver
|
26
|
+
from nucliadb.common.models_utils import from_proto
|
26
27
|
from nucliadb.reader.api.v1.router import KB_PREFIX, KBS_PREFIX, api
|
27
28
|
from nucliadb_models.resource import (
|
28
|
-
KnowledgeBoxConfig,
|
29
29
|
KnowledgeBoxList,
|
30
30
|
KnowledgeBoxObj,
|
31
31
|
KnowledgeBoxObjSummary,
|
@@ -46,10 +46,10 @@ from nucliadb_utils.authentication import requires, requires_one
|
|
46
46
|
@version(1)
|
47
47
|
async def get_kbs(request: Request, prefix: str = "") -> KnowledgeBoxList:
|
48
48
|
driver = get_driver()
|
49
|
-
async with driver.transaction() as txn:
|
49
|
+
async with driver.transaction(read_only=True) as txn:
|
50
50
|
response = KnowledgeBoxList()
|
51
51
|
async for kbid, slug in datamanagers.kb.get_kbs(txn, prefix=prefix):
|
52
|
-
response.kbs.append(KnowledgeBoxObjSummary(slug=slug or None, uuid=kbid))
|
52
|
+
response.kbs.append(KnowledgeBoxObjSummary(slug=slug or None, uuid=kbid))
|
53
53
|
return response
|
54
54
|
|
55
55
|
|
@@ -64,15 +64,15 @@ async def get_kbs(request: Request, prefix: str = "") -> KnowledgeBoxList:
|
|
64
64
|
@version(1)
|
65
65
|
async def get_kb(request: Request, kbid: str) -> KnowledgeBoxObj:
|
66
66
|
driver = get_driver()
|
67
|
-
async with driver.transaction() as txn:
|
67
|
+
async with driver.transaction(read_only=True) as txn:
|
68
68
|
kb_config = await datamanagers.kb.get_config(txn, kbid=kbid)
|
69
69
|
if kb_config is None:
|
70
70
|
raise HTTPException(status_code=404, detail="Knowledge Box does not exist")
|
71
71
|
|
72
72
|
return KnowledgeBoxObj(
|
73
73
|
uuid=kbid,
|
74
|
-
slug=kb_config.slug,
|
75
|
-
config=
|
74
|
+
slug=kb_config.slug,
|
75
|
+
config=from_proto.knowledgebox_config(kb_config),
|
76
76
|
)
|
77
77
|
|
78
78
|
|
@@ -87,7 +87,7 @@ async def get_kb(request: Request, kbid: str) -> KnowledgeBoxObj:
|
|
87
87
|
@version(1)
|
88
88
|
async def get_kb_by_slug(request: Request, slug: str) -> KnowledgeBoxObj:
|
89
89
|
driver = get_driver()
|
90
|
-
async with driver.transaction() as txn:
|
90
|
+
async with driver.transaction(read_only=True) as txn:
|
91
91
|
kbid = await datamanagers.kb.get_kb_uuid(txn, slug=slug)
|
92
92
|
if kbid is None:
|
93
93
|
raise HTTPException(status_code=404, detail="Knowledge Box does not exist")
|
@@ -98,6 +98,6 @@ async def get_kb_by_slug(request: Request, slug: str) -> KnowledgeBoxObj:
|
|
98
98
|
|
99
99
|
return KnowledgeBoxObj(
|
100
100
|
uuid=kbid,
|
101
|
-
slug=kb_config.slug,
|
102
|
-
config=
|
101
|
+
slug=kb_config.slug,
|
102
|
+
config=from_proto.knowledgebox_config(kb_config),
|
103
103
|
)
|
@@ -44,9 +44,7 @@ async def download_model(
|
|
44
44
|
model_id: str,
|
45
45
|
filename: str,
|
46
46
|
):
|
47
|
-
return await learning_config_proxy(
|
48
|
-
request, "GET", f"/download/{kbid}/model/{model_id}/{filename}"
|
49
|
-
)
|
47
|
+
return await learning_config_proxy(request, "GET", f"/download/{kbid}/model/{model_id}/{filename}")
|
50
48
|
|
51
49
|
|
52
50
|
@api.get(
|
@@ -143,7 +141,5 @@ async def get_schema_for_configuration_creation(
|
|
143
141
|
request: Request,
|
144
142
|
):
|
145
143
|
if not is_onprem_nucliadb():
|
146
|
-
return HTTPClientError(
|
147
|
-
status_code=404, detail="Endpoint not available for Hosted NucliaDB"
|
148
|
-
)
|
144
|
+
return HTTPClientError(status_code=404, detail="Endpoint not available for Hosted NucliaDB")
|
149
145
|
return await learning_config_proxy(request, "GET", f"/schema")
|
@@ -22,22 +22,21 @@ from typing import Optional, Union
|
|
22
22
|
from fastapi import Header, HTTPException, Query, Request, Response
|
23
23
|
from fastapi_versioning import version
|
24
24
|
|
25
|
-
|
25
|
+
from nucliadb.common.datamanagers.resources import KB_RESOURCE_SLUG_BASE
|
26
26
|
from nucliadb.common.maindb.utils import get_driver
|
27
|
+
from nucliadb.common.models_utils import from_proto, to_proto
|
27
28
|
from nucliadb.ingest.fields.conversation import Conversation
|
28
29
|
from nucliadb.ingest.orm.knowledgebox import KnowledgeBox as ORMKnowledgeBox
|
29
|
-
from nucliadb.ingest.orm.resource import KB_RESOURCE_SLUG_BASE
|
30
30
|
from nucliadb.ingest.orm.resource import Resource as ORMResource
|
31
31
|
from nucliadb.ingest.serialize import (
|
32
32
|
managed_serialize,
|
33
33
|
serialize,
|
34
34
|
set_resource_field_extracted_data,
|
35
35
|
)
|
36
|
-
from nucliadb.reader import SERVICE_NAME
|
36
|
+
from nucliadb.reader import SERVICE_NAME
|
37
37
|
from nucliadb.reader.api import DEFAULT_RESOURCE_LIST_PAGE_SIZE
|
38
38
|
from nucliadb.reader.api.models import (
|
39
39
|
FIELD_NAME_TO_EXTRACTED_DATA_FIELD_MAP,
|
40
|
-
FIELD_NAMES_TO_PB_TYPE_MAP,
|
41
40
|
ResourceField,
|
42
41
|
)
|
43
42
|
from nucliadb.reader.api.v1.router import KB_PREFIX, RESOURCE_PREFIX, RSLUG_PREFIX, api
|
@@ -77,60 +76,55 @@ async def list_resources(
|
|
77
76
|
|
78
77
|
# Get counters from maindb
|
79
78
|
driver = get_driver()
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
raise HTTPException(
|
130
|
-
status_code=500, detail="Couldn't retrieve list of resources right now"
|
131
|
-
)
|
132
|
-
finally:
|
133
|
-
await txn.abort()
|
79
|
+
async with driver.transaction(read_only=True) as txn:
|
80
|
+
# Filter parameters for serializer
|
81
|
+
show: list[ResourceProperties] = [ResourceProperties.BASIC]
|
82
|
+
field_types: list[FieldTypeName] = []
|
83
|
+
extracted: list[ExtractedDataTypeName] = []
|
84
|
+
|
85
|
+
try:
|
86
|
+
resources: list[Resource] = []
|
87
|
+
max_items_to_iterate = (page + 1) * size
|
88
|
+
first_wanted_item_index = (page * size) + 1 # 1-based index
|
89
|
+
current_key_index = 0
|
90
|
+
|
91
|
+
# ask for one item more than we need, in order to know if it's the last page
|
92
|
+
keys_generator = txn.keys(
|
93
|
+
match=KB_RESOURCE_SLUG_BASE.format(kbid=kbid),
|
94
|
+
count=max_items_to_iterate + 1,
|
95
|
+
)
|
96
|
+
async for key in keys_generator:
|
97
|
+
current_key_index += 1
|
98
|
+
|
99
|
+
# First of all, we need to skip keys, in case we are on a +1 page
|
100
|
+
if page > 0 and current_key_index < first_wanted_item_index:
|
101
|
+
continue
|
102
|
+
|
103
|
+
# Don't fetch keys once we got all items for this
|
104
|
+
if len(resources) == size:
|
105
|
+
await keys_generator.aclose()
|
106
|
+
break
|
107
|
+
|
108
|
+
# Fetch and Add wanted item
|
109
|
+
rid = await txn.get(key, for_update=False)
|
110
|
+
if rid:
|
111
|
+
result = await managed_serialize(
|
112
|
+
txn,
|
113
|
+
kbid,
|
114
|
+
rid.decode(),
|
115
|
+
show,
|
116
|
+
field_types,
|
117
|
+
extracted,
|
118
|
+
service_name=SERVICE_NAME,
|
119
|
+
)
|
120
|
+
if result is not None:
|
121
|
+
resources.append(result)
|
122
|
+
|
123
|
+
is_last_page = current_key_index <= max_items_to_iterate
|
124
|
+
|
125
|
+
except Exception as exc:
|
126
|
+
errors.capture_exception(exc)
|
127
|
+
raise HTTPException(status_code=500, detail="Couldn't retrieve list of resources right now")
|
134
128
|
|
135
129
|
return ResourceList(
|
136
130
|
resources=resources,
|
@@ -153,9 +147,7 @@ async def get_resource_by_uuid(
|
|
153
147
|
kbid: str,
|
154
148
|
rid: str,
|
155
149
|
show: list[ResourceProperties] = Query([ResourceProperties.BASIC]),
|
156
|
-
field_type_filter: list[FieldTypeName] = Query(
|
157
|
-
list(FieldTypeName), alias="field_type"
|
158
|
-
),
|
150
|
+
field_type_filter: list[FieldTypeName] = Query(list(FieldTypeName), alias="field_type"),
|
159
151
|
extracted: list[ExtractedDataTypeName] = Query(
|
160
152
|
[
|
161
153
|
ExtractedDataTypeName.TEXT,
|
@@ -193,9 +185,7 @@ async def get_resource_by_slug(
|
|
193
185
|
kbid: str,
|
194
186
|
rslug: str,
|
195
187
|
show: list[ResourceProperties] = Query([ResourceProperties.BASIC]),
|
196
|
-
field_type_filter: list[FieldTypeName] = Query(
|
197
|
-
list(FieldTypeName), alias="field_type"
|
198
|
-
),
|
188
|
+
field_type_filter: list[FieldTypeName] = Query(list(FieldTypeName), alias="field_type"),
|
199
189
|
extracted: list[ExtractedDataTypeName] = Query(
|
200
190
|
[
|
201
191
|
ExtractedDataTypeName.TEXT,
|
@@ -235,7 +225,7 @@ async def _get_resource(
|
|
235
225
|
audit = get_audit()
|
236
226
|
if audit is not None:
|
237
227
|
audit_id = rid if rid else rslug
|
238
|
-
|
228
|
+
audit.visited(kbid, audit_id, x_nucliadb_user, x_forwarded_for) # type: ignore
|
239
229
|
|
240
230
|
result = await serialize(
|
241
231
|
kbid,
|
@@ -343,9 +333,7 @@ async def _get_resource_field(
|
|
343
333
|
) -> Response:
|
344
334
|
storage = await get_storage(service_name=SERVICE_NAME)
|
345
335
|
driver = get_driver()
|
346
|
-
|
347
|
-
pb_field_id = FIELD_NAMES_TO_PB_TYPE_MAP[field_type]
|
348
|
-
|
336
|
+
pb_field_id = to_proto.field_type_name(field_type)
|
349
337
|
async with driver.transaction() as txn:
|
350
338
|
kb = ORMKnowledgeBox(txn, storage, kbid)
|
351
339
|
|
@@ -360,34 +348,22 @@ async def _get_resource_field(
|
|
360
348
|
if field is None:
|
361
349
|
raise HTTPException(status_code=404, detail="Knowledge Box does not exist")
|
362
350
|
|
363
|
-
resource_field = ResourceField(field_id=field_id, field_type=field_type)
|
351
|
+
resource_field = ResourceField(field_id=field_id, field_type=field_type)
|
364
352
|
|
365
353
|
if ResourceFieldProperties.VALUE in show:
|
366
354
|
value = await field.get_value()
|
367
355
|
|
368
356
|
if isinstance(value, resources_pb2.FieldText):
|
369
357
|
value = await field.get_value()
|
370
|
-
resource_field.value =
|
358
|
+
resource_field.value = from_proto.field_text(value)
|
371
359
|
|
372
360
|
if isinstance(value, resources_pb2.FieldFile):
|
373
361
|
value = await field.get_value()
|
374
|
-
resource_field.value =
|
362
|
+
resource_field.value = from_proto.field_file(value)
|
375
363
|
|
376
364
|
if isinstance(value, resources_pb2.FieldLink):
|
377
365
|
value = await field.get_value()
|
378
|
-
resource_field.value =
|
379
|
-
|
380
|
-
if isinstance(value, resources_pb2.FieldLayout):
|
381
|
-
value = await field.get_value()
|
382
|
-
resource_field.value = models.FieldLayout.from_message(value)
|
383
|
-
|
384
|
-
if isinstance(value, resources_pb2.FieldDatetime):
|
385
|
-
value = await field.get_value()
|
386
|
-
resource_field.value = models.FieldDatetime.from_message(value)
|
387
|
-
|
388
|
-
if isinstance(value, resources_pb2.FieldKeywordset):
|
389
|
-
value = await field.get_value()
|
390
|
-
resource_field.value = models.FieldKeywordset.from_message(value)
|
366
|
+
resource_field.value = from_proto.field_link(value)
|
391
367
|
|
392
368
|
if isinstance(field, Conversation):
|
393
369
|
if page == "first":
|
@@ -400,12 +376,10 @@ async def _get_resource_field(
|
|
400
376
|
|
401
377
|
value = await field.get_value(page=page_to_fetch)
|
402
378
|
if value is not None:
|
403
|
-
resource_field.value =
|
379
|
+
resource_field.value = from_proto.conversation(value)
|
404
380
|
|
405
381
|
if ResourceFieldProperties.EXTRACTED in show and extracted:
|
406
|
-
resource_field.extracted = FIELD_NAME_TO_EXTRACTED_DATA_FIELD_MAP[
|
407
|
-
field_type
|
408
|
-
]()
|
382
|
+
resource_field.extracted = FIELD_NAME_TO_EXTRACTED_DATA_FIELD_MAP[field_type]()
|
409
383
|
await set_resource_field_extracted_data(
|
410
384
|
field,
|
411
385
|
resource_field.extracted,
|