nidx-binding 6.3.4.post137__tar.gz → 6.3.4.post146__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/PKG-INFO +1 -1
  2. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/src/reader.rs +1 -1
  3. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/src/search_query.rs +1 -1
  4. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/src/search_response.rs +3 -3
  5. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_protos/pyproject.toml +1 -1
  6. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_relation/src/graph_collector.rs +191 -41
  7. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_relation/src/reader.rs +98 -38
  8. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_relation/src/resource_indexer.rs +16 -4
  9. nidx_binding-6.3.4.post146/nidx_relation/src/schema.rs +538 -0
  10. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_relation/tests/test_graph_query_parser_search.rs +1 -1
  11. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_text/tests/test_streaming.rs +0 -1
  12. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/src/data_point/disk_hnsw.rs +1 -1
  13. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/src/data_point/mod.rs +1 -1
  14. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/src/data_point/ops_hnsw.rs +1 -1
  15. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/src/data_point_provider/reader.rs +2 -2
  16. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/src/inverted_index/fst_index.rs +1 -1
  17. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/pyproject.toml +1 -1
  18. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/api/grpc.rs +1 -3
  19. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/searcher/shard_selector.rs +1 -1
  20. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/searcher/sync.rs +1 -1
  21. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/telemetry/log_format.rs +2 -2
  22. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/telemetry/middleware.rs +2 -2
  23. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/telemetry.rs +1 -1
  24. nidx_binding-6.3.4.post137/nidx_relation/src/schema.rs +0 -260
  25. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-0cfce9b29547f8f5bafa6e440f86103be7b8c4ad2fd92db9ac223f4efbe23d10.json +0 -0
  26. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-1a561eed00f3dbe868bf5030059793300209179dc8fb73e4b57a54b5e81262fe.json +0 -0
  27. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-1d3fca2682e25a01143da92285297f134a6a105a96f64d87e0db3abb219855e4.json +0 -0
  28. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-249b3b57c27a71baa823f1fe0f0bba9c9af36f61c28f731e58beea60ec48e687.json +0 -0
  29. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-24cb6b683daa42d7125f862e25943ab4be7bf275cd8739f8da4859d701795e1a.json +0 -0
  30. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-263c8fce6db5b03bbd012fafdba6943cbee6ed7eb8976cdef4f5b01dde7ca6fd.json +0 -0
  31. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-2a5d92fb1638df830a4477a7cdf24e6db6b43034b7bbe74fdfb63e8afe2c4071.json +0 -0
  32. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-2b065a363f58caed60e3706603c1260dbf5a4c795604a5b68edda22eb07fec1b.json +0 -0
  33. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-3fc3cb39934683de8cd475ce1368c8373453eb1e01f81587d66b9d14b109ce6e.json +0 -0
  34. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-48f33b77b7c1633467b0b2efcaa1d3c207e7757e4f1d83b40d15e6ca365f7771.json +0 -0
  35. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-4ae09f2c08e2f324bee01bb8487a8f37678a1c5e9d327339235c50d4921a8949.json +0 -0
  36. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-4d7a76fa413c9ef0ce2a47ac7bb7e01d3e6a2aabded9487d21010a53efee8852.json +0 -0
  37. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-4fcbdd6657c7dc9b60b3a563dd41711b3dbcf72ce063427b7a01f8cddf34c244.json +0 -0
  38. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-577109ac00ccfbd38ecaccab94116f2f46a4caf5612afa372cded197123c1e08.json +0 -0
  39. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-5db25f97d8578d6d78f2f6bd4b72cc82a9b1b82805c6422d967ac63b20d99db4.json +0 -0
  40. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-5ec3233a3a23e926055056d46bdde17836a633066dbb5f349502648cd3ea9a60.json +0 -0
  41. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-66edb6ea424d8681927dcddb6bac5f1239175f4775d1f40417ba15054b0c6f19.json +0 -0
  42. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-6f9c6d201c1b5712efb68c363bffd3e0169c11f2a8f925e8cd4e8808599ff7b4.json +0 -0
  43. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-733c3ebacc86f444bf5e2dd79ade660c291e88a00fc09b722f6e2e191545874c.json +0 -0
  44. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-77a245aed9f6f8b9fc643efbd4b1e2e8e99bbba085e3e75a4f29321cd7b2a25c.json +0 -0
  45. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-7a3bf27c330c468a596e8a297cf7d8b192e31e67ecc5177c1267f579e8e247c7.json +0 -0
  46. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-7a7e59e47b30b12237511fd3d7da2d17b0471ad2b006af48d6a6f587c779692b.json +0 -0
  47. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-7dcbb33312cc9f11ae3a6d73b1ace017a9f19a8bf8f10304fc57977c8efeadff.json +0 -0
  48. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-7efa7c0d747afc4b6aed0586ff846c27839c3213ff7ee9f30c89b0d0f17e60e3.json +0 -0
  49. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-8493140d788604d498a4e48da4158708572ccc9d60185290a00d549cc84533db.json +0 -0
  50. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-8493bb0059b013eaca42fd10cd7d04f0d06a8acaed379eff0d23f3229edde9ee.json +0 -0
  51. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-87996b3d6c7a2195438d7038015b06949102bce8c7b8cd8db1f83aaf23cbe489.json +0 -0
  52. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-8f096d8171b89f9615d18f95d696dc9e4fb3674e103161a713cdc806f7a68506.json +0 -0
  53. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-917732a56ee04bf3a6e127319dda8225210869c82f9828d878162394dba4e078.json +0 -0
  54. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-95fe4ef93ee90733db1b67ed7987f80b5aac792f1590b979c68b418d1599eb98.json +0 -0
  55. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-9b67658569b343d8b4b61ae0a7dc721f367f2ba33c7b69b9e68bfd5c9bff5206.json +0 -0
  56. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-9c8062ea55d070afef68309e58fa987eb37fda44e1efbf68c8ba2af7846cc968.json +0 -0
  57. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-a06e1d9f6f95e4c4c2b98310ebddcc9d963cc033582bf2e945e8bf3a301b4247.json +0 -0
  58. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-a55265c9b07bd1399961a6f1e757201fd0eebe868ddaf96437111113d80fce92.json +0 -0
  59. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-a891a37be5c2d7cce775c2dd33726b0318fd3839beab222a1b22bc6174604207.json +0 -0
  60. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-a945191bb4b3e37d6823ed3ad499339d007d69983105de8567777d9daf517b28.json +0 -0
  61. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-abe9f7832f2bd799ac44008da031e8d8ab52d4f5fbfc2a7e3974e8873bae55b2.json +0 -0
  62. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-aca588cca57a85e4d7fcc40c23cd87e57d53d11ca550d78e7e3d5e39e524fcd3.json +0 -0
  63. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-b02f8aafc00a7724510772ac41269e368c5bccf03ef7b4590e0ef6fd1a1bf64f.json +0 -0
  64. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-b742e17cabe2d64617e9aa64bafc782172f7a4f8023d1b54f952a0fb39f6b2b8.json +0 -0
  65. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-b94e349dbc0daec57f8f8f6e9e2dffb06100b1bb2b41d297c9f3b191da37a83d.json +0 -0
  66. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-bd9afa22994aba671dbf7b5f89b53c2ee02f53c0442a81265786a6d52d08512f.json +0 -0
  67. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-be60554eca98a5899efc6b49785cecd6444a6d39afed9e4a884ce2dbf162012c.json +0 -0
  68. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-bf49702b506c9a1650ece1f8e8d9f14834a902f8caefafe30ded55e2790f2188.json +0 -0
  69. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-bfb8ae2e860e451b0868a7b1b50a451d998b2105f9fdfd307b26a1775d145e9f.json +0 -0
  70. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-bfcd21ed704cd305db5c17fcdec7d92aa4ac501913c9c9514d8ff92928c0c7e7.json +0 -0
  71. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-c3ab694650f49a75b146fb877a92e48c4f20f0d99f70f8ec859fbb763b01a1e5.json +0 -0
  72. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-c55542bb9fae544d87fae6f30e0fe8a9088d12075f4442ab4fe2fcd05e472234.json +0 -0
  73. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-cb29a6556d35ac630ee0aa885dd7341cf9573bd3efd216ff8a887b87686b03db.json +0 -0
  74. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-d0a1f341a89f5f14696b10baa72db9d95551c2b7e5fc67308fd52dc03dd98a92.json +0 -0
  75. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-d2ad0a0ca2649c9e4873cfcc1fc66d2d07cc45d0f65c560b06d7b5f592f4fa8a.json +0 -0
  76. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-d6cfe78eb635ba0b89ca4021a4dc8182d18ab5b197f30149cd28488eba4c1df5.json +0 -0
  77. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-d729b56dea00e49dcdba8cf0001e2811da27351eabe98212db3b589f18fc6f32.json +0 -0
  78. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-d9658bfd4e7170b41d03f2ddf2446d0bf54171c0d39d53bf20af2b8437f2ec48.json +0 -0
  79. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-dbba7b3d3289425bae711aedbf73fbc3699f857f86f84d95c3b556d05c5658b0.json +0 -0
  80. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-dcb96b649d6d63a58efd5d445453a4f3d7869a56ff714b69bedf3d616a0473ca.json +0 -0
  81. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-ebd876fbf5362a5900e75bc05f2f11c73c406ef7da4e95097fc6a1c3d1b8bc54.json +0 -0
  82. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-eef5cc6bce1cc14eba8f3e68971724ef181e88cffcedd74673615f2026b89a62.json +0 -0
  83. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/.sqlx/query-ef56d5fefc5774040d1ee397beadb475f6af02768c22f0e583c74062e2e821ce.json +0 -0
  84. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/Cargo.lock +0 -0
  85. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/Cargo.toml +0 -0
  86. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/README.md +0 -0
  87. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/migrations/20241007163501_initial.sql +0 -0
  88. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/migrations/20241211120039_merge_job_priority.sql +0 -0
  89. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/migrations/20241211121159_basic_indexes.sql +0 -0
  90. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/migrations/20241212151105_check_segment_records.sql +0 -0
  91. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/migrations/20250110145554_in_flight_messages.sql +0 -0
  92. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_binding/Cargo.toml +0 -0
  93. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_binding/src/lib.rs +0 -0
  94. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/Cargo.toml +0 -0
  95. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/src/fuzzy_query.rs +0 -0
  96. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/src/lib.rs +0 -0
  97. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/src/query_io.rs +0 -0
  98. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/src/request_types.rs +0 -0
  99. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/src/resource_indexer.rs +0 -0
  100. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/src/schema.rs +0 -0
  101. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/src/set_query.rs +0 -0
  102. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/src/stop_words.rs +0 -0
  103. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/README.md +0 -0
  104. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/ar.json +0 -0
  105. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/az.json +0 -0
  106. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/bn.json +0 -0
  107. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/ca.json +0 -0
  108. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/ch.json +0 -0
  109. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/da.json +0 -0
  110. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/de.json +0 -0
  111. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/el.json +0 -0
  112. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/en.json +0 -0
  113. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/es.json +0 -0
  114. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/eu.json +0 -0
  115. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/extract.py +0 -0
  116. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/fi.json +0 -0
  117. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/fr.json +0 -0
  118. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/he.json +0 -0
  119. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/hu.json +0 -0
  120. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/id.json +0 -0
  121. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/it.json +0 -0
  122. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/kk.json +0 -0
  123. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/ne.json +0 -0
  124. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/nl.json +0 -0
  125. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/no.json +0 -0
  126. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/pt.json +0 -0
  127. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/ro.json +0 -0
  128. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/ru.json +0 -0
  129. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/sl.json +0 -0
  130. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/sv.json +0 -0
  131. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/tg.json +0 -0
  132. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/stop_words/tr.json +0 -0
  133. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/tests/common/mod.rs +0 -0
  134. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_paragraph/tests/reader.rs +0 -0
  135. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_protos/Cargo.toml +0 -0
  136. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_protos/build.py +0 -0
  137. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_protos/build.rs +0 -0
  138. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_protos/src/lib.rs +0 -0
  139. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_protos/src/nidx.proto +0 -0
  140. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_relation/Cargo.toml +0 -0
  141. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_relation/src/graph_query_parser.rs +0 -0
  142. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_relation/src/io_maps.rs +0 -0
  143. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_relation/src/lib.rs +0 -0
  144. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_relation/tests/common/mod.rs +0 -0
  145. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_relation/tests/test_graph_search.rs +0 -0
  146. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_relation/tests/test_reader.rs +0 -0
  147. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_relation/tests/test_writer.rs +0 -0
  148. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_tantivy/Cargo.toml +0 -0
  149. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_tantivy/src/index_reader.rs +0 -0
  150. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_tantivy/src/lib.rs +0 -0
  151. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_tests/Cargo.toml +0 -0
  152. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_tests/src/graph.rs +0 -0
  153. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_tests/src/lib.rs +0 -0
  154. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_text/Cargo.toml +0 -0
  155. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_text/src/lib.rs +0 -0
  156. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_text/src/prefilter.rs +0 -0
  157. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_text/src/query_io.rs +0 -0
  158. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_text/src/reader.rs +0 -0
  159. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_text/src/request_types.rs +0 -0
  160. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_text/src/resource_indexer.rs +0 -0
  161. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_text/src/schema.rs +0 -0
  162. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_text/src/search_query.rs +0 -0
  163. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_text/tests/common/mod.rs +0 -0
  164. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_text/tests/test_flow.rs +0 -0
  165. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_text/tests/test_search.rs +0 -0
  166. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_types/Cargo.toml +0 -0
  167. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_types/src/lib.rs +0 -0
  168. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_types/src/prefilter.rs +0 -0
  169. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_types/src/query_language.rs +0 -0
  170. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/Cargo.toml +0 -0
  171. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/src/config.rs +0 -0
  172. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/src/data_point/node.rs +0 -0
  173. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/src/data_point/params.rs +0 -0
  174. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/src/data_point/ram_hnsw.rs +0 -0
  175. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/src/data_point/tests.rs +0 -0
  176. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/src/data_point_provider/mod.rs +0 -0
  177. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/src/data_types/data_store.rs +0 -0
  178. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/src/data_types/mod.rs +0 -0
  179. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/src/data_types/trie.rs +0 -0
  180. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/src/data_types/trie_ram.rs +0 -0
  181. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/src/formula/mod.rs +0 -0
  182. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/src/indexer.rs +0 -0
  183. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/src/inverted_index/map.rs +0 -0
  184. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/src/inverted_index.rs +0 -0
  185. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/src/lib.rs +0 -0
  186. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/src/query_io.rs +0 -0
  187. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/src/request_types.rs +0 -0
  188. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/src/utils.rs +0 -0
  189. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/src/vector_types/dense_f32.rs +0 -0
  190. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/src/vector_types/mod.rs +0 -0
  191. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/tests/common/mod.rs +0 -0
  192. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/tests/test_basic_search.rs +0 -0
  193. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/nidx_vector/tests/test_hidden.rs +0 -0
  194. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/api/shards.rs +0 -0
  195. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/api.rs +0 -0
  196. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/control.rs +0 -0
  197. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/errors.rs +0 -0
  198. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/grpc_server.rs +0 -0
  199. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/import_export.rs +0 -0
  200. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/indexer.rs +0 -0
  201. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/lib.rs +0 -0
  202. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/main.rs +0 -0
  203. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/metadata/deletion.rs +0 -0
  204. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/metadata/index.rs +0 -0
  205. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/metadata/index_request.rs +0 -0
  206. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/metadata/merge_job.rs +0 -0
  207. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/metadata/segment.rs +0 -0
  208. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/metadata/shard.rs +0 -0
  209. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/metadata.rs +0 -0
  210. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/metrics.rs +0 -0
  211. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/scheduler/audit_task.rs +0 -0
  212. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/scheduler/log_merge.rs +0 -0
  213. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/scheduler/merge_task.rs +0 -0
  214. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/scheduler/metrics_task.rs +0 -0
  215. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/scheduler/purge_tasks.rs +0 -0
  216. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/scheduler/vector_merge.rs +0 -0
  217. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/scheduler.rs +0 -0
  218. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/searcher/grpc.rs +0 -0
  219. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/searcher/index_cache.rs +0 -0
  220. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/searcher/query_language.rs +0 -0
  221. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/searcher/query_planner.rs +0 -0
  222. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/searcher/shard_search.rs +0 -0
  223. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/searcher/shard_suggest.rs +0 -0
  224. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/searcher/streams.rs +0 -0
  225. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/searcher.rs +0 -0
  226. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/segment_store.rs +0 -0
  227. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/settings.rs +0 -0
  228. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/telemetry/duration_layer.rs +0 -0
  229. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/tool.rs +0 -0
  230. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/src/worker.rs +0 -0
  231. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/tests/common/mod.rs +0 -0
  232. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/tests/common/services.rs +0 -0
  233. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/tests/test_date_range_search.rs +0 -0
  234. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/tests/test_search_filtering.rs +0 -0
  235. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/tests/test_search_relations.rs +0 -0
  236. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/tests/test_search_sorting.rs +0 -0
  237. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/tests/test_searcher_cluster.rs +0 -0
  238. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/tests/test_security_search.rs +0 -0
  239. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/tests/test_shards.rs +0 -0
  240. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/tests/test_shards_api.rs +0 -0
  241. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/tests/test_suggest.rs +0 -0
  242. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/tests/test_synced_searcher.rs +0 -0
  243. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/tests/test_vector_normalization.rs +0 -0
  244. {nidx_binding-6.3.4.post137 → nidx_binding-6.3.4.post146}/tests/test_vectorsets.rs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nidx_binding
3
- Version: 6.3.4.post137
3
+ Version: 6.3.4.post146
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -282,7 +282,7 @@ struct Searcher<'a> {
282
282
  text: &'a str,
283
283
  only_faceted: bool,
284
284
  }
285
- impl<'a> Searcher<'a> {
285
+ impl Searcher<'_> {
286
286
  fn custom_order_collector(
287
287
  &self,
288
288
  order: OrderBy,
@@ -109,7 +109,7 @@ fn queryp_map(queries: Vec<QueryP>, distance: u8, as_prefix: Option<usize>, term
109
109
  .enumerate()
110
110
  .map(|(id, (_, query))| {
111
111
  let query = if query.is::<TermQuery>() {
112
- term_to_fuzzy(query, distance, termc.clone(), as_prefix.map_or(false, |v| id == v))
112
+ term_to_fuzzy(query, distance, termc.clone(), as_prefix == Some(id))
113
113
  } else {
114
114
  query
115
115
  };
@@ -97,7 +97,7 @@ pub struct SearchFacetsResponse<'a> {
97
97
  pub facets: Vec<String>,
98
98
  }
99
99
 
100
- impl<'a> From<SearchFacetsResponse<'a>> for ParagraphSearchResponse {
100
+ impl From<SearchFacetsResponse<'_>> for ParagraphSearchResponse {
101
101
  fn from(response: SearchFacetsResponse) -> Self {
102
102
  let facets = response
103
103
  .facets_count
@@ -112,7 +112,7 @@ impl<'a> From<SearchFacetsResponse<'a>> for ParagraphSearchResponse {
112
112
  }
113
113
  }
114
114
 
115
- impl<'a> From<SearchIntResponse<'a>> for ParagraphSearchResponse {
115
+ impl From<SearchIntResponse<'_>> for ParagraphSearchResponse {
116
116
  fn from(response: SearchIntResponse) -> Self {
117
117
  let total = response.total as i32;
118
118
  let obtained = response.top_docs.len();
@@ -210,7 +210,7 @@ impl<'a> From<SearchIntResponse<'a>> for ParagraphSearchResponse {
210
210
  }
211
211
  }
212
212
 
213
- impl<'a> From<SearchBm25Response<'a>> for ParagraphSearchResponse {
213
+ impl From<SearchBm25Response<'_>> for ParagraphSearchResponse {
214
214
  fn from(response: SearchBm25Response) -> Self {
215
215
  let total = response.total as i32;
216
216
  let obtained = response.top_docs.len();
@@ -4,7 +4,7 @@ build-backend = "pdm.backend"
4
4
 
5
5
  [project]
6
6
  name = "nidx_protos"
7
- version = "6.3.4.post137"
7
+ version = "6.3.4.post146"
8
8
  license = { text = "AGPL" }
9
9
  description = "Protobuf definitions for nucliadb/nidx"
10
10
  authors = [ { name = "Nuclia", email = "nucliadb@nuclia.com" }]
@@ -23,6 +23,7 @@ use std::collections::{HashMap, HashSet};
23
23
  use tantivy::{
24
24
  DocId, Score, SegmentOrdinal, SegmentReader, TantivyDocument,
25
25
  collector::{Collector, SegmentCollector},
26
+ columnar::Column,
26
27
  store::StoreReader,
27
28
  };
28
29
  use tracing::warn;
@@ -41,23 +42,42 @@ pub enum NodeSelector {
41
42
  DestinationNodes,
42
43
  }
43
44
 
45
+ // Node collector for schema v1
46
+
44
47
  pub struct TopUniqueNodeCollector {
45
48
  limit: usize,
46
49
  selector: NodeSelector,
47
50
  schema: crate::schema::Schema,
48
51
  }
49
52
 
50
- pub struct TopUniqueRelationCollector {
53
+ pub struct TopUniqueNodeSegmentCollector {
51
54
  limit: usize,
55
+ selector: NodeSelector,
56
+ unique: HashSet<NodeId>,
52
57
  schema: crate::schema::Schema,
58
+ store_reader: StoreReader,
53
59
  }
54
60
 
55
- pub struct TopUniqueNodeSegmentCollector {
61
+ // Node collector for schema v2
62
+ //
63
+ // We can now use fast fields to uniquely identify nodes.
64
+
65
+ pub struct TopUniqueNodeCollector2 {
56
66
  limit: usize,
57
67
  selector: NodeSelector,
58
- unique: HashSet<NodeId>,
68
+ }
69
+
70
+ pub struct TopUniqueNodeSegmentCollector2 {
71
+ limit: usize,
72
+ unique: HashSet<Vec<u64>>,
73
+ encoded_node_reader: Column<u64>,
74
+ }
75
+
76
+ // Relations collector
77
+
78
+ pub struct TopUniqueRelationCollector {
79
+ limit: usize,
59
80
  schema: crate::schema::Schema,
60
- store_reader: StoreReader,
61
81
  }
62
82
 
63
83
  pub struct TopUniqueRelationSegmentCollector {
@@ -67,6 +87,18 @@ pub struct TopUniqueRelationSegmentCollector {
67
87
  store_reader: StoreReader,
68
88
  }
69
89
 
90
+ // Relations collector for schema v2
91
+
92
+ pub struct TopUniqueRelationCollector2 {
93
+ limit: usize,
94
+ }
95
+
96
+ pub struct TopUniqueRelationSegmentCollector2 {
97
+ limit: usize,
98
+ unique: HashSet<Vec<u64>>,
99
+ encoded_relation_reader: Column<u64>,
100
+ }
101
+
70
102
  impl TopUniqueNodeCollector {
71
103
  pub fn new(schema: crate::schema::Schema, selector: NodeSelector, limit: usize) -> Self {
72
104
  Self {
@@ -77,12 +109,6 @@ impl TopUniqueNodeCollector {
77
109
  }
78
110
  }
79
111
 
80
- impl TopUniqueRelationCollector {
81
- pub fn new(schema: crate::schema::Schema, limit: usize) -> Self {
82
- Self { limit, schema }
83
- }
84
- }
85
-
86
112
  impl Collector for TopUniqueNodeCollector {
87
113
  type Fruit = HashSet<NodeId>;
88
114
  type Child = TopUniqueNodeSegmentCollector;
@@ -117,6 +143,111 @@ impl Collector for TopUniqueNodeCollector {
117
143
  }
118
144
  }
119
145
 
146
+ impl SegmentCollector for TopUniqueNodeSegmentCollector {
147
+ type Fruit = HashSet<NodeId>;
148
+
149
+ fn collect(&mut self, doc_id: DocId, _score: Score) {
150
+ // we already have all unique results we need
151
+ if self.unique.len() >= self.limit {
152
+ return;
153
+ }
154
+
155
+ // log and skip documents not in the store. This should not happen
156
+ let doc = match self.store_reader.get::<TantivyDocument>(doc_id) {
157
+ Ok(doc) => doc,
158
+ Err(error) => {
159
+ warn!("Error while getting document from store: {error:?}");
160
+ return;
161
+ }
162
+ };
163
+
164
+ let node = match self.selector {
165
+ NodeSelector::SourceNodes => {
166
+ let source_value = self.schema.source_value(&doc).to_string();
167
+ let source_type = io_maps::u64_to_node_type::<i32>(self.schema.source_type(&doc));
168
+ let source_subtype = self.schema.source_subtype(&doc).to_string();
169
+ (source_value, source_type, source_subtype)
170
+ }
171
+ NodeSelector::DestinationNodes => {
172
+ let destination_value = self.schema.target_value(&doc).to_string();
173
+ let destination_type = io_maps::u64_to_node_type::<i32>(self.schema.target_type(&doc));
174
+ let destination_subtype = self.schema.target_subtype(&doc).to_string();
175
+ (destination_value, destination_type, destination_subtype)
176
+ }
177
+ };
178
+ self.unique.insert(node);
179
+ }
180
+
181
+ fn harvest(self) -> Self::Fruit {
182
+ self.unique
183
+ }
184
+ }
185
+
186
+ impl TopUniqueNodeCollector2 {
187
+ pub fn new(selector: NodeSelector, limit: usize) -> Self {
188
+ Self { limit, selector }
189
+ }
190
+ }
191
+
192
+ impl Collector for TopUniqueNodeCollector2 {
193
+ type Fruit = HashSet<Vec<u64>>;
194
+ type Child = TopUniqueNodeSegmentCollector2;
195
+
196
+ fn requires_scoring(&self) -> bool {
197
+ false
198
+ }
199
+
200
+ fn for_segment(&self, _segment_local_id: SegmentOrdinal, segment: &SegmentReader) -> tantivy::Result<Self::Child> {
201
+ let fast_field_reader = match self.selector {
202
+ NodeSelector::SourceNodes => segment.fast_fields().u64("encoded_source_id")?,
203
+ NodeSelector::DestinationNodes => segment.fast_fields().u64("encoded_target_id")?,
204
+ };
205
+ Ok(TopUniqueNodeSegmentCollector2 {
206
+ limit: self.limit,
207
+ unique: HashSet::new(),
208
+ encoded_node_reader: fast_field_reader,
209
+ })
210
+ }
211
+
212
+ fn merge_fruits(
213
+ &self,
214
+ segment_fruits: Vec<<Self::Child as SegmentCollector>::Fruit>,
215
+ ) -> tantivy::Result<Self::Fruit> {
216
+ let mut unique = HashSet::new();
217
+ let mut fruits = segment_fruits.into_iter().flatten();
218
+ let mut fruit = fruits.next();
219
+
220
+ while fruit.is_some() && unique.len() < self.limit {
221
+ unique.insert(fruit.unwrap());
222
+ fruit = fruits.next();
223
+ }
224
+ Ok(unique)
225
+ }
226
+ }
227
+
228
+ impl SegmentCollector for TopUniqueNodeSegmentCollector2 {
229
+ type Fruit = HashSet<Vec<u64>>;
230
+
231
+ fn collect(&mut self, doc_id: DocId, _score: Score) {
232
+ // we already have all unique results we need
233
+ if self.unique.len() >= self.limit {
234
+ return;
235
+ }
236
+ let encoded_node = self.encoded_node_reader.values_for_doc(doc_id).collect::<Vec<u64>>();
237
+ self.unique.insert(encoded_node);
238
+ }
239
+
240
+ fn harvest(self) -> Self::Fruit {
241
+ self.unique
242
+ }
243
+ }
244
+
245
+ impl TopUniqueRelationCollector {
246
+ pub fn new(schema: crate::schema::Schema, limit: usize) -> Self {
247
+ Self { limit, schema }
248
+ }
249
+ }
250
+
120
251
  impl Collector for TopUniqueRelationCollector {
121
252
  type Fruit = Vec<TantivyDocument>;
122
253
  type Child = TopUniqueRelationSegmentCollector;
@@ -154,8 +285,8 @@ impl Collector for TopUniqueRelationCollector {
154
285
  }
155
286
  }
156
287
 
157
- impl SegmentCollector for TopUniqueNodeSegmentCollector {
158
- type Fruit = HashSet<NodeId>;
288
+ impl SegmentCollector for TopUniqueRelationSegmentCollector {
289
+ type Fruit = HashMap<RelationId, TantivyDocument>;
159
290
 
160
291
  fn collect(&mut self, doc_id: DocId, _score: Score) {
161
292
  // we already have all unique results we need
@@ -172,21 +303,9 @@ impl SegmentCollector for TopUniqueNodeSegmentCollector {
172
303
  }
173
304
  };
174
305
 
175
- let node = match self.selector {
176
- NodeSelector::SourceNodes => {
177
- let source_value = self.schema.source_value(&doc).to_string();
178
- let source_type = io_maps::u64_to_node_type::<i32>(self.schema.source_type(&doc));
179
- let source_subtype = self.schema.source_subtype(&doc).to_string();
180
- (source_value, source_type, source_subtype)
181
- }
182
- NodeSelector::DestinationNodes => {
183
- let destination_value = self.schema.target_value(&doc).to_string();
184
- let destination_type = io_maps::u64_to_node_type::<i32>(self.schema.target_type(&doc));
185
- let destination_subtype = self.schema.target_subtype(&doc).to_string();
186
- (destination_value, destination_type, destination_subtype)
187
- }
188
- };
189
- self.unique.insert(node);
306
+ let relation_label = self.schema.relationship_label(&doc).to_string();
307
+ let relation_type = self.schema.relationship(&doc);
308
+ self.unique.insert((relation_label, relation_type), doc);
190
309
  }
191
310
 
192
311
  fn harvest(self) -> Self::Fruit {
@@ -194,8 +313,46 @@ impl SegmentCollector for TopUniqueNodeSegmentCollector {
194
313
  }
195
314
  }
196
315
 
197
- impl SegmentCollector for TopUniqueRelationSegmentCollector {
198
- type Fruit = HashMap<RelationId, TantivyDocument>;
316
+ impl TopUniqueRelationCollector2 {
317
+ pub fn new(limit: usize) -> Self {
318
+ Self { limit }
319
+ }
320
+ }
321
+
322
+ impl Collector for TopUniqueRelationCollector2 {
323
+ type Fruit = HashSet<Vec<u64>>;
324
+ type Child = TopUniqueRelationSegmentCollector2;
325
+
326
+ fn requires_scoring(&self) -> bool {
327
+ false
328
+ }
329
+
330
+ fn for_segment(&self, _segment_local_id: SegmentOrdinal, segment: &SegmentReader) -> tantivy::Result<Self::Child> {
331
+ Ok(TopUniqueRelationSegmentCollector2 {
332
+ limit: self.limit,
333
+ unique: HashSet::new(),
334
+ encoded_relation_reader: segment.fast_fields().u64("encoded_relation_id")?,
335
+ })
336
+ }
337
+
338
+ fn merge_fruits(
339
+ &self,
340
+ segment_fruits: Vec<<Self::Child as SegmentCollector>::Fruit>,
341
+ ) -> tantivy::Result<Self::Fruit> {
342
+ let mut unique = HashSet::new();
343
+ let mut fruits = segment_fruits.into_iter().flat_map(|map| map.into_iter());
344
+ let mut fruit = fruits.next();
345
+
346
+ while fruit.is_some() && unique.len() < self.limit {
347
+ unique.insert(fruit.unwrap());
348
+ fruit = fruits.next();
349
+ }
350
+ Ok(unique)
351
+ }
352
+ }
353
+
354
+ impl SegmentCollector for TopUniqueRelationSegmentCollector2 {
355
+ type Fruit = HashSet<Vec<u64>>;
199
356
 
200
357
  fn collect(&mut self, doc_id: DocId, _score: Score) {
201
358
  // we already have all unique results we need
@@ -203,18 +360,11 @@ impl SegmentCollector for TopUniqueRelationSegmentCollector {
203
360
  return;
204
361
  }
205
362
 
206
- // log and skip documents not in the store. This should not happen
207
- let doc = match self.store_reader.get::<TantivyDocument>(doc_id) {
208
- Ok(doc) => doc,
209
- Err(error) => {
210
- warn!("Error while getting document from store: {error:?}");
211
- return;
212
- }
213
- };
214
-
215
- let relation_label = self.schema.relationship_label(&doc).to_string();
216
- let relation_type = self.schema.relationship(&doc);
217
- self.unique.insert((relation_label, relation_type), doc);
363
+ let relation = self
364
+ .encoded_relation_reader
365
+ .values_for_doc(doc_id)
366
+ .collect::<Vec<u64>>();
367
+ self.unique.insert(relation);
218
368
  }
219
369
 
220
370
  fn harvest(self) -> Self::Fruit {
@@ -34,11 +34,14 @@ use tantivy::schema::Field;
34
34
  use tantivy::{DocAddress, Index, IndexReader, Searcher};
35
35
  use uuid::Uuid;
36
36
 
37
- use crate::graph_collector::{NodeSelector, TopUniqueNodeCollector, TopUniqueRelationCollector};
37
+ use crate::graph_collector::{
38
+ NodeSelector, TopUniqueNodeCollector, TopUniqueNodeCollector2, TopUniqueRelationCollector,
39
+ TopUniqueRelationCollector2,
40
+ };
38
41
  use crate::graph_query_parser::{
39
42
  BoolGraphQuery, BoolNodeQuery, Expression, FuzzyTerm, GraphQuery, GraphQueryParser, Node, NodeQuery, Term,
40
43
  };
41
- use crate::schema::{Schema, encode_field_id};
44
+ use crate::schema::{Schema, decode_node, decode_relation, encode_field_id};
42
45
  use crate::{RelationConfig, io_maps};
43
46
 
44
47
  const FUZZY_DISTANCE: u8 = 1;
@@ -166,33 +169,62 @@ impl RelationsReaderService {
166
169
  let source_query = self.apply_prefilter(source_query, prefilter);
167
170
  let destination_query = self.apply_prefilter(destination_query, prefilter);
168
171
 
169
- let mut unique_nodes = HashSet::new();
170
-
171
- let collector = TopUniqueNodeCollector::new(self.schema.clone(), NodeSelector::SourceNodes, top_k);
172
- let searcher = self.reader.searcher();
173
- let mut source_nodes = searcher.search(&source_query, &collector)?;
174
- unique_nodes.extend(source_nodes.drain());
175
-
176
- let collector = TopUniqueNodeCollector::new(self.schema.clone(), NodeSelector::DestinationNodes, top_k);
177
172
  let searcher = self.reader.searcher();
178
- let mut destination_nodes = searcher.search(&destination_query, &collector)?;
179
- unique_nodes.extend(destination_nodes.drain());
180
-
181
- let nodes = unique_nodes
182
- .into_iter()
183
- .map(|(value, node_type, node_subtype)| RelationNode {
184
- value,
185
- ntype: node_type,
186
- subtype: node_subtype,
187
- })
188
- .take(top_k)
189
- .collect();
190
173
 
191
- let response = nidx_protos::GraphSearchResponse {
192
- nodes,
193
- ..Default::default()
194
- };
195
- Ok(response)
174
+ if self.schema.version == 1 {
175
+ let mut unique_nodes = HashSet::new();
176
+
177
+ let collector = TopUniqueNodeCollector::new(self.schema.clone(), NodeSelector::SourceNodes, top_k);
178
+ let mut source_nodes = searcher.search(&source_query, &collector)?;
179
+ unique_nodes.extend(source_nodes.drain());
180
+
181
+ let collector = TopUniqueNodeCollector::new(self.schema.clone(), NodeSelector::DestinationNodes, top_k);
182
+ let mut destination_nodes = searcher.search(&destination_query, &collector)?;
183
+ unique_nodes.extend(destination_nodes.drain());
184
+
185
+ let nodes = unique_nodes
186
+ .into_iter()
187
+ .map(|(value, node_type, node_subtype)| RelationNode {
188
+ value,
189
+ ntype: node_type,
190
+ subtype: node_subtype,
191
+ })
192
+ .take(top_k)
193
+ .collect();
194
+
195
+ let response = nidx_protos::GraphSearchResponse {
196
+ nodes,
197
+ ..Default::default()
198
+ };
199
+ Ok(response)
200
+ } else {
201
+ let mut unique_nodes = HashSet::new();
202
+
203
+ let collector = TopUniqueNodeCollector2::new(NodeSelector::SourceNodes, top_k);
204
+ let mut source_nodes = searcher.search(&source_query, &collector)?;
205
+ unique_nodes.extend(source_nodes.drain());
206
+
207
+ let collector = TopUniqueNodeCollector2::new(NodeSelector::DestinationNodes, top_k);
208
+ let mut destination_nodes = searcher.search(&destination_query, &collector)?;
209
+ unique_nodes.extend(destination_nodes.drain());
210
+
211
+ let nodes = unique_nodes
212
+ .into_iter()
213
+ .map(|encoded_node| decode_node(&encoded_node))
214
+ .map(|(value, node_type, node_subtype)| RelationNode {
215
+ value,
216
+ ntype: io_maps::u64_to_node_type(node_type),
217
+ subtype: node_subtype,
218
+ })
219
+ .take(top_k)
220
+ .collect();
221
+
222
+ let response = nidx_protos::GraphSearchResponse {
223
+ nodes,
224
+ ..Default::default()
225
+ };
226
+ Ok(response)
227
+ }
196
228
  }
197
229
 
198
230
  fn relations_graph_search(
@@ -206,20 +238,48 @@ impl RelationsReaderService {
206
238
  let index_query = parser.parse_bool(query);
207
239
  let index_query = self.apply_prefilter(index_query, prefilter);
208
240
 
209
- let collector = TopUniqueRelationCollector::new(self.schema.clone(), top_k);
210
241
  let searcher = self.reader.searcher();
211
- let matching_docs = searcher.search(&index_query, &collector)?;
212
242
 
213
- let relations = matching_docs
214
- .into_iter()
215
- .map(|doc| io_maps::doc_to_graph_relation(&self.schema, &doc))
216
- .collect();
243
+ if self.schema.version == 1 {
244
+ let collector = TopUniqueRelationCollector::new(self.schema.clone(), top_k);
245
+ let matching_docs = searcher.search(&index_query, &collector)?;
246
+
247
+ let relations = matching_docs
248
+ .into_iter()
249
+ .map(|doc| nidx_protos::graph_search_response::Relation {
250
+ relation_type: io_maps::u64_to_relation_type::<i32>(self.schema.relationship(&doc)),
251
+ label: self.schema.relationship_label(&doc).to_string(),
252
+ metadata: None,
253
+ })
254
+ .collect();
255
+
256
+ let response = nidx_protos::GraphSearchResponse {
257
+ relations,
258
+ ..Default::default()
259
+ };
260
+ Ok(response)
261
+ } else {
262
+ let collector = TopUniqueRelationCollector2::new(top_k);
263
+ let matching_docs = searcher.search(&index_query, &collector)?;
264
+
265
+ let relations = matching_docs
266
+ .into_iter()
267
+ .map(|encoded_relation| {
268
+ let (relation_type, relation_label) = decode_relation(&encoded_relation);
269
+ nidx_protos::graph_search_response::Relation {
270
+ relation_type: io_maps::u64_to_relation_type::<i32>(relation_type),
271
+ label: relation_label,
272
+ metadata: None,
273
+ }
274
+ })
275
+ .collect();
217
276
 
218
- let response = nidx_protos::GraphSearchResponse {
219
- relations,
220
- ..Default::default()
221
- };
222
- Ok(response)
277
+ let response = nidx_protos::GraphSearchResponse {
278
+ relations,
279
+ ..Default::default()
280
+ };
281
+ Ok(response)
282
+ }
223
283
  }
224
284
 
225
285
  fn apply_prefilter(&self, query: Box<dyn Query>, prefilter: &PrefilterResult) -> Box<dyn Query> {
@@ -19,7 +19,7 @@
19
19
  //
20
20
 
21
21
  use crate::io_maps;
22
- use crate::schema::{Schema, encode_field_id};
22
+ use crate::schema::{Schema, encode_field_id, encode_node, encode_relation};
23
23
  use anyhow::anyhow;
24
24
  use nidx_protos::noderesources::IndexRelation;
25
25
  use nidx_protos::prost::*;
@@ -99,12 +99,24 @@ pub fn index_relations(
99
99
  let field = field_key.ok_or(anyhow!("Field ID required for v2"))?;
100
100
  new_doc.add_bytes(schema.resource_id, rid.as_bytes());
101
101
  new_doc.add_bytes(schema.resource_field_id.unwrap(), encode_field_id(rid, field));
102
+
102
103
  for facet in &index_relation.facets {
103
104
  new_doc.add_facet(schema.facets.unwrap(), Facet::from_text(facet)?);
104
105
  }
105
- // encoded_source_id = Some(builder.add_u64_field("encoded_source_id", FAST));
106
- // encoded_target_id = Some(builder.add_u64_field("encoded_target_id", FAST));
107
- // todo!();
106
+
107
+ // Encode source and target nodes and relation for faster retrieval
108
+ let encoded_source_id = schema.encoded_source_id.unwrap();
109
+ for b in encode_node(source_value, source_type, source_subtype) {
110
+ new_doc.add_u64(encoded_source_id, b);
111
+ }
112
+ let encoded_target_id = schema.encoded_target_id.unwrap();
113
+ for b in encode_node(target_value, target_type, target_subtype) {
114
+ new_doc.add_u64(encoded_target_id, b);
115
+ }
116
+ let encoded_relation_id = schema.encoded_relation_id.unwrap();
117
+ for b in encode_relation(relationship, label) {
118
+ new_doc.add_u64(encoded_relation_id, b);
119
+ }
108
120
  }
109
121
 
110
122
  if let Some(metadata) = relation.metadata.as_ref() {