nidx-binding 6.3.1.post23__tar.gz → 6.3.1.post26__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 (242) hide show
  1. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/PKG-INFO +1 -1
  2. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_protos/pyproject.toml +1 -1
  3. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/pyproject.toml +1 -1
  4. nidx_binding-6.3.1.post26/src/searcher/query_language.rs +123 -0
  5. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/searcher/query_planner.rs +23 -31
  6. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/searcher/shard_suggest.rs +2 -16
  7. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/tests/test_date_range_search.rs +90 -28
  8. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/tests/test_search_filtering.rs +79 -27
  9. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/tests/test_suggest.rs +30 -21
  10. nidx_binding-6.3.1.post23/src/searcher/query_language.rs +0 -584
  11. nidx_binding-6.3.1.post23/src/searcher/query_planner/old_filter_compatibility.rs +0 -212
  12. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-0cfce9b29547f8f5bafa6e440f86103be7b8c4ad2fd92db9ac223f4efbe23d10.json +0 -0
  13. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-1a561eed00f3dbe868bf5030059793300209179dc8fb73e4b57a54b5e81262fe.json +0 -0
  14. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-1d3fca2682e25a01143da92285297f134a6a105a96f64d87e0db3abb219855e4.json +0 -0
  15. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-249b3b57c27a71baa823f1fe0f0bba9c9af36f61c28f731e58beea60ec48e687.json +0 -0
  16. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-24cb6b683daa42d7125f862e25943ab4be7bf275cd8739f8da4859d701795e1a.json +0 -0
  17. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-263c8fce6db5b03bbd012fafdba6943cbee6ed7eb8976cdef4f5b01dde7ca6fd.json +0 -0
  18. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-2a5d92fb1638df830a4477a7cdf24e6db6b43034b7bbe74fdfb63e8afe2c4071.json +0 -0
  19. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-2b065a363f58caed60e3706603c1260dbf5a4c795604a5b68edda22eb07fec1b.json +0 -0
  20. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-3fc3cb39934683de8cd475ce1368c8373453eb1e01f81587d66b9d14b109ce6e.json +0 -0
  21. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-48f33b77b7c1633467b0b2efcaa1d3c207e7757e4f1d83b40d15e6ca365f7771.json +0 -0
  22. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-4ae09f2c08e2f324bee01bb8487a8f37678a1c5e9d327339235c50d4921a8949.json +0 -0
  23. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-4d7a76fa413c9ef0ce2a47ac7bb7e01d3e6a2aabded9487d21010a53efee8852.json +0 -0
  24. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-4fcbdd6657c7dc9b60b3a563dd41711b3dbcf72ce063427b7a01f8cddf34c244.json +0 -0
  25. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-577109ac00ccfbd38ecaccab94116f2f46a4caf5612afa372cded197123c1e08.json +0 -0
  26. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-5db25f97d8578d6d78f2f6bd4b72cc82a9b1b82805c6422d967ac63b20d99db4.json +0 -0
  27. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-5ec3233a3a23e926055056d46bdde17836a633066dbb5f349502648cd3ea9a60.json +0 -0
  28. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-66edb6ea424d8681927dcddb6bac5f1239175f4775d1f40417ba15054b0c6f19.json +0 -0
  29. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-6f9c6d201c1b5712efb68c363bffd3e0169c11f2a8f925e8cd4e8808599ff7b4.json +0 -0
  30. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-733c3ebacc86f444bf5e2dd79ade660c291e88a00fc09b722f6e2e191545874c.json +0 -0
  31. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-77a245aed9f6f8b9fc643efbd4b1e2e8e99bbba085e3e75a4f29321cd7b2a25c.json +0 -0
  32. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-7a3bf27c330c468a596e8a297cf7d8b192e31e67ecc5177c1267f579e8e247c7.json +0 -0
  33. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-7a7e59e47b30b12237511fd3d7da2d17b0471ad2b006af48d6a6f587c779692b.json +0 -0
  34. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-7dcbb33312cc9f11ae3a6d73b1ace017a9f19a8bf8f10304fc57977c8efeadff.json +0 -0
  35. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-7efa7c0d747afc4b6aed0586ff846c27839c3213ff7ee9f30c89b0d0f17e60e3.json +0 -0
  36. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-8493140d788604d498a4e48da4158708572ccc9d60185290a00d549cc84533db.json +0 -0
  37. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-8493bb0059b013eaca42fd10cd7d04f0d06a8acaed379eff0d23f3229edde9ee.json +0 -0
  38. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-87996b3d6c7a2195438d7038015b06949102bce8c7b8cd8db1f83aaf23cbe489.json +0 -0
  39. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-8f096d8171b89f9615d18f95d696dc9e4fb3674e103161a713cdc806f7a68506.json +0 -0
  40. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-917732a56ee04bf3a6e127319dda8225210869c82f9828d878162394dba4e078.json +0 -0
  41. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-95fe4ef93ee90733db1b67ed7987f80b5aac792f1590b979c68b418d1599eb98.json +0 -0
  42. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-9b67658569b343d8b4b61ae0a7dc721f367f2ba33c7b69b9e68bfd5c9bff5206.json +0 -0
  43. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-9c8062ea55d070afef68309e58fa987eb37fda44e1efbf68c8ba2af7846cc968.json +0 -0
  44. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-a06e1d9f6f95e4c4c2b98310ebddcc9d963cc033582bf2e945e8bf3a301b4247.json +0 -0
  45. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-a55265c9b07bd1399961a6f1e757201fd0eebe868ddaf96437111113d80fce92.json +0 -0
  46. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-a891a37be5c2d7cce775c2dd33726b0318fd3839beab222a1b22bc6174604207.json +0 -0
  47. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-a945191bb4b3e37d6823ed3ad499339d007d69983105de8567777d9daf517b28.json +0 -0
  48. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-abe9f7832f2bd799ac44008da031e8d8ab52d4f5fbfc2a7e3974e8873bae55b2.json +0 -0
  49. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-aca588cca57a85e4d7fcc40c23cd87e57d53d11ca550d78e7e3d5e39e524fcd3.json +0 -0
  50. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-b02f8aafc00a7724510772ac41269e368c5bccf03ef7b4590e0ef6fd1a1bf64f.json +0 -0
  51. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-b742e17cabe2d64617e9aa64bafc782172f7a4f8023d1b54f952a0fb39f6b2b8.json +0 -0
  52. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-b94e349dbc0daec57f8f8f6e9e2dffb06100b1bb2b41d297c9f3b191da37a83d.json +0 -0
  53. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-bd9afa22994aba671dbf7b5f89b53c2ee02f53c0442a81265786a6d52d08512f.json +0 -0
  54. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-be60554eca98a5899efc6b49785cecd6444a6d39afed9e4a884ce2dbf162012c.json +0 -0
  55. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-bf49702b506c9a1650ece1f8e8d9f14834a902f8caefafe30ded55e2790f2188.json +0 -0
  56. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-bfb8ae2e860e451b0868a7b1b50a451d998b2105f9fdfd307b26a1775d145e9f.json +0 -0
  57. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-bfcd21ed704cd305db5c17fcdec7d92aa4ac501913c9c9514d8ff92928c0c7e7.json +0 -0
  58. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-c3ab694650f49a75b146fb877a92e48c4f20f0d99f70f8ec859fbb763b01a1e5.json +0 -0
  59. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-c55542bb9fae544d87fae6f30e0fe8a9088d12075f4442ab4fe2fcd05e472234.json +0 -0
  60. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-cb29a6556d35ac630ee0aa885dd7341cf9573bd3efd216ff8a887b87686b03db.json +0 -0
  61. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-d0a1f341a89f5f14696b10baa72db9d95551c2b7e5fc67308fd52dc03dd98a92.json +0 -0
  62. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-d2ad0a0ca2649c9e4873cfcc1fc66d2d07cc45d0f65c560b06d7b5f592f4fa8a.json +0 -0
  63. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-d6cfe78eb635ba0b89ca4021a4dc8182d18ab5b197f30149cd28488eba4c1df5.json +0 -0
  64. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-d729b56dea00e49dcdba8cf0001e2811da27351eabe98212db3b589f18fc6f32.json +0 -0
  65. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-d9658bfd4e7170b41d03f2ddf2446d0bf54171c0d39d53bf20af2b8437f2ec48.json +0 -0
  66. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-dbba7b3d3289425bae711aedbf73fbc3699f857f86f84d95c3b556d05c5658b0.json +0 -0
  67. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-dcb96b649d6d63a58efd5d445453a4f3d7869a56ff714b69bedf3d616a0473ca.json +0 -0
  68. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-ebd876fbf5362a5900e75bc05f2f11c73c406ef7da4e95097fc6a1c3d1b8bc54.json +0 -0
  69. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-eef5cc6bce1cc14eba8f3e68971724ef181e88cffcedd74673615f2026b89a62.json +0 -0
  70. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/.sqlx/query-ef56d5fefc5774040d1ee397beadb475f6af02768c22f0e583c74062e2e821ce.json +0 -0
  71. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/Cargo.lock +0 -0
  72. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/Cargo.toml +0 -0
  73. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/README.md +0 -0
  74. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/migrations/20241007163501_initial.sql +0 -0
  75. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/migrations/20241211120039_merge_job_priority.sql +0 -0
  76. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/migrations/20241211121159_basic_indexes.sql +0 -0
  77. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/migrations/20241212151105_check_segment_records.sql +0 -0
  78. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/migrations/20250110145554_in_flight_messages.sql +0 -0
  79. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_binding/Cargo.toml +0 -0
  80. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_binding/src/lib.rs +0 -0
  81. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/Cargo.toml +0 -0
  82. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/src/fuzzy_query.rs +0 -0
  83. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/src/lib.rs +0 -0
  84. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/src/query_io.rs +0 -0
  85. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/src/reader.rs +0 -0
  86. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/src/request_types.rs +0 -0
  87. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/src/resource_indexer.rs +0 -0
  88. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/src/schema.rs +0 -0
  89. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/src/search_query.rs +0 -0
  90. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/src/search_response.rs +0 -0
  91. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/src/set_query.rs +0 -0
  92. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/src/stop_words.rs +0 -0
  93. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/README.md +0 -0
  94. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/ar.json +0 -0
  95. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/az.json +0 -0
  96. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/bn.json +0 -0
  97. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/ca.json +0 -0
  98. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/ch.json +0 -0
  99. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/da.json +0 -0
  100. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/de.json +0 -0
  101. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/el.json +0 -0
  102. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/en.json +0 -0
  103. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/es.json +0 -0
  104. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/eu.json +0 -0
  105. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/extract.py +0 -0
  106. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/fi.json +0 -0
  107. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/fr.json +0 -0
  108. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/he.json +0 -0
  109. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/hu.json +0 -0
  110. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/id.json +0 -0
  111. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/it.json +0 -0
  112. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/kk.json +0 -0
  113. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/ne.json +0 -0
  114. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/nl.json +0 -0
  115. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/no.json +0 -0
  116. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/pt.json +0 -0
  117. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/ro.json +0 -0
  118. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/ru.json +0 -0
  119. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/sl.json +0 -0
  120. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/sv.json +0 -0
  121. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/tg.json +0 -0
  122. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/stop_words/tr.json +0 -0
  123. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/tests/common/mod.rs +0 -0
  124. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_paragraph/tests/reader.rs +0 -0
  125. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_protos/Cargo.toml +0 -0
  126. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_protos/build.py +0 -0
  127. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_protos/build.rs +0 -0
  128. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_protos/src/lib.rs +0 -0
  129. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_protos/src/nidx.proto +0 -0
  130. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_relation/Cargo.toml +0 -0
  131. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_relation/src/graph_query_parser.rs +0 -0
  132. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_relation/src/io_maps.rs +0 -0
  133. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_relation/src/lib.rs +0 -0
  134. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_relation/src/reader.rs +0 -0
  135. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_relation/src/resource_indexer.rs +0 -0
  136. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_relation/src/schema.rs +0 -0
  137. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_relation/tests/common/mod.rs +0 -0
  138. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_relation/tests/test_graph_search.rs +0 -0
  139. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_relation/tests/test_reader.rs +0 -0
  140. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_relation/tests/test_writer.rs +0 -0
  141. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_tantivy/Cargo.toml +0 -0
  142. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_tantivy/src/index_reader.rs +0 -0
  143. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_tantivy/src/lib.rs +0 -0
  144. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_tests/Cargo.toml +0 -0
  145. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_tests/src/lib.rs +0 -0
  146. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_text/Cargo.toml +0 -0
  147. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_text/src/lib.rs +0 -0
  148. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_text/src/prefilter.rs +0 -0
  149. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_text/src/query_io.rs +0 -0
  150. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_text/src/reader.rs +0 -0
  151. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_text/src/request_types.rs +0 -0
  152. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_text/src/resource_indexer.rs +0 -0
  153. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_text/src/schema.rs +0 -0
  154. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_text/src/search_query.rs +0 -0
  155. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_text/tests/common/mod.rs +0 -0
  156. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_text/tests/test_flow.rs +0 -0
  157. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_text/tests/test_search.rs +0 -0
  158. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_text/tests/test_streaming.rs +0 -0
  159. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_types/Cargo.toml +0 -0
  160. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_types/src/lib.rs +0 -0
  161. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_types/src/prefilter.rs +0 -0
  162. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_types/src/query_language.rs +0 -0
  163. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/Cargo.toml +0 -0
  164. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/src/config.rs +0 -0
  165. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/src/data_point/disk_hnsw.rs +0 -0
  166. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/src/data_point/mod.rs +0 -0
  167. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/src/data_point/node.rs +0 -0
  168. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/src/data_point/ops_hnsw.rs +0 -0
  169. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/src/data_point/params.rs +0 -0
  170. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/src/data_point/ram_hnsw.rs +0 -0
  171. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/src/data_point/tests.rs +0 -0
  172. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/src/data_point_provider/mod.rs +0 -0
  173. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/src/data_point_provider/reader.rs +0 -0
  174. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/src/data_types/data_store.rs +0 -0
  175. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/src/data_types/mod.rs +0 -0
  176. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/src/data_types/trie.rs +0 -0
  177. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/src/data_types/trie_ram.rs +0 -0
  178. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/src/formula/mod.rs +0 -0
  179. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/src/indexer.rs +0 -0
  180. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/src/inverted_index/fst_index.rs +0 -0
  181. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/src/inverted_index/map.rs +0 -0
  182. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/src/inverted_index.rs +0 -0
  183. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/src/lib.rs +0 -0
  184. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/src/query_io.rs +0 -0
  185. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/src/request_types.rs +0 -0
  186. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/src/utils.rs +0 -0
  187. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/src/vector_types/dense_f32.rs +0 -0
  188. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/src/vector_types/mod.rs +0 -0
  189. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/tests/common/mod.rs +0 -0
  190. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/tests/test_basic_search.rs +0 -0
  191. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/nidx_vector/tests/test_hidden.rs +0 -0
  192. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/api/grpc.rs +0 -0
  193. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/api/shards.rs +0 -0
  194. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/api.rs +0 -0
  195. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/control.rs +0 -0
  196. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/errors.rs +0 -0
  197. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/grpc_server.rs +0 -0
  198. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/import_export.rs +0 -0
  199. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/indexer.rs +0 -0
  200. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/lib.rs +0 -0
  201. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/main.rs +0 -0
  202. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/metadata/deletion.rs +0 -0
  203. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/metadata/index.rs +0 -0
  204. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/metadata/index_request.rs +0 -0
  205. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/metadata/merge_job.rs +0 -0
  206. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/metadata/segment.rs +0 -0
  207. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/metadata/shard.rs +0 -0
  208. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/metadata.rs +0 -0
  209. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/metrics.rs +0 -0
  210. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/scheduler/audit_task.rs +0 -0
  211. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/scheduler/log_merge.rs +0 -0
  212. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/scheduler/merge_task.rs +0 -0
  213. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/scheduler/metrics_task.rs +0 -0
  214. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/scheduler/purge_tasks.rs +0 -0
  215. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/scheduler/vector_merge.rs +0 -0
  216. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/scheduler.rs +0 -0
  217. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/searcher/grpc.rs +0 -0
  218. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/searcher/index_cache.rs +0 -0
  219. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/searcher/shard_search.rs +0 -0
  220. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/searcher/shard_selector.rs +0 -0
  221. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/searcher/streams.rs +0 -0
  222. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/searcher/sync.rs +0 -0
  223. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/searcher.rs +0 -0
  224. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/segment_store.rs +0 -0
  225. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/settings.rs +0 -0
  226. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/telemetry/duration_layer.rs +0 -0
  227. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/telemetry/log_format.rs +0 -0
  228. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/telemetry/middleware.rs +0 -0
  229. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/telemetry.rs +0 -0
  230. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/tool.rs +0 -0
  231. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/src/worker.rs +0 -0
  232. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/tests/common/mod.rs +0 -0
  233. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/tests/common/services.rs +0 -0
  234. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/tests/test_search_relations.rs +0 -0
  235. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/tests/test_search_sorting.rs +0 -0
  236. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/tests/test_searcher_cluster.rs +0 -0
  237. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/tests/test_security_search.rs +0 -0
  238. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/tests/test_shards.rs +0 -0
  239. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/tests/test_shards_api.rs +0 -0
  240. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/tests/test_synced_searcher.rs +0 -0
  241. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/tests/test_vector_normalization.rs +0 -0
  242. {nidx_binding-6.3.1.post23 → nidx_binding-6.3.1.post26}/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.1.post23
3
+ Version: 6.3.1.post26
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.1.post23"
7
+ version = "6.3.1.post26"
8
8
  license = { text = "AGPL" }
9
9
  description = "Protobuf definitions for nucliadb/nidx"
10
10
  authors = [ { name = "Nuclia", email = "nucliadb@nuclia.com" }]
@@ -13,7 +13,7 @@ classifiers = [
13
13
  "Programming Language :: Python :: Implementation :: CPython",
14
14
  "Programming Language :: Python :: Implementation :: PyPy",
15
15
  ]
16
- version = "6.3.1.post23"
16
+ version = "6.3.1.post26"
17
17
 
18
18
  [project.urls]
19
19
  Homepage = "https://nuclia.com"
@@ -0,0 +1,123 @@
1
+ // Copyright (C) 2021 Bosutech XXI S.L.
2
+ //
3
+ // nucliadb is offered under the AGPL v3.0 and as commercial software.
4
+ // For commercial licensing, contact us at info@nuclia.com.
5
+ //
6
+ // AGPL:
7
+ // This program is free software: you can redistribute it and/or modify
8
+ // it under the terms of the GNU Affero General Public License as
9
+ // published by the Free Software Foundation, either version 3 of the
10
+ // License, or (at your option) any later version.
11
+ //
12
+ // This program is distributed in the hope that it will be useful,
13
+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ // GNU Affero General Public License for more details.
16
+ //
17
+ // You should have received a copy of the GNU Affero General Public License
18
+ // along with this program. If not, see <http://www.gnu.org/licenses/>.
19
+
20
+ use nidx_protos::{
21
+ filter_expression::{Expr, FacetFilter, FilterExpressionList},
22
+ FilterExpression,
23
+ };
24
+ use nidx_types::query_language::*;
25
+
26
+ /// Extract an expression only involving some labels if it's an AND subset of the total expression
27
+ pub fn extract_label_filters(expression: &FilterExpression, labels: &[&str]) -> Option<BooleanExpression> {
28
+ match expression.expr.as_ref().unwrap() {
29
+ Expr::Facet(FacetFilter {
30
+ facet,
31
+ }) if labels.contains(&facet.as_str()) => Some(BooleanExpression::Literal(facet.clone())),
32
+ Expr::BoolNot(not_expr) => {
33
+ extract_label_filters(not_expr.as_ref(), labels).map(|e| BooleanExpression::Not(Box::new(e)))
34
+ }
35
+ Expr::BoolAnd(FilterExpressionList {
36
+ operands,
37
+ }) => {
38
+ let relevant: Vec<_> = operands.iter().filter_map(|e| extract_label_filters(e, labels)).collect();
39
+ match &relevant[..] {
40
+ [] => None,
41
+ [expression] => Some(expression.clone()),
42
+ _ => Some(BooleanExpression::Operation(BooleanOperation {
43
+ operator: Operator::And,
44
+ operands: relevant,
45
+ })),
46
+ }
47
+ }
48
+ _ => None,
49
+ }
50
+ }
51
+
52
+ #[cfg(test)]
53
+ mod tests {
54
+ use super::*;
55
+
56
+ #[test]
57
+ fn test_extract_label_filters() {
58
+ const LABELS: &[&str] = &["/v", "/w"];
59
+
60
+ let a = FilterExpression {
61
+ expr: Some(Expr::Facet(FacetFilter {
62
+ facet: "/a".into(),
63
+ })),
64
+ };
65
+ let v = FilterExpression {
66
+ expr: Some(Expr::Facet(FacetFilter {
67
+ facet: "/v".into(),
68
+ })),
69
+ };
70
+ let w = FilterExpression {
71
+ expr: Some(Expr::Facet(FacetFilter {
72
+ facet: "/w".into(),
73
+ })),
74
+ };
75
+
76
+ let not = |e| FilterExpression {
77
+ expr: Some(Expr::BoolNot(Box::new(e))),
78
+ };
79
+
80
+ // Literal
81
+ assert_eq!(extract_label_filters(&a, LABELS), None);
82
+ assert_eq!(extract_label_filters(&v, LABELS), Some(BooleanExpression::Literal("/v".into())));
83
+
84
+ // Not literal
85
+ assert_eq!(extract_label_filters(&not(a.clone()), LABELS), None);
86
+
87
+ assert_eq!(
88
+ extract_label_filters(&not(v.clone()), LABELS),
89
+ Some(BooleanExpression::Not(Box::new(BooleanExpression::Literal("/v".into()))))
90
+ );
91
+
92
+ // Or (not supported)
93
+ let or_expr = FilterExpression {
94
+ expr: Some(Expr::BoolOr(FilterExpressionList {
95
+ operands: vec![a.clone(), v.clone(), not(w.clone())],
96
+ })),
97
+ };
98
+ assert_eq!(extract_label_filters(&or_expr, LABELS), None);
99
+
100
+ // And
101
+ let expr = FilterExpression {
102
+ expr: Some(Expr::BoolAnd(FilterExpressionList {
103
+ operands: vec![a.clone(), v.clone(), not(w.clone())],
104
+ })),
105
+ };
106
+ let expected = BooleanExpression::Operation(BooleanOperation {
107
+ operator: Operator::And,
108
+ operands: vec![
109
+ BooleanExpression::Literal("/v".into()),
110
+ BooleanExpression::Not(Box::new(BooleanExpression::Literal("/w".into()))),
111
+ ],
112
+ });
113
+ assert_eq!(extract_label_filters(&expr, LABELS), Some(expected));
114
+
115
+ // Nested
116
+ let expr = FilterExpression {
117
+ expr: Some(Expr::BoolAnd(FilterExpressionList {
118
+ operands: vec![a, v, or_expr],
119
+ })),
120
+ };
121
+ assert_eq!(extract_label_filters(&expr, LABELS), Some(BooleanExpression::Literal("/v".into())));
122
+ }
123
+ }
@@ -27,12 +27,9 @@ use nidx_types::prefilter::PrefilterResult;
27
27
  use nidx_types::query_language::*;
28
28
  use nidx_vector::VectorSearchRequest;
29
29
  use nidx_vector::SEGMENT_TAGS;
30
- use old_filter_compatibility::filter_from_search_request;
31
30
 
32
31
  use super::query_language::extract_label_filters;
33
32
 
34
- pub mod old_filter_compatibility;
35
-
36
33
  /// The queries a [`QueryPlan`] has decided to send to each index.
37
34
  #[derive(Default, Clone)]
38
35
  pub struct IndexQueries {
@@ -67,19 +64,7 @@ pub struct QueryPlan {
67
64
  pub index_queries: IndexQueries,
68
65
  }
69
66
 
70
- pub fn build_query_plan(mut search_request: SearchRequest) -> anyhow::Result<QueryPlan> {
71
- // Backwards compatibility with old filters
72
- let (field_filter, paragraph_filter) = filter_from_search_request(&search_request)?;
73
- let has_old_filters = field_filter.is_some() || paragraph_filter.is_some();
74
- let has_new_filters = search_request.field_filter.is_some() || search_request.paragraph_filter.is_some();
75
- if has_old_filters && has_new_filters {
76
- return Err(anyhow::anyhow!("Cannot specify old and new filters in the same request"));
77
- }
78
- if has_old_filters {
79
- search_request.field_filter = field_filter;
80
- search_request.paragraph_filter = paragraph_filter;
81
- }
82
-
67
+ pub fn build_query_plan(search_request: SearchRequest) -> anyhow::Result<QueryPlan> {
83
68
  let relations_request = compute_relations_request(&search_request);
84
69
  let texts_request = compute_texts_request(&search_request);
85
70
  let vectors_request = compute_vectors_request(&search_request)?;
@@ -186,7 +171,6 @@ fn compute_relations_request(search_request: &SearchRequest) -> Option<RelationS
186
171
  shard_id: search_request.shard.clone(),
187
172
  prefix: search_request.relation_prefix.clone(),
188
173
  subgraph: search_request.relation_subgraph.clone(),
189
- reload: search_request.reload,
190
174
  })
191
175
  }
192
176
 
@@ -222,29 +206,37 @@ pub fn filter_to_boolean_expression(filter: FilterExpression) -> anyhow::Result<
222
206
 
223
207
  #[cfg(test)]
224
208
  mod tests {
225
- use nidx_protos::{filter_expression::FacetFilter, Filter};
209
+ use nidx_protos::filter_expression::{FacetFilter, FilterExpressionList};
226
210
 
227
211
  use super::*;
228
212
  #[test]
229
213
  fn proper_propagation() {
230
- let expression = serde_json::json!({
231
- "and": [
232
- { "literal": "this" },
233
- { "literal": "and" },
234
- { "literal": "that"},
235
- ],
236
- });
237
214
  #[allow(deprecated)]
238
215
  let request = SearchRequest {
239
- filter: Some(Filter {
240
- field_labels: vec!["this".to_string()],
241
- paragraph_labels: vec!["and".to_string(), "that".to_string()],
242
- labels_expression: expression.to_string(),
243
- keywords_expression: "".to_string(),
244
- }),
245
216
  result_per_page: 10,
246
217
  vector: vec![1.0],
247
218
  paragraph: true,
219
+ field_filter: Some(FilterExpression {
220
+ expr: Some(Expr::Facet(FacetFilter {
221
+ facet: "this".into(),
222
+ })),
223
+ }),
224
+ paragraph_filter: Some(FilterExpression {
225
+ expr: Some(Expr::BoolAnd(FilterExpressionList {
226
+ operands: vec![
227
+ FilterExpression {
228
+ expr: Some(Expr::Facet(FacetFilter {
229
+ facet: "and".into(),
230
+ })),
231
+ },
232
+ FilterExpression {
233
+ expr: Some(Expr::Facet(FacetFilter {
234
+ facet: "that".into(),
235
+ })),
236
+ },
237
+ ],
238
+ })),
239
+ }),
248
240
  ..Default::default()
249
241
  };
250
242
  let query_plan = build_query_plan(request).unwrap();
@@ -29,10 +29,7 @@ use tracing::{instrument, Span};
29
29
 
30
30
  use crate::errors::{NidxError, NidxResult};
31
31
 
32
- use super::{
33
- index_cache::IndexCache,
34
- query_planner::{filter_to_boolean_expression, old_filter_compatibility::filter_from_suggest_request},
35
- };
32
+ use super::{index_cache::IndexCache, query_planner::filter_to_boolean_expression};
36
33
 
37
34
  /// Max number of words accepted as a suggest query. This is useful for
38
35
  /// compounds with semantic meaning (like a name and a surname) but can add
@@ -99,18 +96,7 @@ fn blocking_suggest(
99
96
 
100
97
  let mut paragraph_request = None;
101
98
  if suggest_paragraphs {
102
- let filter_expression = filter_from_suggest_request(&request)?;
103
- if let Some(expr) = filter_expression {
104
- if request.field_filter.is_some() {
105
- return Err(anyhow::anyhow!("Cannot specify old and new filters in the same request"));
106
- }
107
- let prefilter = PreFilterRequest {
108
- security: None,
109
- filter_expression: Some(expr),
110
- };
111
-
112
- prefiltered = text_searcher.prefilter(&prefilter)?;
113
- } else if let Some(expr) = &request.field_filter {
99
+ if let Some(expr) = &request.field_filter {
114
100
  let prefilter = PreFilterRequest {
115
101
  security: None,
116
102
  filter_expression: Some(expr.clone()),
@@ -23,11 +23,13 @@ mod common;
23
23
  use std::collections::HashMap;
24
24
 
25
25
  use common::services::NidxFixture;
26
+ use nidx_protos::filter_expression::date_range_filter::DateField;
27
+ use nidx_protos::filter_expression::{DateRangeFilter, Expr, FilterExpressionList};
26
28
  use nidx_protos::prost_types::Timestamp;
27
29
  use nidx_protos::resource::ResourceStatus;
28
30
  use nidx_protos::{
29
- IndexMetadata, IndexParagraph, IndexParagraphs, NewShardRequest, Resource, ResourceId, SearchRequest,
30
- TextInformation, Timestamps, VectorIndexConfig, VectorSentence, VectorsetSentences,
31
+ FilterExpression, IndexMetadata, IndexParagraph, IndexParagraphs, NewShardRequest, Resource, ResourceId,
32
+ SearchRequest, TextInformation, VectorIndexConfig, VectorSentence, VectorsetSentences,
31
33
  };
32
34
  use sqlx::PgPool;
33
35
  use tonic::Request;
@@ -138,7 +140,6 @@ async fn test_date_range_search(pool: PgPool) -> Result<(), Box<dyn std::error::
138
140
  let request = SearchRequest {
139
141
  shard: shard_id.clone(),
140
142
  order: None,
141
- timestamps: None,
142
143
  vectorset: "english".to_string(),
143
144
  vector: vec![4.0, 6.0, 7.0],
144
145
  page_number: 0,
@@ -158,11 +159,25 @@ async fn test_date_range_search(pool: PgPool) -> Result<(), Box<dyn std::error::
158
159
 
159
160
  // Time range allows everything
160
161
  let mut request_all_range = request.clone();
161
- request_all_range.timestamps = Some(Timestamps {
162
- from_modified: Some(base_time),
163
- to_modified: None,
164
- from_created: Some(base_time),
165
- to_created: None,
162
+ request_all_range.field_filter = Some(FilterExpression {
163
+ expr: Some(Expr::BoolAnd(FilterExpressionList {
164
+ operands: vec![
165
+ FilterExpression {
166
+ expr: Some(Expr::Date(DateRangeFilter {
167
+ field: DateField::Modified.into(),
168
+ since: Some(base_time),
169
+ until: None,
170
+ })),
171
+ },
172
+ FilterExpression {
173
+ expr: Some(Expr::Date(DateRangeFilter {
174
+ field: DateField::Created.into(),
175
+ since: Some(base_time),
176
+ until: None,
177
+ })),
178
+ },
179
+ ],
180
+ })),
166
181
  });
167
182
  let result = fixture.searcher_client.search(request_all_range).await.unwrap();
168
183
  let result = result.into_inner();
@@ -171,11 +186,25 @@ async fn test_date_range_search(pool: PgPool) -> Result<(), Box<dyn std::error::
171
186
 
172
187
  // Time range allows only second batch
173
188
  let mut request_second_batch = request.clone();
174
- request_second_batch.timestamps = Some(Timestamps {
175
- from_modified: Some(base_time_plus_one),
176
- to_modified: None,
177
- from_created: Some(base_time_plus_one),
178
- to_created: None,
189
+ request_second_batch.field_filter = Some(FilterExpression {
190
+ expr: Some(Expr::BoolAnd(FilterExpressionList {
191
+ operands: vec![
192
+ FilterExpression {
193
+ expr: Some(Expr::Date(DateRangeFilter {
194
+ field: DateField::Modified.into(),
195
+ since: Some(base_time_plus_one),
196
+ until: None,
197
+ })),
198
+ },
199
+ FilterExpression {
200
+ expr: Some(Expr::Date(DateRangeFilter {
201
+ field: DateField::Created.into(),
202
+ since: Some(base_time_plus_one),
203
+ until: None,
204
+ })),
205
+ },
206
+ ],
207
+ })),
179
208
  });
180
209
  let result = fixture.searcher_client.search(request_second_batch).await.unwrap();
181
210
  let result = result.into_inner();
@@ -184,11 +213,16 @@ async fn test_date_range_search(pool: PgPool) -> Result<(), Box<dyn std::error::
184
213
 
185
214
  // Time range allows only second batch, but with modified only
186
215
  let mut request_second_batch = request.clone();
187
- request_second_batch.timestamps = Some(Timestamps {
188
- from_modified: Some(base_time_plus_one),
189
- to_modified: None,
190
- from_created: None,
191
- to_created: None,
216
+ request_second_batch.field_filter = Some(FilterExpression {
217
+ expr: Some(Expr::BoolAnd(FilterExpressionList {
218
+ operands: vec![FilterExpression {
219
+ expr: Some(Expr::Date(DateRangeFilter {
220
+ field: DateField::Modified.into(),
221
+ since: Some(base_time_plus_one),
222
+ until: None,
223
+ })),
224
+ }],
225
+ })),
192
226
  });
193
227
  let result = fixture.searcher_client.search(request_second_batch).await.unwrap();
194
228
  let result = result.into_inner();
@@ -200,11 +234,25 @@ async fn test_date_range_search(pool: PgPool) -> Result<(), Box<dyn std::error::
200
234
 
201
235
  // Time range does not match any field, therefore the response has no results
202
236
  let mut request_second_batch = request.clone();
203
- request_second_batch.timestamps = Some(Timestamps {
204
- from_modified: Some(base_time_plus_two),
205
- to_modified: None,
206
- from_created: Some(base_time_plus_two),
207
- to_created: None,
237
+ request_second_batch.field_filter = Some(FilterExpression {
238
+ expr: Some(Expr::BoolAnd(FilterExpressionList {
239
+ operands: vec![
240
+ FilterExpression {
241
+ expr: Some(Expr::Date(DateRangeFilter {
242
+ field: DateField::Modified.into(),
243
+ since: Some(base_time_plus_two),
244
+ until: None,
245
+ })),
246
+ },
247
+ FilterExpression {
248
+ expr: Some(Expr::Date(DateRangeFilter {
249
+ field: DateField::Created.into(),
250
+ since: Some(base_time_plus_two),
251
+ until: None,
252
+ })),
253
+ },
254
+ ],
255
+ })),
208
256
  });
209
257
  let result = fixture.searcher_client.search(request_second_batch).await.unwrap();
210
258
  let result = result.into_inner();
@@ -215,11 +263,25 @@ async fn test_date_range_search(pool: PgPool) -> Result<(), Box<dyn std::error::
215
263
 
216
264
  // Multiple timestamps are parsed as AND conditions
217
265
  let mut request_second_batch = request.clone();
218
- request_second_batch.timestamps = Some(Timestamps {
219
- from_modified: Some(base_time_plus_one),
220
- to_modified: None,
221
- from_created: Some(base_time_plus_two),
222
- to_created: None,
266
+ request_second_batch.field_filter = Some(FilterExpression {
267
+ expr: Some(Expr::BoolAnd(FilterExpressionList {
268
+ operands: vec![
269
+ FilterExpression {
270
+ expr: Some(Expr::Date(DateRangeFilter {
271
+ field: DateField::Modified.into(),
272
+ since: Some(base_time_plus_one),
273
+ until: None,
274
+ })),
275
+ },
276
+ FilterExpression {
277
+ expr: Some(Expr::Date(DateRangeFilter {
278
+ field: DateField::Created.into(),
279
+ since: Some(base_time_plus_two),
280
+ until: None,
281
+ })),
282
+ },
283
+ ],
284
+ })),
223
285
  });
224
286
  let result = fixture.searcher_client.search(request_second_batch).await.unwrap();
225
287
  let result = result.into_inner();
@@ -21,8 +21,9 @@
21
21
  mod common;
22
22
 
23
23
  use common::services::NidxFixture;
24
+ use nidx_protos::filter_expression::{Expr, FieldFilter, FilterExpressionList, KeywordFilter, ResourceFilter};
24
25
  use nidx_protos::prost_types::Timestamp;
25
- use nidx_protos::{nodereader, noderesources, Filter};
26
+ use nidx_protos::{nodereader, noderesources, FilterExpression};
26
27
  use nidx_protos::{NewShardRequest, VectorIndexConfig};
27
28
  use sqlx::PgPool;
28
29
  use std::collections::HashMap;
@@ -32,6 +33,63 @@ use uuid::Uuid;
32
33
 
33
34
  const VECTOR_DIMENSION: usize = 10;
34
35
 
36
+ fn file_field_filter_expression(fields: &[&str]) -> FilterExpression {
37
+ or_filter_expression(
38
+ fields
39
+ .iter()
40
+ .map(|f| FilterExpression {
41
+ expr: Some(Expr::Field(FieldFilter {
42
+ field_type: "f".into(),
43
+ field_id: Some(f.to_string()),
44
+ })),
45
+ })
46
+ .collect(),
47
+ )
48
+ }
49
+
50
+ fn resource_filter_expression(resources: &[&str]) -> FilterExpression {
51
+ or_filter_expression(
52
+ resources
53
+ .iter()
54
+ .map(|r| FilterExpression {
55
+ expr: Some(Expr::Resource(ResourceFilter {
56
+ resource_id: r.to_string(),
57
+ })),
58
+ })
59
+ .collect(),
60
+ )
61
+ }
62
+
63
+ fn keyword_filter_expression(word: &str) -> FilterExpression {
64
+ FilterExpression {
65
+ expr: Some(Expr::Keyword(KeywordFilter {
66
+ keyword: word.to_string(),
67
+ })),
68
+ }
69
+ }
70
+
71
+ fn or_filter_expression(operands: Vec<FilterExpression>) -> FilterExpression {
72
+ FilterExpression {
73
+ expr: Some(Expr::BoolOr(FilterExpressionList {
74
+ operands,
75
+ })),
76
+ }
77
+ }
78
+
79
+ fn and_filter_expression(operands: Vec<FilterExpression>) -> FilterExpression {
80
+ FilterExpression {
81
+ expr: Some(Expr::BoolAnd(FilterExpressionList {
82
+ operands,
83
+ })),
84
+ }
85
+ }
86
+
87
+ fn not_filter_expression(operand: FilterExpression) -> FilterExpression {
88
+ FilterExpression {
89
+ expr: Some(Expr::BoolNot(Box::new(operand))),
90
+ }
91
+ }
92
+
35
93
  #[sqlx::test]
36
94
  async fn test_search_fields_filtering(pool: PgPool) -> Result<(), Box<dyn std::error::Error>> {
37
95
  let mut fixture = NidxFixture::new(pool).await?;
@@ -66,7 +124,7 @@ async fn test_search_fields_filtering(pool: PgPool) -> Result<(), Box<dyn std::e
66
124
 
67
125
  let search_request = nodereader::SearchRequest {
68
126
  shard: shard_id.clone(),
69
- fields: ["f/foobar".to_string()].to_vec(),
127
+ field_filter: Some(file_field_filter_expression(&["foobar"])),
70
128
  vector: query_vector.clone(),
71
129
  vectorset: "english".to_string(),
72
130
  page_number: 0,
@@ -87,7 +145,7 @@ async fn test_search_fields_filtering(pool: PgPool) -> Result<(), Box<dyn std::e
87
145
  shard: shard_id.clone(),
88
146
  vector: query_vector.clone(),
89
147
  vectorset: "english".to_string(),
90
- fields: ["f/field1".to_string(), "f/unexisting".to_string()].to_vec(),
148
+ field_filter: Some(file_field_filter_expression(&["field1", "unexisting"])),
91
149
  page_number: 0,
92
150
  result_per_page: 1,
93
151
  min_score_semantic: -1.0,
@@ -111,7 +169,7 @@ async fn test_search_fields_filtering(pool: PgPool) -> Result<(), Box<dyn std::e
111
169
  shard: shard_id.clone(),
112
170
  vector: query_vector.clone(),
113
171
  vectorset: "english".to_string(),
114
- fields: ["f/field1".to_string(), "f/field2".to_string()].to_vec(),
172
+ field_filter: Some(file_field_filter_expression(&["field1", "field2"])),
115
173
  page_number: 0,
116
174
  result_per_page: 2,
117
175
  min_score_semantic: -1.0,
@@ -248,7 +306,7 @@ async fn test_search_key_filtering(pool: PgPool) -> Result<(), Box<dyn std::erro
248
306
  min_score_bm25: 0.0,
249
307
  paragraph: true,
250
308
  body: "Dummy".to_string(),
251
- key_filters: vec![resource1.resource.as_ref().unwrap().uuid.clone()],
309
+ field_filter: Some(resource_filter_expression(&[&resource1.resource.as_ref().unwrap().uuid])),
252
310
  ..Default::default()
253
311
  };
254
312
  let results = fixture.searcher_client.search(Request::new(search_request)).await?.into_inner();
@@ -262,7 +320,10 @@ async fn test_search_key_filtering(pool: PgPool) -> Result<(), Box<dyn std::erro
262
320
  min_score_bm25: 0.0,
263
321
  paragraph: true,
264
322
  body: "Dummy".to_string(),
265
- key_filters: vec![format!("{}/f/field1", resource1.resource.as_ref().unwrap().uuid)],
323
+ field_filter: Some(and_filter_expression(vec![
324
+ resource_filter_expression(&[&resource1.resource.as_ref().unwrap().uuid]),
325
+ file_field_filter_expression(&["field1"]),
326
+ ])),
266
327
  ..Default::default()
267
328
  };
268
329
  let results = fixture.searcher_client.search(Request::new(search_request)).await?.into_inner();
@@ -276,10 +337,10 @@ async fn test_search_key_filtering(pool: PgPool) -> Result<(), Box<dyn std::erro
276
337
  min_score_bm25: 0.0,
277
338
  paragraph: true,
278
339
  body: "Dummy".to_string(),
279
- key_filters: vec![
280
- resource1.resource.as_ref().unwrap().uuid.clone(),
281
- resource2.resource.as_ref().unwrap().uuid.clone(),
282
- ],
340
+ field_filter: Some(resource_filter_expression(&[
341
+ &resource1.resource.as_ref().unwrap().uuid,
342
+ &resource2.resource.as_ref().unwrap().uuid,
343
+ ])),
283
344
  ..Default::default()
284
345
  };
285
346
  let results = fixture.searcher_client.search(Request::new(search_request)).await?.into_inner();
@@ -293,7 +354,7 @@ async fn test_search_key_filtering(pool: PgPool) -> Result<(), Box<dyn std::erro
293
354
  min_score_bm25: 0.0,
294
355
  paragraph: true,
295
356
  body: "Dummy".to_string(),
296
- key_filters: vec!["fake".into()],
357
+ field_filter: Some(resource_filter_expression(&["fake"])),
297
358
  ..Default::default()
298
359
  };
299
360
  let results = fixture.searcher_client.search(Request::new(search_request)).await?.into_inner();
@@ -349,10 +410,7 @@ async fn test_search_keyword_filtering(pool: PgPool) -> Result<(), Box<dyn std::
349
410
  min_score_bm25: 0.0,
350
411
  paragraph: true,
351
412
  body: "Dummy".to_string(),
352
- filter: Some(Filter {
353
- keywords_expression: r#"{"literal":"text"}"#.into(),
354
- ..Default::default()
355
- }),
413
+ field_filter: Some(keyword_filter_expression("text")),
356
414
  ..Default::default()
357
415
  };
358
416
  let results = fixture.searcher_client.search(Request::new(search_request)).await?.into_inner();
@@ -366,10 +424,7 @@ async fn test_search_keyword_filtering(pool: PgPool) -> Result<(), Box<dyn std::
366
424
  min_score_bm25: 0.0,
367
425
  paragraph: true,
368
426
  body: "Dummy".to_string(),
369
- filter: Some(Filter {
370
- keywords_expression: r#"{"literal":"none"}"#.into(),
371
- ..Default::default()
372
- }),
427
+ field_filter: Some(keyword_filter_expression("none")),
373
428
  ..Default::default()
374
429
  };
375
430
  let results = fixture.searcher_client.search(Request::new(search_request)).await?.into_inner();
@@ -383,10 +438,7 @@ async fn test_search_keyword_filtering(pool: PgPool) -> Result<(), Box<dyn std::
383
438
  min_score_bm25: 0.0,
384
439
  paragraph: true,
385
440
  body: "Dummy".to_string(),
386
- filter: Some(Filter {
387
- keywords_expression: r#"{"not": {"literal":"none"}}"#.into(),
388
- ..Default::default()
389
- }),
441
+ field_filter: Some(not_filter_expression(keyword_filter_expression("none"))),
390
442
  ..Default::default()
391
443
  };
392
444
  let results = fixture.searcher_client.search(Request::new(search_request)).await?.into_inner();
@@ -400,10 +452,10 @@ async fn test_search_keyword_filtering(pool: PgPool) -> Result<(), Box<dyn std::
400
452
  min_score_bm25: 0.0,
401
453
  paragraph: true,
402
454
  body: "Dummy".to_string(),
403
- filter: Some(Filter {
404
- keywords_expression: r#"{"or": [{"literal":"none"}, {"literal":"text"}]}"#.into(),
405
- ..Default::default()
406
- }),
455
+ field_filter: Some(or_filter_expression(vec![
456
+ keyword_filter_expression("none"),
457
+ keyword_filter_expression("text"),
458
+ ])),
407
459
  ..Default::default()
408
460
  };
409
461
  let results = fixture.searcher_client.search(Request::new(search_request)).await?.into_inner();