nidx-binding 6.3.4.post123__tar.gz → 6.3.4.post129__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.post123 → nidx_binding-6.3.4.post129}/Cargo.lock +10 -9
  2. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/PKG-INFO +1 -1
  3. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_protos/pyproject.toml +1 -1
  4. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_relation/Cargo.toml +2 -0
  5. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_relation/src/graph_collector.rs +4 -7
  6. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_relation/src/graph_query_parser.rs +125 -62
  7. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_relation/src/io_maps.rs +25 -2
  8. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_relation/src/lib.rs +77 -13
  9. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_relation/src/reader.rs +54 -39
  10. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_relation/src/resource_indexer.rs +49 -12
  11. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_relation/src/schema.rs +86 -30
  12. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_relation/tests/common/mod.rs +15 -11
  13. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_relation/tests/test_graph_search.rs +15 -18
  14. nidx_binding-6.3.4.post129/nidx_relation/tests/test_reader.rs +417 -0
  15. nidx_binding-6.3.4.post129/nidx_relation/tests/test_writer.rs +84 -0
  16. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_tests/src/graph.rs +22 -17
  17. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_tests/src/lib.rs +15 -9
  18. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/pyproject.toml +1 -1
  19. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/indexer.rs +2 -2
  20. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/metadata/index.rs +4 -2
  21. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/searcher/index_cache.rs +1 -1
  22. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/worker.rs +3 -1
  23. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/tests/test_search_relations.rs +33 -20
  24. nidx_binding-6.3.4.post123/nidx_relation/tests/test_reader.rs +0 -398
  25. nidx_binding-6.3.4.post123/nidx_relation/tests/test_writer.rs +0 -73
  26. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-0cfce9b29547f8f5bafa6e440f86103be7b8c4ad2fd92db9ac223f4efbe23d10.json +0 -0
  27. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-1a561eed00f3dbe868bf5030059793300209179dc8fb73e4b57a54b5e81262fe.json +0 -0
  28. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-1d3fca2682e25a01143da92285297f134a6a105a96f64d87e0db3abb219855e4.json +0 -0
  29. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-249b3b57c27a71baa823f1fe0f0bba9c9af36f61c28f731e58beea60ec48e687.json +0 -0
  30. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-24cb6b683daa42d7125f862e25943ab4be7bf275cd8739f8da4859d701795e1a.json +0 -0
  31. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-263c8fce6db5b03bbd012fafdba6943cbee6ed7eb8976cdef4f5b01dde7ca6fd.json +0 -0
  32. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-2a5d92fb1638df830a4477a7cdf24e6db6b43034b7bbe74fdfb63e8afe2c4071.json +0 -0
  33. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-2b065a363f58caed60e3706603c1260dbf5a4c795604a5b68edda22eb07fec1b.json +0 -0
  34. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-3fc3cb39934683de8cd475ce1368c8373453eb1e01f81587d66b9d14b109ce6e.json +0 -0
  35. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-48f33b77b7c1633467b0b2efcaa1d3c207e7757e4f1d83b40d15e6ca365f7771.json +0 -0
  36. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-4ae09f2c08e2f324bee01bb8487a8f37678a1c5e9d327339235c50d4921a8949.json +0 -0
  37. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-4d7a76fa413c9ef0ce2a47ac7bb7e01d3e6a2aabded9487d21010a53efee8852.json +0 -0
  38. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-4fcbdd6657c7dc9b60b3a563dd41711b3dbcf72ce063427b7a01f8cddf34c244.json +0 -0
  39. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-577109ac00ccfbd38ecaccab94116f2f46a4caf5612afa372cded197123c1e08.json +0 -0
  40. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-5db25f97d8578d6d78f2f6bd4b72cc82a9b1b82805c6422d967ac63b20d99db4.json +0 -0
  41. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-5ec3233a3a23e926055056d46bdde17836a633066dbb5f349502648cd3ea9a60.json +0 -0
  42. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-66edb6ea424d8681927dcddb6bac5f1239175f4775d1f40417ba15054b0c6f19.json +0 -0
  43. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-6f9c6d201c1b5712efb68c363bffd3e0169c11f2a8f925e8cd4e8808599ff7b4.json +0 -0
  44. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-733c3ebacc86f444bf5e2dd79ade660c291e88a00fc09b722f6e2e191545874c.json +0 -0
  45. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-77a245aed9f6f8b9fc643efbd4b1e2e8e99bbba085e3e75a4f29321cd7b2a25c.json +0 -0
  46. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-7a3bf27c330c468a596e8a297cf7d8b192e31e67ecc5177c1267f579e8e247c7.json +0 -0
  47. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-7a7e59e47b30b12237511fd3d7da2d17b0471ad2b006af48d6a6f587c779692b.json +0 -0
  48. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-7dcbb33312cc9f11ae3a6d73b1ace017a9f19a8bf8f10304fc57977c8efeadff.json +0 -0
  49. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-7efa7c0d747afc4b6aed0586ff846c27839c3213ff7ee9f30c89b0d0f17e60e3.json +0 -0
  50. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-8493140d788604d498a4e48da4158708572ccc9d60185290a00d549cc84533db.json +0 -0
  51. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-8493bb0059b013eaca42fd10cd7d04f0d06a8acaed379eff0d23f3229edde9ee.json +0 -0
  52. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-87996b3d6c7a2195438d7038015b06949102bce8c7b8cd8db1f83aaf23cbe489.json +0 -0
  53. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-8f096d8171b89f9615d18f95d696dc9e4fb3674e103161a713cdc806f7a68506.json +0 -0
  54. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-917732a56ee04bf3a6e127319dda8225210869c82f9828d878162394dba4e078.json +0 -0
  55. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-95fe4ef93ee90733db1b67ed7987f80b5aac792f1590b979c68b418d1599eb98.json +0 -0
  56. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-9b67658569b343d8b4b61ae0a7dc721f367f2ba33c7b69b9e68bfd5c9bff5206.json +0 -0
  57. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-9c8062ea55d070afef68309e58fa987eb37fda44e1efbf68c8ba2af7846cc968.json +0 -0
  58. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-a06e1d9f6f95e4c4c2b98310ebddcc9d963cc033582bf2e945e8bf3a301b4247.json +0 -0
  59. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-a55265c9b07bd1399961a6f1e757201fd0eebe868ddaf96437111113d80fce92.json +0 -0
  60. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-a891a37be5c2d7cce775c2dd33726b0318fd3839beab222a1b22bc6174604207.json +0 -0
  61. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-a945191bb4b3e37d6823ed3ad499339d007d69983105de8567777d9daf517b28.json +0 -0
  62. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-abe9f7832f2bd799ac44008da031e8d8ab52d4f5fbfc2a7e3974e8873bae55b2.json +0 -0
  63. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-aca588cca57a85e4d7fcc40c23cd87e57d53d11ca550d78e7e3d5e39e524fcd3.json +0 -0
  64. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-b02f8aafc00a7724510772ac41269e368c5bccf03ef7b4590e0ef6fd1a1bf64f.json +0 -0
  65. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-b742e17cabe2d64617e9aa64bafc782172f7a4f8023d1b54f952a0fb39f6b2b8.json +0 -0
  66. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-b94e349dbc0daec57f8f8f6e9e2dffb06100b1bb2b41d297c9f3b191da37a83d.json +0 -0
  67. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-bd9afa22994aba671dbf7b5f89b53c2ee02f53c0442a81265786a6d52d08512f.json +0 -0
  68. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-be60554eca98a5899efc6b49785cecd6444a6d39afed9e4a884ce2dbf162012c.json +0 -0
  69. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-bf49702b506c9a1650ece1f8e8d9f14834a902f8caefafe30ded55e2790f2188.json +0 -0
  70. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-bfb8ae2e860e451b0868a7b1b50a451d998b2105f9fdfd307b26a1775d145e9f.json +0 -0
  71. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-bfcd21ed704cd305db5c17fcdec7d92aa4ac501913c9c9514d8ff92928c0c7e7.json +0 -0
  72. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-c3ab694650f49a75b146fb877a92e48c4f20f0d99f70f8ec859fbb763b01a1e5.json +0 -0
  73. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-c55542bb9fae544d87fae6f30e0fe8a9088d12075f4442ab4fe2fcd05e472234.json +0 -0
  74. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-cb29a6556d35ac630ee0aa885dd7341cf9573bd3efd216ff8a887b87686b03db.json +0 -0
  75. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-d0a1f341a89f5f14696b10baa72db9d95551c2b7e5fc67308fd52dc03dd98a92.json +0 -0
  76. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-d2ad0a0ca2649c9e4873cfcc1fc66d2d07cc45d0f65c560b06d7b5f592f4fa8a.json +0 -0
  77. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-d6cfe78eb635ba0b89ca4021a4dc8182d18ab5b197f30149cd28488eba4c1df5.json +0 -0
  78. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-d729b56dea00e49dcdba8cf0001e2811da27351eabe98212db3b589f18fc6f32.json +0 -0
  79. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-d9658bfd4e7170b41d03f2ddf2446d0bf54171c0d39d53bf20af2b8437f2ec48.json +0 -0
  80. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-dbba7b3d3289425bae711aedbf73fbc3699f857f86f84d95c3b556d05c5658b0.json +0 -0
  81. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-dcb96b649d6d63a58efd5d445453a4f3d7869a56ff714b69bedf3d616a0473ca.json +0 -0
  82. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-ebd876fbf5362a5900e75bc05f2f11c73c406ef7da4e95097fc6a1c3d1b8bc54.json +0 -0
  83. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-eef5cc6bce1cc14eba8f3e68971724ef181e88cffcedd74673615f2026b89a62.json +0 -0
  84. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/.sqlx/query-ef56d5fefc5774040d1ee397beadb475f6af02768c22f0e583c74062e2e821ce.json +0 -0
  85. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/Cargo.toml +0 -0
  86. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/README.md +0 -0
  87. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/migrations/20241007163501_initial.sql +0 -0
  88. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/migrations/20241211120039_merge_job_priority.sql +0 -0
  89. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/migrations/20241211121159_basic_indexes.sql +0 -0
  90. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/migrations/20241212151105_check_segment_records.sql +0 -0
  91. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/migrations/20250110145554_in_flight_messages.sql +0 -0
  92. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_binding/Cargo.toml +0 -0
  93. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_binding/src/lib.rs +0 -0
  94. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/Cargo.toml +0 -0
  95. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/src/fuzzy_query.rs +0 -0
  96. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/src/lib.rs +0 -0
  97. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/src/query_io.rs +0 -0
  98. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/src/reader.rs +0 -0
  99. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/src/request_types.rs +0 -0
  100. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/src/resource_indexer.rs +0 -0
  101. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/src/schema.rs +0 -0
  102. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/src/search_query.rs +0 -0
  103. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/src/search_response.rs +0 -0
  104. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/src/set_query.rs +0 -0
  105. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/src/stop_words.rs +0 -0
  106. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/README.md +0 -0
  107. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/ar.json +0 -0
  108. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/az.json +0 -0
  109. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/bn.json +0 -0
  110. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/ca.json +0 -0
  111. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/ch.json +0 -0
  112. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/da.json +0 -0
  113. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/de.json +0 -0
  114. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/el.json +0 -0
  115. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/en.json +0 -0
  116. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/es.json +0 -0
  117. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/eu.json +0 -0
  118. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/extract.py +0 -0
  119. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/fi.json +0 -0
  120. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/fr.json +0 -0
  121. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/he.json +0 -0
  122. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/hu.json +0 -0
  123. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/id.json +0 -0
  124. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/it.json +0 -0
  125. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/kk.json +0 -0
  126. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/ne.json +0 -0
  127. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/nl.json +0 -0
  128. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/no.json +0 -0
  129. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/pt.json +0 -0
  130. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/ro.json +0 -0
  131. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/ru.json +0 -0
  132. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/sl.json +0 -0
  133. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/sv.json +0 -0
  134. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/tg.json +0 -0
  135. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/stop_words/tr.json +0 -0
  136. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/tests/common/mod.rs +0 -0
  137. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_paragraph/tests/reader.rs +0 -0
  138. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_protos/Cargo.toml +0 -0
  139. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_protos/build.py +0 -0
  140. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_protos/build.rs +0 -0
  141. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_protos/src/lib.rs +0 -0
  142. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_protos/src/nidx.proto +0 -0
  143. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_tantivy/Cargo.toml +0 -0
  144. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_tantivy/src/index_reader.rs +0 -0
  145. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_tantivy/src/lib.rs +0 -0
  146. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_tests/Cargo.toml +0 -0
  147. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_text/Cargo.toml +0 -0
  148. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_text/src/lib.rs +0 -0
  149. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_text/src/prefilter.rs +0 -0
  150. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_text/src/query_io.rs +0 -0
  151. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_text/src/reader.rs +0 -0
  152. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_text/src/request_types.rs +0 -0
  153. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_text/src/resource_indexer.rs +0 -0
  154. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_text/src/schema.rs +0 -0
  155. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_text/src/search_query.rs +0 -0
  156. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_text/tests/common/mod.rs +0 -0
  157. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_text/tests/test_flow.rs +0 -0
  158. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_text/tests/test_search.rs +0 -0
  159. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_text/tests/test_streaming.rs +0 -0
  160. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_types/Cargo.toml +0 -0
  161. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_types/src/lib.rs +0 -0
  162. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_types/src/prefilter.rs +0 -0
  163. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_types/src/query_language.rs +0 -0
  164. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/Cargo.toml +0 -0
  165. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/src/config.rs +0 -0
  166. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/src/data_point/disk_hnsw.rs +0 -0
  167. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/src/data_point/mod.rs +0 -0
  168. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/src/data_point/node.rs +0 -0
  169. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/src/data_point/ops_hnsw.rs +0 -0
  170. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/src/data_point/params.rs +0 -0
  171. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/src/data_point/ram_hnsw.rs +0 -0
  172. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/src/data_point/tests.rs +0 -0
  173. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/src/data_point_provider/mod.rs +0 -0
  174. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/src/data_point_provider/reader.rs +0 -0
  175. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/src/data_types/data_store.rs +0 -0
  176. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/src/data_types/mod.rs +0 -0
  177. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/src/data_types/trie.rs +0 -0
  178. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/src/data_types/trie_ram.rs +0 -0
  179. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/src/formula/mod.rs +0 -0
  180. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/src/indexer.rs +0 -0
  181. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/src/inverted_index/fst_index.rs +0 -0
  182. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/src/inverted_index/map.rs +0 -0
  183. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/src/inverted_index.rs +0 -0
  184. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/src/lib.rs +0 -0
  185. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/src/query_io.rs +0 -0
  186. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/src/request_types.rs +0 -0
  187. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/src/utils.rs +0 -0
  188. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/src/vector_types/dense_f32.rs +0 -0
  189. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/src/vector_types/mod.rs +0 -0
  190. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/tests/common/mod.rs +0 -0
  191. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/tests/test_basic_search.rs +0 -0
  192. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/nidx_vector/tests/test_hidden.rs +0 -0
  193. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/api/grpc.rs +0 -0
  194. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/api/shards.rs +0 -0
  195. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/api.rs +0 -0
  196. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/control.rs +0 -0
  197. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/errors.rs +0 -0
  198. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/grpc_server.rs +0 -0
  199. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/import_export.rs +0 -0
  200. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/lib.rs +0 -0
  201. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/main.rs +0 -0
  202. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/metadata/deletion.rs +0 -0
  203. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/metadata/index_request.rs +0 -0
  204. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/metadata/merge_job.rs +0 -0
  205. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/metadata/segment.rs +0 -0
  206. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/metadata/shard.rs +0 -0
  207. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/metadata.rs +0 -0
  208. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/metrics.rs +0 -0
  209. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/scheduler/audit_task.rs +0 -0
  210. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/scheduler/log_merge.rs +0 -0
  211. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/scheduler/merge_task.rs +0 -0
  212. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/scheduler/metrics_task.rs +0 -0
  213. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/scheduler/purge_tasks.rs +0 -0
  214. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/scheduler/vector_merge.rs +0 -0
  215. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/scheduler.rs +0 -0
  216. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/searcher/grpc.rs +0 -0
  217. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/searcher/query_language.rs +0 -0
  218. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/searcher/query_planner.rs +0 -0
  219. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/searcher/shard_search.rs +0 -0
  220. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/searcher/shard_selector.rs +0 -0
  221. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/searcher/shard_suggest.rs +0 -0
  222. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/searcher/streams.rs +0 -0
  223. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/searcher/sync.rs +0 -0
  224. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/searcher.rs +0 -0
  225. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/segment_store.rs +0 -0
  226. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/settings.rs +0 -0
  227. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/telemetry/duration_layer.rs +0 -0
  228. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/telemetry/log_format.rs +0 -0
  229. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/telemetry/middleware.rs +0 -0
  230. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/telemetry.rs +0 -0
  231. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/src/tool.rs +0 -0
  232. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/tests/common/mod.rs +0 -0
  233. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/tests/common/services.rs +0 -0
  234. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/tests/test_date_range_search.rs +0 -0
  235. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/tests/test_search_filtering.rs +0 -0
  236. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/tests/test_search_sorting.rs +0 -0
  237. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/tests/test_searcher_cluster.rs +0 -0
  238. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/tests/test_security_search.rs +0 -0
  239. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/tests/test_shards.rs +0 -0
  240. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/tests/test_shards_api.rs +0 -0
  241. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/tests/test_suggest.rs +0 -0
  242. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/tests/test_synced_searcher.rs +0 -0
  243. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/tests/test_vector_normalization.rs +0 -0
  244. {nidx_binding-6.3.4.post123 → nidx_binding-6.3.4.post129}/tests/test_vectorsets.rs +0 -0
@@ -2128,9 +2128,11 @@ dependencies = [
2128
2128
  "nidx_tantivy",
2129
2129
  "nidx_tests",
2130
2130
  "nidx_types",
2131
+ "serde",
2131
2132
  "tantivy",
2132
2133
  "tempfile",
2133
2134
  "tracing",
2135
+ "uuid",
2134
2136
  ]
2135
2137
 
2136
2138
  [[package]]
@@ -3141,15 +3143,14 @@ dependencies = [
3141
3143
 
3142
3144
  [[package]]
3143
3145
  name = "ring"
3144
- version = "0.17.8"
3146
+ version = "0.17.14"
3145
3147
  source = "registry+https://github.com/rust-lang/crates.io-index"
3146
- checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d"
3148
+ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
3147
3149
  dependencies = [
3148
3150
  "cc",
3149
3151
  "cfg-if",
3150
3152
  "getrandom 0.2.15",
3151
3153
  "libc",
3152
- "spin",
3153
3154
  "untrusted",
3154
3155
  "windows-sys 0.52.0",
3155
3156
  ]
@@ -3519,9 +3520,9 @@ dependencies = [
3519
3520
 
3520
3521
  [[package]]
3521
3522
  name = "serde"
3522
- version = "1.0.217"
3523
+ version = "1.0.219"
3523
3524
  source = "registry+https://github.com/rust-lang/crates.io-index"
3524
- checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70"
3525
+ checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
3525
3526
  dependencies = [
3526
3527
  "serde_derive",
3527
3528
  ]
@@ -3538,9 +3539,9 @@ dependencies = [
3538
3539
 
3539
3540
  [[package]]
3540
3541
  name = "serde_derive"
3541
- version = "1.0.217"
3542
+ version = "1.0.219"
3542
3543
  source = "registry+https://github.com/rust-lang/crates.io-index"
3543
- checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0"
3544
+ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
3544
3545
  dependencies = [
3545
3546
  "proc-macro2",
3546
3547
  "quote",
@@ -4742,9 +4743,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
4742
4743
 
4743
4744
  [[package]]
4744
4745
  name = "uuid"
4745
- version = "1.13.1"
4746
+ version = "1.16.0"
4746
4747
  source = "registry+https://github.com/rust-lang/crates.io-index"
4747
- checksum = "ced87ca4be083373936a67f8de945faa23b6b42384bd5b64434850802c6dccd0"
4748
+ checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9"
4748
4749
  dependencies = [
4749
4750
  "getrandom 0.3.1",
4750
4751
  "serde",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nidx_binding
3
- Version: 6.3.4.post123
3
+ Version: 6.3.4.post129
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -4,7 +4,7 @@ build-backend = "pdm.backend"
4
4
 
5
5
  [project]
6
6
  name = "nidx_protos"
7
- version = "6.3.4.post123"
7
+ version = "6.3.4.post129"
8
8
  license = { text = "AGPL" }
9
9
  description = "Protobuf definitions for nucliadb/nidx"
10
10
  authors = [ { name = "Nuclia", email = "nucliadb@nuclia.com" }]
@@ -10,8 +10,10 @@ deunicode = "1.3.2"
10
10
  nidx_protos = { version = "0.1.0", path = "../nidx_protos" }
11
11
  nidx_tantivy = { version = "0.1.0", path = "../nidx_tantivy" }
12
12
  nidx_types = { version = "0.1.0", path = "../nidx_types" }
13
+ serde = { version = "1.0.219", features = ["derive"] }
13
14
  tantivy = "0.22"
14
15
  tracing = "0.1.41"
16
+ uuid = "1.16.0"
15
17
 
16
18
  [dev-dependencies]
17
19
  tempfile = "3"
@@ -68,21 +68,18 @@ pub struct TopUniqueRelationSegmentCollector {
68
68
  }
69
69
 
70
70
  impl TopUniqueNodeCollector {
71
- pub fn new(selector: NodeSelector, limit: usize) -> Self {
71
+ pub fn new(schema: crate::schema::Schema, selector: NodeSelector, limit: usize) -> Self {
72
72
  Self {
73
73
  limit,
74
74
  selector,
75
- schema: crate::schema::Schema::new(),
75
+ schema,
76
76
  }
77
77
  }
78
78
  }
79
79
 
80
80
  impl TopUniqueRelationCollector {
81
- pub fn new(limit: usize) -> Self {
82
- Self {
83
- limit,
84
- schema: crate::schema::Schema::new(),
85
- }
81
+ pub fn new(schema: crate::schema::Schema, limit: usize) -> Self {
82
+ Self { limit, schema }
86
83
  }
87
84
  }
88
85
 
@@ -23,9 +23,10 @@ use nidx_protos::relation_node::NodeType;
23
23
  use nidx_types::query_language::{BooleanExpression, BooleanOperation, Operator};
24
24
  use tantivy::query::{AllQuery, BooleanQuery, FuzzyTermQuery, Occur, Query, TermQuery};
25
25
  use tantivy::schema::{Field, IndexRecordOption};
26
+ use tantivy::tokenizer::TokenizerManager;
26
27
 
28
+ use crate::io_maps;
27
29
  use crate::schema::Schema;
28
- use crate::{io_maps, schema};
29
30
 
30
31
  const DEFAULT_NODE_VALUE_FUZZY_DISTANCE: u8 = 1;
31
32
 
@@ -119,20 +120,32 @@ enum NodePosition {
119
120
  pub struct BoolNodeQuery(BooleanExpression<Node>);
120
121
  pub struct BoolGraphQuery(BooleanExpression<GraphQuery>);
121
122
 
123
+ #[derive(Clone, Copy)]
124
+ struct TokenizedNodeFields {
125
+ exact: Field,
126
+ tokenized: Field,
127
+ }
128
+
129
+ #[derive(Clone, Copy)]
130
+ enum NodeValueField {
131
+ Normalized(Field),
132
+ Tokenized(TokenizedNodeFields),
133
+ }
134
+
122
135
  #[derive(Clone, Copy)]
123
136
  struct NodeSchemaFields {
124
- normalized_value: Field,
137
+ value: NodeValueField,
125
138
  node_type: Field,
126
139
  node_subtype: Field,
127
140
  }
128
141
 
129
- pub struct GraphQueryParser {
130
- schema: Schema,
142
+ pub struct GraphQueryParser<'a> {
143
+ schema: &'a Schema,
131
144
  }
132
145
 
133
- impl GraphQueryParser {
134
- pub fn new() -> Self {
135
- Self { schema: Schema::new() }
146
+ impl<'a> GraphQueryParser<'a> {
147
+ pub fn new(schema: &'a Schema) -> Self {
148
+ Self { schema }
136
149
  }
137
150
 
138
151
  pub fn parse_bool(&self, query: BoolGraphQuery) -> Box<dyn Query> {
@@ -143,9 +156,10 @@ impl GraphQueryParser {
143
156
  match query {
144
157
  BooleanExpression::Literal(query) => self.parse(query),
145
158
  BooleanExpression::Not(subquery) => {
146
- let mut subqueries = vec![];
147
- subqueries.push((Occur::Must, Box::new(AllQuery) as Box<dyn Query>));
148
- subqueries.push((Occur::MustNot, self.inner_parse_bool(*subquery)));
159
+ let subqueries = vec![
160
+ (Occur::Must, Box::new(AllQuery) as Box<dyn Query>),
161
+ (Occur::MustNot, self.inner_parse_bool(*subquery)),
162
+ ];
149
163
  Box::new(BooleanQuery::new(subqueries))
150
164
  }
151
165
  BooleanExpression::Operation(operation) => {
@@ -180,9 +194,10 @@ impl GraphQueryParser {
180
194
  ))),
181
195
  },
182
196
  BooleanExpression::Not(subquery) => {
183
- let mut subqueries = vec![];
184
- subqueries.push((Occur::Must, Box::new(AllQuery) as Box<dyn Query>));
185
- subqueries.push((Occur::MustNot, self.inner_parse_bool_node(*subquery, position)));
197
+ let subqueries = vec![
198
+ (Occur::Must, Box::new(AllQuery) as Box<dyn Query>),
199
+ (Occur::MustNot, self.inner_parse_bool_node(*subquery, position)),
200
+ ];
186
201
  Box::new(BooleanQuery::new(subqueries))
187
202
  }
188
203
  BooleanExpression::Operation(operation) => {
@@ -247,7 +262,7 @@ impl GraphQueryParser {
247
262
  let mut subqueries = vec![];
248
263
 
249
264
  subqueries.extend(self.has_node_expression_as_source(&source_expression));
250
- subqueries.extend(self.has_relation(&relation_expression).into_iter());
265
+ subqueries.extend(self.has_relation(&relation_expression));
251
266
  subqueries.extend(self.has_node_expression_as_destination(&destination_expression));
252
267
 
253
268
  // Due to implementation details on tantivy, a query containing only MustNot won't
@@ -271,10 +286,18 @@ impl GraphQueryParser {
271
286
 
272
287
  #[inline]
273
288
  fn has_node_expression_as_source(&self, expression: &Expression<Node>) -> Vec<(Occur, Box<dyn Query>)> {
289
+ let value = if self.schema.version == 1 {
290
+ NodeValueField::Normalized(self.schema.normalized_source_value)
291
+ } else {
292
+ NodeValueField::Tokenized(TokenizedNodeFields {
293
+ exact: self.schema.normalized_source_value,
294
+ tokenized: self.schema.source_value,
295
+ })
296
+ };
274
297
  self.has_node_expression(
275
298
  expression,
276
299
  NodeSchemaFields {
277
- normalized_value: self.schema.normalized_source_value,
300
+ value,
278
301
  node_type: self.schema.source_type,
279
302
  node_subtype: self.schema.source_subtype,
280
303
  },
@@ -283,10 +306,18 @@ impl GraphQueryParser {
283
306
 
284
307
  #[inline]
285
308
  fn has_node_expression_as_destination(&self, expression: &Expression<Node>) -> Vec<(Occur, Box<dyn Query>)> {
309
+ let value = if self.schema.version == 1 {
310
+ NodeValueField::Normalized(self.schema.normalized_target_value)
311
+ } else {
312
+ NodeValueField::Tokenized(TokenizedNodeFields {
313
+ exact: self.schema.normalized_target_value,
314
+ tokenized: self.schema.target_value,
315
+ })
316
+ };
286
317
  self.has_node_expression(
287
318
  expression,
288
319
  NodeSchemaFields {
289
- normalized_value: self.schema.normalized_target_value,
320
+ value,
290
321
  node_type: self.schema.target_type,
291
322
  node_subtype: self.schema.target_subtype,
292
323
  },
@@ -315,16 +346,16 @@ impl GraphQueryParser {
315
346
  Expression::Not(query) => {
316
347
  // NOT granularity is a node, so we to use a Must { MustNot { X } } instead of
317
348
  // unnest it in multiple MustNot { x }
318
- let subquery: Box<dyn Query> = Box::new(BooleanQuery::intersection(self.has_node(&query, fields)));
349
+ let subquery: Box<dyn Query> = Box::new(BooleanQuery::intersection(self.has_node(query, fields)));
319
350
  queries.push((Occur::MustNot, subquery));
320
351
  }
321
352
  Expression::Or(nodes) => {
322
353
  // OR needs careful treatment. If there's only one node query matching, we can
323
354
  // behave as it was a Value(Node). Otherwise we need a nested query with its parts
324
355
  let mut subqueries: Vec<_> = nodes
325
- .into_iter()
356
+ .iter()
326
357
  .flat_map(|node| {
327
- let node_queries = self.has_node(&node, fields);
358
+ let node_queries = self.has_node(node, fields);
328
359
  if node_queries.is_empty() {
329
360
  // We don't care about nodes that match everything as they don't provide any
330
361
  // filtering value
@@ -346,7 +377,7 @@ impl GraphQueryParser {
346
377
  // When there's multiple nodes to match, we must do a nested query and force
347
378
  // that any of these matches
348
379
  let or_subqueries = subqueries.into_iter().map(|mut node_queries| {
349
- debug_assert!(node_queries.len() > 0, "already validated above");
380
+ debug_assert!(!node_queries.is_empty(), "already validated above");
350
381
  let node_query: (Occur, Box<dyn Query>) = if node_queries.len() == 1 {
351
382
  // To avoid a nested boolean query for a node matching only in
352
383
  // one field, we can directly add a subquery
@@ -372,7 +403,7 @@ impl GraphQueryParser {
372
403
  let value_query = node
373
404
  .value
374
405
  .as_ref()
375
- .and_then(|value| self.has_node_value(value, fields.normalized_value));
406
+ .and_then(|value| self.has_node_value(value, fields.value));
376
407
  if let Some(query) = value_query {
377
408
  subqueries.push(query);
378
409
  }
@@ -420,7 +451,7 @@ impl GraphQueryParser {
420
451
  }
421
452
 
422
453
  Expression::Or(relations) => {
423
- subqueries.extend(relations.into_iter().flat_map(|relation| {
454
+ subqueries.extend(relations.iter().flat_map(|relation| {
424
455
  if let Some(label) = &relation.value {
425
456
  if label.is_empty() {
426
457
  None
@@ -437,47 +468,79 @@ impl GraphQueryParser {
437
468
  subqueries
438
469
  }
439
470
 
440
- fn has_node_value(&self, value: &Term, field: Field) -> Option<Box<dyn Query>> {
441
- match value {
442
- Term::Exact(value) => {
443
- if value.is_empty() {
444
- return None;
471
+ fn has_node_value(&self, value: &Term, field: NodeValueField) -> Option<Box<dyn Query>> {
472
+ let text_value = match value {
473
+ Term::Exact(value) => value,
474
+ Term::Fuzzy(fuzzy) => &fuzzy.value,
475
+ };
476
+ if text_value.is_empty() {
477
+ return None;
478
+ }
479
+ let exact_term = match field {
480
+ NodeValueField::Normalized(field) => {
481
+ tantivy::Term::from_field_text(field, &self.schema.normalize(text_value))
482
+ }
483
+ NodeValueField::Tokenized(TokenizedNodeFields { exact, .. }) => {
484
+ tantivy::Term::from_field_text(exact, &self.schema.normalize(text_value))
485
+ }
486
+ };
487
+ let tokenized_terms = match field {
488
+ NodeValueField::Normalized(field) => {
489
+ vec![tantivy::Term::from_field_text(
490
+ field,
491
+ &self.schema.normalize(text_value),
492
+ )]
493
+ }
494
+ NodeValueField::Tokenized(TokenizedNodeFields { tokenized, .. }) => {
495
+ let mut tokenizer = TokenizerManager::default().get("default").unwrap();
496
+ let mut token_stream = tokenizer.token_stream(text_value);
497
+ let mut terms = Vec::new();
498
+ while let Some(token) = token_stream.next() {
499
+ terms.push(tantivy::Term::from_field_text(tokenized, &token.text));
445
500
  }
446
- let normalized_value = schema::normalize(&value);
447
- let query = Box::new(TermQuery::new(
448
- tantivy::Term::from_field_text(field, &normalized_value),
449
- IndexRecordOption::Basic,
450
- ));
451
- Some(query)
501
+ terms
452
502
  }
503
+ };
453
504
 
454
- Term::Fuzzy(fuzzy) => {
455
- let normalized_value = schema::normalize(&fuzzy.value);
456
- match fuzzy {
457
- FuzzyTerm { value, .. } if value.is_empty() => None,
458
-
459
- FuzzyTerm {
460
- fuzzy_distance: distance,
461
- is_prefix: true,
462
- ..
463
- } => Some(Box::new(FuzzyTermQuery::new_prefix(
464
- tantivy::Term::from_field_text(field, &normalized_value),
465
- *distance,
466
- true,
467
- ))),
468
-
469
- FuzzyTerm {
470
- fuzzy_distance: distance,
471
- is_prefix: false,
472
- ..
473
- } => Some(Box::new(FuzzyTermQuery::new(
474
- tantivy::Term::from_field_text(field, &normalized_value),
475
- *distance,
476
- true,
477
- ))),
505
+ // TODO: Rethink this
506
+ // Current logic:
507
+ // - Exact match always match the search term against the full field
508
+ // - Fuzzy + prefix search works does a prefix fuzzy match of the whole entity name
509
+ // - Fuzzy search looks for entities containing all words in the term with a fuzzy match (tokenized)
510
+ //
511
+ // Questions:
512
+ // - Do we want exact match of a word in the entity? (kind of supported by setting fuzzy distance = 0)
513
+ let query: Box<dyn Query> = match value {
514
+ Term::Exact(_) => Box::new(TermQuery::new(exact_term, IndexRecordOption::Basic)),
515
+ Term::Fuzzy(fuzzy) => match fuzzy {
516
+ FuzzyTerm {
517
+ fuzzy_distance,
518
+ is_prefix: true,
519
+ ..
520
+ } => Box::new(FuzzyTermQuery::new_prefix(exact_term, *fuzzy_distance, true)),
521
+
522
+ FuzzyTerm { fuzzy_distance, .. } => {
523
+ if tokenized_terms.len() > 1 {
524
+ Box::new(BooleanQuery::intersection(
525
+ tokenized_terms
526
+ .into_iter()
527
+ .map(|term| -> Box<dyn Query> {
528
+ Box::new(FuzzyTermQuery::new(term, *fuzzy_distance, true))
529
+ })
530
+ .collect(),
531
+ ))
532
+ } else {
533
+ Box::new(FuzzyTermQuery::new(
534
+ tokenized_terms.into_iter().next().unwrap(),
535
+ *fuzzy_distance,
536
+ true,
537
+ ))
538
+ }
478
539
  }
479
- }
480
- }
540
+ },
541
+ };
542
+
543
+ Some(query)
481
544
  }
482
545
 
483
546
  fn has_node_type(&self, node_type: NodeType, field: Field) -> Box<dyn Query> {
@@ -497,7 +560,7 @@ impl GraphQueryParser {
497
560
 
498
561
  fn has_relation_label(&self, label: &str) -> Box<dyn Query> {
499
562
  Box::new(TermQuery::new(
500
- tantivy::Term::from_field_text(self.schema.label, &label),
563
+ tantivy::Term::from_field_text(self.schema.label, label),
501
564
  IndexRecordOption::Basic,
502
565
  ))
503
566
  }
@@ -533,7 +596,7 @@ impl TryFrom<&nidx_protos::graph_query::PathQuery> for BoolNodeQuery {
533
596
  if !(path.source.is_some()
534
597
  && path.relation.is_none()
535
598
  && path.destination.is_none()
536
- && path.undirected == true)
599
+ && path.undirected)
537
600
  {
538
601
  // We are doing something wrong between search API and nidx
539
602
  return Err(anyhow!(
@@ -664,7 +727,7 @@ impl TryFrom<&nidx_protos::graph_query::Node> for Node {
664
727
  let value = node_pb.value.clone().map(|value| match node_pb.match_kind() {
665
728
  nidx_protos::graph_query::node::MatchKind::Exact => Term::Exact(value),
666
729
  nidx_protos::graph_query::node::MatchKind::Fuzzy => Term::Fuzzy(FuzzyTerm {
667
- value: value,
730
+ value,
668
731
  fuzzy_distance: DEFAULT_NODE_VALUE_FUZZY_DISTANCE,
669
732
  is_prefix: true,
670
733
  }),
@@ -18,13 +18,14 @@
18
18
  // along with this program. If not, see <http://www.gnu.org/licenses/>.
19
19
  //
20
20
 
21
- use nidx_protos::prost::*;
22
21
  use nidx_protos::relation::RelationType;
23
22
  use nidx_protos::relation_node::NodeType;
23
+ use nidx_protos::{IndexRelation, prost::*};
24
24
  use nidx_protos::{Relation as ProtosRelation, RelationMetadata, RelationNode};
25
25
  use tantivy::TantivyDocument;
26
+ use tantivy::schema::Value;
26
27
 
27
- use crate::schema::Schema;
28
+ use crate::schema::{Schema, decode_field_id};
28
29
 
29
30
  pub fn decode_metadata(schema: &Schema, doc: &TantivyDocument) -> Option<RelationMetadata> {
30
31
  schema
@@ -108,6 +109,28 @@ pub fn doc_to_relation(schema: &Schema, doc: &TantivyDocument) -> ProtosRelation
108
109
  }
109
110
  }
110
111
 
112
+ pub fn doc_to_index_relation(schema: &Schema, doc: &TantivyDocument) -> IndexRelation {
113
+ let resource_field_id = schema.resource_field_id.and_then(|f| {
114
+ doc.get_first(f).map(|v| {
115
+ let (rid, fid) = decode_field_id(v.as_bytes().unwrap());
116
+ format!("{}/{}", rid.simple(), fid)
117
+ })
118
+ });
119
+ let facets = schema
120
+ .facets
121
+ .map(|field| {
122
+ doc.get_all(field)
123
+ .map(|f| f.as_facet().unwrap().to_path_string())
124
+ .collect()
125
+ })
126
+ .unwrap_or_default();
127
+ IndexRelation {
128
+ relation: Some(doc_to_relation(schema, doc)),
129
+ resource_field_id,
130
+ facets,
131
+ }
132
+ }
133
+
111
134
  pub fn doc_to_graph_relation(schema: &Schema, doc: &TantivyDocument) -> nidx_protos::graph_search_response::Relation {
112
135
  nidx_protos::graph_search_response::Relation {
113
136
  relation_type: u64_to_relation_type::<i32>(schema.relationship(doc)),
@@ -38,6 +38,8 @@ use nidx_types::OpenIndexMetadata;
38
38
  use reader::{HashedRelationNode, RelationsReaderService};
39
39
  use resource_indexer::index_relations;
40
40
  pub use schema::Schema as RelationSchema;
41
+ use schema::encode_field_id;
42
+ use serde::{Deserialize, Serialize};
41
43
  use std::{collections::HashSet, path::Path};
42
44
  use tantivy::{
43
45
  Term,
@@ -46,26 +48,77 @@ use tantivy::{
46
48
  query::{Query, TermSetQuery},
47
49
  schema::Field,
48
50
  };
49
- use tracing::instrument;
51
+ use tracing::{error, instrument};
52
+ use uuid::Uuid;
50
53
 
51
54
  /// Minimum length for a word to be accepted as a entity to search for
52
55
  /// suggestions. Low values can provide too much noise and higher ones can
53
56
  /// remove important words from suggestion
54
57
  const MIN_SUGGEST_PREFIX_LENGTH: usize = 2;
55
58
 
59
+ #[derive(Debug, Serialize, Deserialize, Clone)]
60
+ pub struct RelationConfig {
61
+ #[serde(default = "default_version")]
62
+ pub version: u64,
63
+ }
64
+
65
+ impl Default for RelationConfig {
66
+ fn default() -> Self {
67
+ Self {
68
+ // This is the default version when creating a new index.
69
+ // Should typically be set to the latest supported version
70
+ version: 1,
71
+ }
72
+ }
73
+ }
74
+
75
+ // This is the default version when reading from serde, i.e: no info on database
76
+ // This should always be 1
77
+ fn default_version() -> u64 {
78
+ 1
79
+ }
80
+
56
81
  pub struct RelationIndexer;
57
82
 
58
- pub struct RelationDeletionQueryBuilder(Field);
83
+ pub struct RelationDeletionQueryBuilder {
84
+ resource: Field,
85
+ field: Option<Field>,
86
+ }
59
87
  impl DeletionQueryBuilder for RelationDeletionQueryBuilder {
60
88
  fn query<'a>(&self, keys: impl Iterator<Item = &'a String>) -> Box<dyn Query> {
61
- Box::new(TermSetQuery::new(
62
- keys.map(|k| Term::from_field_bytes(self.0, k.as_bytes())),
63
- ))
89
+ if let Some(field) = self.field {
90
+ Box::new(TermSetQuery::new(keys.filter_map(|k| {
91
+ // Our keys can be resource or field ids, match the corresponding tantivy field
92
+ if k.len() < 32 {
93
+ error!(?k, "Invalid deletion key for nidx_relation");
94
+ return None;
95
+ }
96
+
97
+ let Ok(rid) = Uuid::parse_str(&k[..32]) else {
98
+ error!(?k, "Invalid deletion key for nidx_relation");
99
+ return None;
100
+ };
101
+
102
+ let is_field = k.len() > 32;
103
+ if is_field {
104
+ Some(Term::from_field_bytes(field, &encode_field_id(rid, &k[33..])))
105
+ } else {
106
+ Some(Term::from_field_bytes(self.resource, rid.as_bytes()))
107
+ }
108
+ })))
109
+ } else {
110
+ Box::new(TermSetQuery::new(
111
+ keys.map(|k| Term::from_field_bytes(self.resource, k.as_bytes())),
112
+ ))
113
+ }
64
114
  }
65
115
  }
66
116
  impl RelationDeletionQueryBuilder {
67
117
  fn new(schema: &RelationSchema) -> Self {
68
- RelationDeletionQueryBuilder(schema.resource_id)
118
+ RelationDeletionQueryBuilder {
119
+ resource: schema.resource_id,
120
+ field: schema.resource_field_id,
121
+ }
69
122
  }
70
123
  }
71
124
 
@@ -74,9 +127,10 @@ impl RelationIndexer {
74
127
  pub fn index_resource(
75
128
  &self,
76
129
  output_dir: &Path,
130
+ config: &RelationConfig,
77
131
  resource: &nidx_protos::Resource,
78
132
  ) -> anyhow::Result<Option<TantivySegmentMetadata>> {
79
- let field_schema = RelationSchema::new();
133
+ let field_schema = RelationSchema::new(config.version);
80
134
  let mut indexer = TantivyIndexer::new(output_dir.to_path_buf(), field_schema.schema.clone())?;
81
135
 
82
136
  if resource.status == ResourceStatus::Delete as i32 {
@@ -87,17 +141,27 @@ impl RelationIndexer {
87
141
  indexer.finalize()
88
142
  }
89
143
 
90
- pub fn deletions_for_resource(&self, resource: &nidx_protos::Resource) -> Vec<String> {
91
- vec![resource.resource.as_ref().unwrap().uuid.clone()]
144
+ pub fn deletions_for_resource(&self, config: &RelationConfig, resource: &nidx_protos::Resource) -> Vec<String> {
145
+ if config.version == 2 {
146
+ let rid = &resource.resource.as_ref().unwrap().uuid;
147
+ resource
148
+ .relation_fields_to_delete
149
+ .iter()
150
+ .map(|f| format!("{rid}/{f}"))
151
+ .collect()
152
+ } else {
153
+ vec![resource.resource.as_ref().unwrap().uuid.clone()]
154
+ }
92
155
  }
93
156
 
94
157
  #[instrument(name = "relation::merge", skip_all)]
95
158
  pub fn merge(
96
159
  &self,
97
160
  work_dir: &Path,
161
+ config: RelationConfig,
98
162
  open_index: impl OpenIndexMetadata<TantivyMeta>,
99
163
  ) -> anyhow::Result<TantivySegmentMetadata> {
100
- let schema = RelationSchema::new();
164
+ let schema = RelationSchema::new(config.version);
101
165
  let deletions_query = RelationDeletionQueryBuilder::new(&schema);
102
166
  let index = open_index_with_deletions(schema.schema, open_index, deletions_query)?;
103
167
 
@@ -120,15 +184,15 @@ pub struct RelationSearcher {
120
184
 
121
185
  impl RelationSearcher {
122
186
  #[instrument(name = "relation::open", skip_all)]
123
- pub fn open(open_index: impl OpenIndexMetadata<TantivyMeta>) -> anyhow::Result<Self> {
124
- let schema = RelationSchema::new();
187
+ pub fn open(config: RelationConfig, open_index: impl OpenIndexMetadata<TantivyMeta>) -> anyhow::Result<Self> {
188
+ let schema = RelationSchema::new(config.version);
125
189
  let deletions_query = RelationDeletionQueryBuilder::new(&schema);
126
190
  let index = open_index_with_deletions(schema.schema, open_index, deletions_query)?;
127
191
 
128
192
  Ok(Self {
129
193
  reader: RelationsReaderService {
130
194
  index: index.clone(),
131
- schema: RelationSchema::new(),
195
+ schema: RelationSchema::new(config.version),
132
196
  reader: index
133
197
  .reader_builder()
134
198
  .reload_policy(tantivy::ReloadPolicy::Manual)