nucliadb 6.4.0.post4158__py3-none-any.whl → 6.4.0.post4161__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.
@@ -68,6 +68,9 @@ FIND_FETCH_OPS_DISTRIBUTION = metrics.Histogram(
68
68
  buckets=[1, 5, 10, 20, 30, 40, 50, 60, 80, 100, 200],
69
69
  )
70
70
 
71
+ # Constant score given to all graph results until we implement graph scoring
72
+ FAKE_GRAPH_SCORE = 1.0
73
+
71
74
 
72
75
  @merge_observer.wrap({"type": "find_merge"})
73
76
  async def build_find_response(
@@ -103,14 +106,9 @@ async def build_find_response(
103
106
  search_response.vector.documents,
104
107
  )
105
108
  )
109
+ graph_results = graph_results_to_text_block_matches(search_response.graph)
106
110
 
107
- merged_text_blocks: list[TextBlockMatch]
108
- if len(keyword_results) == 0:
109
- merged_text_blocks = semantic_results
110
- elif len(semantic_results) == 0:
111
- merged_text_blocks = keyword_results
112
- else:
113
- merged_text_blocks = rank_fusion_algorithm.fuse(keyword_results, semantic_results)
111
+ merged_text_blocks = rank_fusion_algorithm.fuse(keyword_results, semantic_results, graph_results)
114
112
 
115
113
  # cut
116
114
  # we assume pagination + predict reranker is forbidden and has been already
@@ -336,6 +334,43 @@ def semantic_results_to_text_block_matches(items: Iterable[DocumentScored]) -> l
336
334
  return text_blocks
337
335
 
338
336
 
337
+ def graph_results_to_text_block_matches(item: GraphSearchResponse) -> list[TextBlockMatch]:
338
+ matches = []
339
+ for path in item.graph:
340
+ metadata = path.metadata
341
+
342
+ if not metadata.paragraph_id:
343
+ continue
344
+
345
+ paragraph_id = ParagraphId.from_string(metadata.paragraph_id)
346
+ matches.append(
347
+ TextBlockMatch(
348
+ paragraph_id=paragraph_id,
349
+ score=FAKE_GRAPH_SCORE,
350
+ score_type=SCORE_TYPE.RELATION_RELEVANCE,
351
+ order=0, # NOTE: this will be filled later
352
+ text="", # NOTE: this will be filled later too
353
+ position=TextPosition(
354
+ page_number=0,
355
+ index=0,
356
+ start=paragraph_id.paragraph_start,
357
+ end=paragraph_id.paragraph_end,
358
+ start_seconds=[],
359
+ end_seconds=[],
360
+ ),
361
+ # XXX: we should split labels
362
+ field_labels=[],
363
+ paragraph_labels=[],
364
+ fuzzy_search=False, # TODO: this depends on the query, should we populate it?
365
+ is_a_table=False,
366
+ representation_file="",
367
+ page_with_visual=False,
368
+ )
369
+ )
370
+
371
+ return matches
372
+
373
+
339
374
  @merge_observer.wrap({"type": "hydrate_and_rerank"})
340
375
  async def hydrate_and_rerank(
341
376
  text_blocks: Iterable[TextBlockMatch],
@@ -26,6 +26,7 @@ from pydantic import BaseModel, ConfigDict, Field
26
26
 
27
27
  from nucliadb.search.search.query_parser.fetcher import Fetcher
28
28
  from nucliadb_models import search as search_models
29
+ from nucliadb_models.graph.requests import GraphPathQuery
29
30
  from nucliadb_protos import utils_pb2
30
31
 
31
32
  ### Retrieval
@@ -61,11 +62,16 @@ class RelationQuery(BaseModel):
61
62
  deleted_entities: dict[str, list[str]]
62
63
 
63
64
 
65
+ class GraphQuery(BaseModel):
66
+ query: GraphPathQuery
67
+
68
+
64
69
  class Query(BaseModel):
65
70
  fulltext: Optional[FulltextQuery] = None
66
71
  keyword: Optional[KeywordQuery] = None
67
72
  semantic: Optional[SemanticQuery] = None
68
73
  relation: Optional[RelationQuery] = None
74
+ graph: Optional[GraphQuery] = None
69
75
 
70
76
 
71
77
  # filters
@@ -180,3 +186,7 @@ class CatalogQuery(BaseModel):
180
186
  # Right now, we don't need a more generic model for graph queries, we can
181
187
  # directly use the protobuffer directly
182
188
  GraphRetrieval = nodereader_pb2.GraphSearchRequest
189
+
190
+
191
+ # We need this to avoid issues with pydantic and generic types defined in another module
192
+ GraphQuery.model_rebuild()
@@ -31,6 +31,7 @@ from nucliadb.search.search.query_parser.fetcher import Fetcher
31
31
  from nucliadb.search.search.query_parser.filter_expression import parse_expression
32
32
  from nucliadb.search.search.query_parser.models import (
33
33
  Filters,
34
+ GraphQuery,
34
35
  NoopReranker,
35
36
  ParsedQuery,
36
37
  PredictReranker,
@@ -112,7 +113,8 @@ class _FindParser:
112
113
  if search_models.FindOptions.RELATIONS in self.item.features:
113
114
  self._query.relation = await self._parse_relation_query()
114
115
 
115
- # TODO: graph search
116
+ if search_models.FindOptions.GRAPH in self.item.features:
117
+ self._query.graph = await self._parse_graph_query()
116
118
 
117
119
  filters = await self._parse_filters()
118
120
 
@@ -151,6 +153,7 @@ class _FindParser:
151
153
  and (
152
154
  search_models.FindOptions.SEMANTIC in self.item.features
153
155
  or search_models.FindOptions.RELATIONS in self.item.features
156
+ or search_models.FindOptions.GRAPH in self.item.features
154
157
  )
155
158
  ):
156
159
  raise InvalidQueryError(
@@ -162,6 +165,9 @@ class _FindParser:
162
165
  if should_disable_vector_search(self.item):
163
166
  self.item.features.remove(search_models.FindOptions.SEMANTIC)
164
167
 
168
+ if self.item.graph_query and search_models.FindOptions.GRAPH not in self.item.features:
169
+ raise InvalidQueryError("graph_query", "Using a graph query requires enabling graph feature")
170
+
165
171
  async def _parse_relation_query(self) -> RelationQuery:
166
172
  detected_entities = await self._get_detected_entities()
167
173
 
@@ -176,6 +182,13 @@ class _FindParser:
176
182
  deleted_entities=deleted_entities,
177
183
  )
178
184
 
185
+ async def _parse_graph_query(self) -> GraphQuery:
186
+ if self.item.graph_query is None:
187
+ raise InvalidQueryError(
188
+ "graph_query", "Graph query must be provided when using graph search"
189
+ )
190
+ return GraphQuery(query=self.item.graph_query)
191
+
179
192
  async def _get_detected_entities(self) -> list[utils_pb2.RelationNode]:
180
193
  """Get entities from request, either automatically detected or
181
194
  explicitly set by the user."""
@@ -33,7 +33,7 @@ from nucliadb_protos import utils_pb2
33
33
 
34
34
  async def parse_graph_search(kbid: str, item: graph_requests.GraphSearchRequest) -> GraphRetrieval:
35
35
  pb = await _parse_common(kbid, item)
36
- pb.query.path.CopyFrom(_parse_path_query(item.query))
36
+ pb.query.path.CopyFrom(parse_path_query(item.query))
37
37
  pb.kind = nodereader_pb2.GraphSearchRequest.QueryKind.PATH
38
38
  return pb
39
39
 
@@ -111,19 +111,19 @@ def _parse_security(kbid: str, item: AnyGraphRequest) -> Optional[utils_pb2.Secu
111
111
  return None
112
112
 
113
113
 
114
- def _parse_path_query(expr: graph_requests.GraphPathQuery) -> nodereader_pb2.GraphQuery.PathQuery:
114
+ def parse_path_query(expr: graph_requests.GraphPathQuery) -> nodereader_pb2.GraphQuery.PathQuery:
115
115
  pb = nodereader_pb2.GraphQuery.PathQuery()
116
116
 
117
117
  if isinstance(expr, graph_requests.And):
118
118
  for op in expr.operands:
119
- pb.bool_and.operands.append(_parse_path_query(op))
119
+ pb.bool_and.operands.append(parse_path_query(op))
120
120
 
121
121
  elif isinstance(expr, graph_requests.Or):
122
122
  for op in expr.operands:
123
- pb.bool_or.operands.append(_parse_path_query(op))
123
+ pb.bool_or.operands.append(parse_path_query(op))
124
124
 
125
125
  elif isinstance(expr, graph_requests.Not):
126
- pb.bool_not.CopyFrom(_parse_path_query(expr.operand))
126
+ pb.bool_not.CopyFrom(parse_path_query(expr.operand))
127
127
 
128
128
  elif isinstance(expr, graph_requests.GraphPath):
129
129
  if expr.source is not None:
@@ -27,6 +27,7 @@ from nucliadb.search.search.metrics import node_features, query_parser_observer
27
27
  from nucliadb.search.search.query import apply_entities_filter, get_sort_field_proto
28
28
  from nucliadb.search.search.query_parser.filter_expression import add_and_expression
29
29
  from nucliadb.search.search.query_parser.models import ParsedQuery, PredictReranker, UnitRetrieval
30
+ from nucliadb.search.search.query_parser.parsers.graph import parse_path_query
30
31
  from nucliadb_models.labels import LABEL_HIDDEN, translate_system_to_alias_label
31
32
  from nucliadb_models.search import SortOrderMap
32
33
  from nucliadb_protos import utils_pb2
@@ -71,11 +72,12 @@ class _Converter:
71
72
  self._apply_text_queries()
72
73
  self._apply_semantic_query()
73
74
  self._apply_relation_query()
75
+ self._apply_graph_query()
74
76
  self._apply_filters()
75
77
  self._apply_top_k()
76
78
  return self.req
77
79
 
78
- def _apply_text_queries(self):
80
+ def _apply_text_queries(self) -> None:
79
81
  text_query = self.retrieval.query.keyword or self.retrieval.query.fulltext
80
82
  if text_query is None:
81
83
  return
@@ -105,7 +107,7 @@ class _Converter:
105
107
  self.req.order.sort_by = sort_field
106
108
  self.req.order.type = SortOrderMap[text_query.sort] # type: ignore
107
109
 
108
- def _apply_semantic_query(self):
110
+ def _apply_semantic_query(self) -> None:
109
111
  if self.retrieval.query.semantic is None:
110
112
  return
111
113
 
@@ -118,7 +120,7 @@ class _Converter:
118
120
  self.req.vectorset = self.retrieval.query.semantic.vectorset
119
121
  self.req.vector.extend(query_vector)
120
122
 
121
- def _apply_relation_query(self):
123
+ def _apply_relation_query(self) -> None:
122
124
  """Relation queries are the legacy way to query the knowledge graph.
123
125
  Given a set of entry points and some subtypes and entities to exclude
124
126
  from search, it'd find the distance 1 neighbours (BFS)."""
@@ -203,7 +205,14 @@ class _Converter:
203
205
  else:
204
206
  self.req.graph_search.query.path.bool_and.operands.extend(subqueries)
205
207
 
206
- def _apply_filters(self):
208
+ def _apply_graph_query(self) -> None:
209
+ if self.retrieval.query.graph is None:
210
+ return
211
+
212
+ q = parse_path_query(self.retrieval.query.graph.query)
213
+ self.req.graph_search.query.path.CopyFrom(q)
214
+
215
+ def _apply_filters(self) -> None:
207
216
  self.req.with_duplicates = self.retrieval.filters.with_duplicates
208
217
 
209
218
  self.req.faceted.labels.extend(
@@ -239,7 +248,7 @@ class _Converter:
239
248
 
240
249
  add_and_expression(self.req.field_filter, expr)
241
250
 
242
- def _apply_top_k(self):
251
+ def _apply_top_k(self) -> None:
243
252
  """Adjust requested page size depending on rank fusion and reranking
244
253
  algorithms.
245
254
 
@@ -19,7 +19,6 @@
19
19
  #
20
20
  import logging
21
21
  from abc import ABC, abstractmethod
22
- from typing import Iterable
23
22
 
24
23
  from nucliadb.common.external_index_providers.base import TextBlockMatch
25
24
  from nucliadb.common.ids import ParagraphId
@@ -62,50 +61,40 @@ class RankFusionAlgorithm(ABC):
62
61
  return self._window
63
62
 
64
63
  def fuse(
65
- self, keyword: Iterable[TextBlockMatch], semantic: Iterable[TextBlockMatch]
64
+ self,
65
+ keyword: list[TextBlockMatch],
66
+ semantic: list[TextBlockMatch],
67
+ graph: list[TextBlockMatch],
66
68
  ) -> list[TextBlockMatch]:
67
69
  """Fuse keyword and semantic results and return a list with the merged
68
70
  results.
69
71
 
70
- """
71
- merged = self._fuse(keyword, semantic)
72
- return merged
73
-
74
- @abstractmethod
75
- def _fuse(
76
- self, keyword: Iterable[TextBlockMatch], semantic: Iterable[TextBlockMatch]
77
- ) -> list[TextBlockMatch]: ...
78
-
79
-
80
- class LegacyRankFusion(RankFusionAlgorithm):
81
- """Legacy algorithm that given results from keyword and semantic search,
82
- mixes them in the following way:
83
- - 1st result from keyword search
84
- - 2nd result from semantic search
85
- - 2 keyword results and 1 semantic (and repeat)
86
-
87
- """
88
-
89
- @rank_fusion_observer.wrap({"type": "legacy"})
90
- def _fuse(
91
- self, keyword: Iterable[TextBlockMatch], semantic: Iterable[TextBlockMatch]
92
- ) -> list[TextBlockMatch]:
93
- merged: list[TextBlockMatch] = []
72
+ If only one retriever is provided, rank fusion will be skipped.
94
73
 
74
+ """
95
75
  # sort results by it's score before merging them
96
76
  keyword = [k for k in sorted(keyword, key=lambda r: r.score, reverse=True)]
97
77
  semantic = [s for s in sorted(semantic, key=lambda r: r.score, reverse=True)]
78
+ graph = [g for g in graph]
98
79
 
99
- for k in keyword:
100
- merged.append(k)
101
-
102
- nextpos = 1
103
- for s in semantic:
104
- merged.insert(nextpos, s)
105
- nextpos += 3
106
-
80
+ retrievals_with_results = [x for x in (keyword, semantic, graph) if len(x) > 0]
81
+ if len(retrievals_with_results) == 1:
82
+ return retrievals_with_results[0]
83
+ else:
84
+ merged = self._fuse(keyword, semantic, graph)
107
85
  return merged
108
86
 
87
+ @abstractmethod
88
+ def _fuse(
89
+ self,
90
+ keyword: list[TextBlockMatch],
91
+ semantic: list[TextBlockMatch],
92
+ graph: list[TextBlockMatch],
93
+ ) -> list[TextBlockMatch]:
94
+ """Rank fusion implementation. All arguments are assumed to be ordered
95
+ by decreasing score."""
96
+ ...
97
+
109
98
 
110
99
  class ReciprocalRankFusion(RankFusionAlgorithm):
111
100
  """Rank-based rank fusion algorithm. Discounts the weight of documents
@@ -132,6 +121,7 @@ class ReciprocalRankFusion(RankFusionAlgorithm):
132
121
  window: int,
133
122
  keyword_weight: float = 1.0,
134
123
  semantic_weight: float = 1.0,
124
+ graph_weight: float = 1.0,
135
125
  ):
136
126
  super().__init__(window)
137
127
  # Constant used in RRF, studies agree on 60 as a good default value
@@ -141,21 +131,22 @@ class ReciprocalRankFusion(RankFusionAlgorithm):
141
131
  self._k = k
142
132
  self._keyword_boost = keyword_weight
143
133
  self._semantic_boost = semantic_weight
134
+ self._graph_boost = graph_weight
144
135
 
145
136
  @rank_fusion_observer.wrap({"type": "reciprocal_rank_fusion"})
146
137
  def _fuse(
147
- self, keyword: Iterable[TextBlockMatch], semantic: Iterable[TextBlockMatch]
138
+ self,
139
+ keyword: list[TextBlockMatch],
140
+ semantic: list[TextBlockMatch],
141
+ graph: list[TextBlockMatch],
148
142
  ) -> list[TextBlockMatch]:
149
143
  scores: dict[ParagraphId, tuple[float, SCORE_TYPE]] = {}
150
144
  match_positions: dict[ParagraphId, list[tuple[int, int]]] = {}
151
145
 
152
- # sort results by it's score before merging them
153
- keyword = [k for k in sorted(keyword, key=lambda r: r.score, reverse=True)]
154
- semantic = [s for s in sorted(semantic, key=lambda r: r.score, reverse=True)]
155
-
156
146
  rankings = [
157
147
  (keyword, self._keyword_boost),
158
148
  (semantic, self._semantic_boost),
149
+ (graph, self._graph_boost),
159
150
  ]
160
151
  for r, (ranking, boost) in enumerate(rankings):
161
152
  for i, result in enumerate(ranking):
@@ -195,6 +186,7 @@ def get_rank_fusion(rank_fusion: parser_models.RankFusion) -> RankFusionAlgorith
195
186
  window=window,
196
187
  keyword_weight=rank_fusion.boosting.keyword,
197
188
  semantic_weight=rank_fusion.boosting.semantic,
189
+ graph_weight=rank_fusion.boosting.graph,
198
190
  )
199
191
 
200
192
  else:
@@ -159,6 +159,7 @@ def parse_basic_modify(bm: BrokerMessage, item: ComingResourcePayload, toprocess
159
159
  source=relation_node_from,
160
160
  to=relation_node_to,
161
161
  relation_label=relation.label or "",
162
+ # XXX: we are not propagating metadata, is this intended?
162
163
  )
163
164
  )
164
165
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nucliadb
3
- Version: 6.4.0.post4158
3
+ Version: 6.4.0.post4161
4
4
  Summary: NucliaDB
5
5
  Author-email: Nuclia <nucliadb@nuclia.com>
6
6
  License: AGPL
@@ -20,11 +20,11 @@ Classifier: Programming Language :: Python :: 3.12
20
20
  Classifier: Programming Language :: Python :: 3 :: Only
21
21
  Requires-Python: <4,>=3.9
22
22
  Description-Content-Type: text/markdown
23
- Requires-Dist: nucliadb-telemetry[all]>=6.4.0.post4158
24
- Requires-Dist: nucliadb-utils[cache,fastapi,storages]>=6.4.0.post4158
25
- Requires-Dist: nucliadb-protos>=6.4.0.post4158
26
- Requires-Dist: nucliadb-models>=6.4.0.post4158
27
- Requires-Dist: nidx-protos>=6.4.0.post4158
23
+ Requires-Dist: nucliadb-telemetry[all]>=6.4.0.post4161
24
+ Requires-Dist: nucliadb-utils[cache,fastapi,storages]>=6.4.0.post4161
25
+ Requires-Dist: nucliadb-protos>=6.4.0.post4161
26
+ Requires-Dist: nucliadb-models>=6.4.0.post4161
27
+ Requires-Dist: nidx-protos>=6.4.0.post4161
28
28
  Requires-Dist: nucliadb-admin-assets>=1.0.0.post1224
29
29
  Requires-Dist: nuclia-models>=0.24.2
30
30
  Requires-Dist: uvicorn[standard]
@@ -234,7 +234,7 @@ nucliadb/search/search/exceptions.py,sha256=klGLgAGGrXcSGix_W6418ZBMqDchAIGjN77o
234
234
  nucliadb/search/search/fetch.py,sha256=eiljOKim-4OOEZn-3fyVZSYxztCH156BXYdqlIwVdN4,6181
235
235
  nucliadb/search/search/filters.py,sha256=1MkHlJjAQqoRCj7e5cEzK2HvBxGLE17I_omsjiklbtw,6476
236
236
  nucliadb/search/search/find.py,sha256=WTc_0HdbaU0Mwkmlf9s4pCmTuU0hz1jetBjIpNLXEEM,7982
237
- nucliadb/search/search/find_merge.py,sha256=VQ1NNuFNPxDOsKB5RZPk72cNuBPZuDIoIeQx9z4e-5k,18410
237
+ nucliadb/search/search/find_merge.py,sha256=2NtVZlR61MnTZl7mkzqcpIOPUU8hGWPrrP7ATeubt7w,19677
238
238
  nucliadb/search/search/graph_merge.py,sha256=y5V7X-BhjHsKDXE69tzQLIIKGm4XuaFrZXw0odcHVNM,3402
239
239
  nucliadb/search/search/graph_strategy.py,sha256=JsV-i9PGhekCAzmGpqeueQIitJb7fWCihIwUf76Q3pU,32912
240
240
  nucliadb/search/search/hydrator.py,sha256=-R37gCrGxkyaiHQalnTWHNG_FCx11Zucd7qA1vQCxuw,6985
@@ -245,7 +245,7 @@ nucliadb/search/search/paragraphs.py,sha256=pNAEiYqJGGUVcEf7xf-PFMVqz0PX4Qb-WNG-
245
245
  nucliadb/search/search/pgcatalog.py,sha256=s_J98fsX_RuFXwpejpkGqG-tD9ELuzz4YQ6U3ew5h2g,9313
246
246
  nucliadb/search/search/predict_proxy.py,sha256=IFI3v_ODz2_UU1XZnyaD391fE7-2C0npSmj_HmDvzS4,3123
247
247
  nucliadb/search/search/query.py,sha256=-gvKsyGmKYpsoEVzKkq3HJUMcs_3LD3TYUueOcJsTec,11511
248
- nucliadb/search/search/rank_fusion.py,sha256=tRGo_KlsFsVx1CQEy1iqQ6f0T1Dq1kf0axDXHuuzvvM,6946
248
+ nucliadb/search/search/rank_fusion.py,sha256=8Bq3AHfHgytp7UIhJQgbnXrchrjlCQbgf8PhLQkWBPY,6718
249
249
  nucliadb/search/search/rerankers.py,sha256=PvhExUb8zZYghiFHRgGotw6h6bU--Rft09wE8arvtAw,7424
250
250
  nucliadb/search/search/shards.py,sha256=mc5DK-MoCv9AFhlXlOFHbPvetcyNDzTFOJ5rimK8PC8,2636
251
251
  nucliadb/search/search/summarize.py,sha256=ksmYPubEQvAQgfPdZHfzB_rR19B2ci4IYZ6jLdHxZo8,4996
@@ -260,16 +260,16 @@ nucliadb/search/search/query_parser/__init__.py,sha256=cp15ZcFnHvpcu_5-aK2A4uUyv
260
260
  nucliadb/search/search/query_parser/exceptions.py,sha256=szAOXUZ27oNY-OSa9t2hQ5HHkQQC0EX1FZz_LluJHJE,1224
261
261
  nucliadb/search/search/query_parser/fetcher.py,sha256=SkvBRDfSKmuz-QygNKLAU4AhZhhDo1dnOZmt1zA28RA,16851
262
262
  nucliadb/search/search/query_parser/filter_expression.py,sha256=fZI8qFRF3h2sa01gwPmDlA5c16mq7ShMOBk-rDaA_fE,6575
263
- nucliadb/search/search/query_parser/models.py,sha256=3GzV8XjsRgH28UEyqQTM-05kDUoziwGkALnpMJHF_gc,4759
263
+ nucliadb/search/search/query_parser/models.py,sha256=k9cCjTpndP9ynr8A9J8MBmDYmjLBKL1UM4L0GXVuJw0,5031
264
264
  nucliadb/search/search/query_parser/old_filters.py,sha256=0NKjRdzAn2bH6veG0M-xM9BNKEYwa4U6WXtZzJAWRvo,9068
265
265
  nucliadb/search/search/query_parser/parsers/__init__.py,sha256=ySCNSdbesLXGZyR88919njulA6UE10_3PhqMG_Yj1o4,1034
266
266
  nucliadb/search/search/query_parser/parsers/ask.py,sha256=eTz8wS-EJHuAagR384h6TT64itymFZRpfZJGX8r6aZM,2771
267
267
  nucliadb/search/search/query_parser/parsers/catalog.py,sha256=XdBiTweGTQkj8m_V_i2xbwp7P5pPO8K1Tud692XKhMw,7149
268
268
  nucliadb/search/search/query_parser/parsers/common.py,sha256=o3028wUnK78lOmFK0jtmpvx2Y1Jh_atBYBoO5VD-qJ4,6359
269
- nucliadb/search/search/query_parser/parsers/find.py,sha256=oM-imPfuXesuh8lgdnjBqpvgyTcW2ieUIbq4ZCnCwEc,12035
270
- nucliadb/search/search/query_parser/parsers/graph.py,sha256=8Smpd2ZE7ZMyTnUh2_zasN8GAA828do1YNblUDCGl1w,9410
269
+ nucliadb/search/search/query_parser/parsers/find.py,sha256=Fo4lXOnCbP0AKEc1mKLNINJBv63B4DPlix0vlhyesck,12717
270
+ nucliadb/search/search/query_parser/parsers/graph.py,sha256=lDRJO_JvOe7yytNgXZyMogyPMgB5xc8obNY2kqz3yGU,9405
271
271
  nucliadb/search/search/query_parser/parsers/search.py,sha256=yEebeMOXJza7HMK3TdIPO6UGQbe79maSDg-GgohQIMk,10517
272
- nucliadb/search/search/query_parser/parsers/unit_retrieval.py,sha256=OJ8jXMzwQJGXwC1c5k8ty6Uwtq1iBTLzhxWYNKfMSbM,10949
272
+ nucliadb/search/search/query_parser/parsers/unit_retrieval.py,sha256=bcSvF2mW6IHFAs7_yA6TePw0zVtk9CmEA3j6xkhkDO8,11328
273
273
  nucliadb/standalone/__init__.py,sha256=cp15ZcFnHvpcu_5-aK2A4uUyvuZVV_MJn4bIXMa20ks,835
274
274
  nucliadb/standalone/api_router.py,sha256=hgq9FXpihzgjHkwcVGfGCSwyXy67fqXTfLFHuINzIi0,5567
275
275
  nucliadb/standalone/app.py,sha256=mAApNK_iVsQgJyd-mtwCeZq5csSimwnXmlQGH9a70pE,5586
@@ -353,7 +353,7 @@ nucliadb/writer/api/v1/upload.py,sha256=fwWXA5BuLPuGKhOcuyf0CdutWJITjJ6fAvDzV_X9
353
353
  nucliadb/writer/api/v1/vectorsets.py,sha256=F3iMViL5G95_Tns4aO2SOA0DwAzxK2_P8MXxtd_XLRE,6973
354
354
  nucliadb/writer/resource/__init__.py,sha256=cp15ZcFnHvpcu_5-aK2A4uUyvuZVV_MJn4bIXMa20ks,835
355
355
  nucliadb/writer/resource/audit.py,sha256=FvxMZPzrNHtd31HgpZEvxzwAkbxJTZRhPLqRYYJi3tA,1426
356
- nucliadb/writer/resource/basic.py,sha256=fjxZEsC_ftuRrpPDOQqSDfZR6JlVNSFPMckVGmjQ4lY,10426
356
+ nucliadb/writer/resource/basic.py,sha256=44GK8M9EEVoAUfGiabdLrrpENqeFwNn7qwxF2AHhQGg,10504
357
357
  nucliadb/writer/resource/field.py,sha256=MhDbcOEw6KbOGBAnBFAKA_yxL2WrC7Ky2JrjB3iWf9c,20384
358
358
  nucliadb/writer/resource/origin.py,sha256=pvhUDdU0mlWPUcpoQi4LDUJaRtfjzVVrA8XcGVI_N8k,2021
359
359
  nucliadb/writer/tus/__init__.py,sha256=huWpKnDnjsrKlBBJk30ta5vamlA-4x0TbPs_2Up8hyM,5443
@@ -365,8 +365,8 @@ nucliadb/writer/tus/local.py,sha256=7jYa_w9b-N90jWgN2sQKkNcomqn6JMVBOVeDOVYJHto,
365
365
  nucliadb/writer/tus/s3.py,sha256=vF0NkFTXiXhXq3bCVXXVV-ED38ECVoUeeYViP8uMqcU,8357
366
366
  nucliadb/writer/tus/storage.py,sha256=ToqwjoYnjI4oIcwzkhha_MPxi-k4Jk3Lt55zRwaC1SM,2903
367
367
  nucliadb/writer/tus/utils.py,sha256=MSdVbRsRSZVdkaum69_0wku7X3p5wlZf4nr6E0GMKbw,2556
368
- nucliadb-6.4.0.post4158.dist-info/METADATA,sha256=RuDhshGQWG6ym98q8-VkDcD3Ku30eSpoBiUwd-Pw65U,4226
369
- nucliadb-6.4.0.post4158.dist-info/WHEEL,sha256=ck4Vq1_RXyvS4Jt6SI0Vz6fyVs4GWg7AINwpsaGEgPE,91
370
- nucliadb-6.4.0.post4158.dist-info/entry_points.txt,sha256=XqGfgFDuY3zXQc8ewXM2TRVjTModIq851zOsgrmaXx4,1268
371
- nucliadb-6.4.0.post4158.dist-info/top_level.txt,sha256=hwYhTVnX7jkQ9gJCkVrbqEG1M4lT2F_iPQND1fCzF80,20
372
- nucliadb-6.4.0.post4158.dist-info/RECORD,,
368
+ nucliadb-6.4.0.post4161.dist-info/METADATA,sha256=xZYY6m0tHa_k-3X9XuzMbfSy9oofa64mPUaTaCpq9GM,4226
369
+ nucliadb-6.4.0.post4161.dist-info/WHEEL,sha256=ck4Vq1_RXyvS4Jt6SI0Vz6fyVs4GWg7AINwpsaGEgPE,91
370
+ nucliadb-6.4.0.post4161.dist-info/entry_points.txt,sha256=XqGfgFDuY3zXQc8ewXM2TRVjTModIq851zOsgrmaXx4,1268
371
+ nucliadb-6.4.0.post4161.dist-info/top_level.txt,sha256=hwYhTVnX7jkQ9gJCkVrbqEG1M4lT2F_iPQND1fCzF80,20
372
+ nucliadb-6.4.0.post4161.dist-info/RECORD,,