pigeonhole-db 1.1.0
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.
- checksums.yaml +7 -0
- data/Cargo.lock +899 -0
- data/Cargo.toml +45 -0
- data/LICENSE +21 -0
- data/README.md +22 -0
- data/extconf.rb +12 -0
- data/lib/pigeonhole/api.rb +615 -0
- data/lib/pigeonhole/index.rb +208 -0
- data/lib/pigeonhole/memory.rb +507 -0
- data/lib/pigeonhole/version.rb +6 -0
- data/lib/pigeonhole-db.rb +6 -0
- data/lib/pigeonhole.rb +47 -0
- data/sig/pigeonhole.rbs +1484 -0
- data/src/budget.rs +205 -0
- data/src/classes.rs +279 -0
- data/src/convert.rs +192 -0
- data/src/db.rs +685 -0
- data/src/error.rs +151 -0
- data/src/feed.rs +316 -0
- data/src/fork.rs +64 -0
- data/src/gvl.rs +112 -0
- data/src/index.rs +1157 -0
- data/src/lib.rs +534 -0
- data/src/memory.rs +2178 -0
- data/src/read.rs +312 -0
- data/src/table.rs +1161 -0
- data/src/vector.rs +262 -0
- data/src/walk.rs +406 -0
- data/vendor/bundle/ruby/3.4.0/bin/minitest +29 -0
- data/vendor/bundle/ruby/3.4.0/bin/rake +29 -0
- data/vendor/bundle/ruby/3.4.0/bin/rake-compiler +29 -0
- data/vendor/bundle/ruby/3.4.0/bin/rake-compiler-dock +29 -0
- data/vendor/bundle/ruby/3.4.0/bin/rb-sys-dock +29 -0
- data/vendor/bundle/ruby/3.4.0/bin/rbs +29 -0
- data/vendor/bundle/ruby/3.4.0/cache/drb-2.2.3.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/logger-1.7.0.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/minitest-6.0.6.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/prism-1.9.0.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/rake-13.4.2.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/rake-compiler-1.3.2.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/rake-compiler-dock-1.12.0.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/rb_sys-0.9.130.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/rbs-4.2.0.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/toml-rb-6.0.0.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/tsort-0.2.0.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/prism-1.9.0/gem.build_complete +0 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/prism-1.9.0/gem_make.out +44 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/prism-1.9.0/mkmf.log +74 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/prism-1.9.0/prism/prism.so +0 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/rbs-4.2.0/gem.build_complete +0 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/rbs-4.2.0/gem_make.out +41 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/rbs-4.2.0/mkmf.log +102 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/rbs-4.2.0/rbs_extension.so +0 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/LICENSE.txt +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/drb.gemspec +42 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/acl.rb +239 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/drb.rb +1993 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/eq.rb +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/extserv.rb +44 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/extservm.rb +94 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/gw.rb +161 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/observer.rb +26 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/ssl.rb +354 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/timeridconv.rb +97 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/unix.rb +118 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/version.rb +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/weakidconv.rb +31 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb.rb +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/BSDL +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/COPYING +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/README.md +104 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/errors.rb +9 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/formatter.rb +36 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/log_device.rb +265 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/period.rb +47 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/severity.rb +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/version.rb +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger.rb +789 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/History.rdoc +1860 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/Manifest.txt +41 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/README.rdoc +763 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/Rakefile +89 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/bin/minitest +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/design_rationale.rb +54 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/hoe/minitest.rb +30 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/assertions.rb +821 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/autorun.rb +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/benchmark.rb +452 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/bisect.rb +304 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/complete.rb +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/compress.rb +94 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/error_on_warning.rb +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/expectations.rb +321 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/find_minimal_combination.rb +127 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/hell.rb +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/manual_plugins.rb +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/parallel.rb +72 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/path_expander.rb +432 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/pride.rb +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/pride_plugin.rb +135 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/server.rb +49 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/server_plugin.rb +88 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/spec.rb +324 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/sprint.rb +105 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/sprint_plugin.rb +39 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/test.rb +232 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/test_task.rb +331 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest.rb +1232 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/metametameta.rb +150 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_bisect.rb +249 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_find_minimal_combination.rb +138 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_minitest_assertions.rb +1729 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_minitest_benchmark.rb +151 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_minitest_reporter.rb +437 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_minitest_spec.rb +1095 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_minitest_test.rb +1295 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_minitest_test_task.rb +57 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_path_expander.rb +229 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_server.rb +146 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/BSDmakefile +58 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/CHANGELOG.md +786 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/CODE_OF_CONDUCT.md +76 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/CONTRIBUTING.md +58 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/LICENSE.md +7 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/Makefile +116 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/README.md +143 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/config.yml +4739 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/build_system.md +119 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/configuration.md +68 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/cruby_compilation.md +27 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/design.md +53 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/encoding.md +121 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/fuzzing.md +88 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/heredocs.md +36 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/javascript.md +118 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/local_variable_depth.md +229 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/mapping.md +117 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/parser_translation.md +24 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/parsing_rules.md +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/releasing.md +75 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/relocation.md +34 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/ripper_translation.md +63 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/ruby_api.md +45 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/ruby_parser_translation.md +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/serialization.md +233 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/testing.md +55 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/ext/prism/Makefile +273 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/ext/prism/api_node.c +6945 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/ext/prism/api_pack.c +276 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/ext/prism/extconf.rb +127 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/ext/prism/extension.c +1427 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/ext/prism/extension.h +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/ast.h +8254 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/defines.h +260 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/diagnostic.h +458 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/encoding.h +283 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/node.h +129 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/options.h +488 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/pack.h +163 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/parser.h +936 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/prettyprint.h +34 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/regexp.h +43 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/static_literals.h +121 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_buffer.h +236 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_char.h +204 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_constant_pool.h +218 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_integer.h +130 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_list.h +103 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_memchr.h +29 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_newline_list.h +113 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_string.h +200 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_strncasecmp.h +32 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_strpbrk.h +46 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/version.h +29 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism.h +408 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/compiler.rb +801 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/desugar_compiler.rb +392 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/dispatcher.rb +2210 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/dot_visitor.rb +4767 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/dsl.rb +1003 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/ffi.rb +578 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/inspect_visitor.rb +2393 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/lex_compat.rb +911 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/mutation_compiler.rb +772 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/node.rb +19966 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/node_ext.rb +511 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/pack.rb +230 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/parse_result/comments.rb +188 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/parse_result/errors.rb +66 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/parse_result/newlines.rb +155 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/parse_result.rb +907 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/pattern.rb +269 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/polyfill/append_as_bytes.rb +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/polyfill/byteindex.rb +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/polyfill/scan_byte.rb +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/polyfill/unpack1.rb +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/polyfill/warn.rb +36 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/prism.so +0 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/reflection.rb +416 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/relocation.rb +505 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/serialize.rb +2400 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/string_query.rb +31 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/parser/builder.rb +62 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/parser/compiler.rb +2234 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/parser/lexer.rb +820 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/parser.rb +376 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/parser_current.rb +26 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/parser_versions.rb +36 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/ripper/filter.rb +53 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/ripper/lexer.rb +135 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/ripper/sexp.rb +126 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/ripper/shim.rb +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/ripper.rb +3520 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/ruby_parser.rb +1964 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation.rb +18 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/visitor.rb +813 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism.rb +98 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/prism.gemspec +172 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/compiler.rbi +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/dsl.rbi +524 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/inspect_visitor.rbi +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/node.rbi +8750 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/node_ext.rbi +107 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/parse_result.rbi +404 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/reflection.rbi +58 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/string_query.rbi +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/translation/parser.rbi +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/translation/parser_versions.rbi +23 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/translation/ripper.rbi +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/visitor.rbi +473 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism.rbi +63 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/compiler.rbs +9 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/dispatcher.rbs +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/dot_visitor.rbs +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/dsl.rbs +351 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/inspect_visitor.rbs +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/lex_compat.rbs +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/mutation_compiler.rbs +159 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/node.rbs +4042 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/node_ext.rbs +149 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/pack.rbs +43 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/parse_result/comments.rbs +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/parse_result.rbs +197 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/pattern.rbs +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/reflection.rbs +50 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/relocation.rbs +185 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/serialize.rbs +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/string_query.rbs +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/visitor.rbs +169 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism.rbs +272 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/diagnostic.c +854 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/encoding.c +5340 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/node.c +8685 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/options.c +338 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/pack.c +509 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/prettyprint.c +8957 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/prism.c +22679 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/regexp.c +790 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/serialize.c +2274 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/static_literals.c +617 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/token_type.c +703 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_buffer.c +357 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_char.c +318 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_constant_pool.c +342 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_integer.c +670 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_list.c +49 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_memchr.c +35 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_newline_list.c +125 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_string.c +381 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_strncasecmp.c +36 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_strpbrk.c +206 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/History.rdoc +2454 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/MIT-LICENSE +21 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/README.rdoc +155 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/command_line_usage.rdoc +171 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/Rakefile1 +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/Rakefile2 +35 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/a.c +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/b.c +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/main.c +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/glossary.rdoc +42 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/jamis.rb +592 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/proto_rake.rdoc +127 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/rake.1 +156 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/rakefile.rdoc +635 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/rational.rdoc +151 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/exe/rake +27 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/application.rb +847 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/backtrace.rb +25 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/clean.rb +78 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/cloneable.rb +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/cpu_counter.rb +122 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/default_loader.rb +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/dsl_definition.rb +196 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/early_time.rb +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/ext/core.rb +26 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/ext/string.rb +176 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_creation_task.rb +25 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_list.rb +435 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_task.rb +58 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_utils.rb +137 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_utils_ext.rb +135 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/invocation_chain.rb +57 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/invocation_exception_mixin.rb +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/late_time.rb +18 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/linked_list.rb +112 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/loaders/makefile.rb +54 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/multi_task.rb +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/name_space.rb +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/options.rb +31 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/packagetask.rb +222 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/phony.rb +16 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/private_reader.rb +21 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/promise.rb +100 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/pseudo_status.rb +30 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/rake_module.rb +67 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/rake_test_loader.rb +27 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/rule_recursion_overflow_error.rb +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/scope.rb +43 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/task.rb +434 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/task_argument_error.rb +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/task_arguments.rb +113 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/task_manager.rb +333 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/tasklib.rb +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/testtask.rb +192 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/thread_history_display.rb +49 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/thread_pool.rb +157 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/trace_output.rb +23 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/version.rb +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/win32.rb +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake.rb +69 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/rake.gemspec +102 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/Gemfile +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/History.md +708 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/LICENSE.txt +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/README.md +505 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/Rakefile +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/appveyor.yml +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/bin/rake-compiler +24 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/cucumber.yml +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/compile.feature +79 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/cross-compile.feature +23 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/cross-package-multi.feature +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/cross-package.feature +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/java-compile.feature +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/java-no-native-compile.feature +33 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/java-package.feature +24 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/package.feature +40 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/step_definitions/compilation.rb +70 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/step_definitions/cross_compilation.rb +27 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/step_definitions/execution.rb +52 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/step_definitions/folders.rb +32 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/step_definitions/gem.rb +46 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/step_definitions/java_compilation.rb +7 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/support/env.rb +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/support/file_template_helpers.rb +137 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/support/generator_helpers.rb +123 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/support/platform_extension_helpers.rb +27 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/lib/rake/baseextensiontask.rb +90 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/lib/rake/compiler_config.rb +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/lib/rake/extensioncompiler.rb +51 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/lib/rake/extensiontask.rb +621 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/lib/rake/javaextensiontask.rb +321 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/tasks/bin/cross-ruby.rake +189 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/tasks/bootstrap.rake +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/tasks/common.rake +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/tasks/cucumber.rake +23 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/tasks/gem.rake +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/tasks/rspec.rake +9 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/CHANGELOG.md +446 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/CONTRIBUTING.md +109 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/Dockerfile.jruby +79 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/Dockerfile.mri.erb +282 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/Gemfile +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/LICENSE.txt +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/README.md +447 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/Rakefile +246 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/bin/rake-compiler-dock +18 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/buildkitd.toml +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/gem_helper.rb +54 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/mk_i686.rb +18 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/mk_musl_cross.sh +37 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/mk_osxcross.sh +45 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/mk_pkg_config.sh +24 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/parallel_docker_build.rb +169 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/patches/rake-compiler-1.3.1/0004-Enable-build-of-static-libruby.patch +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/patches/rake-compiler-1.3.1/0005-build-miniruby-first.patch +16 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/patches/rake-compiler-1.3.1/0006-ruby-4-rubyspec-capiext.patch +16 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/rcd-env.sh +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/runas +7 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/sigfw.c +45 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/strip_wrapper_codesign +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/strip_wrapper_vbox +30 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/sudoers +1 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/colors.rb +43 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/docker_check.rb +356 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/predefined_user_group.rb +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/starter.rb +206 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/version.rb +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock.rb +151 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/Dockerfile +66 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/README.md +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/binutils-mingw-w64-ignore-check-errors.patch +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/gcc-mingw-w64-only-c-c++.patch +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/mingw-w64-enable-ucrt.patch +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/rake-compiler-dock.gemspec +34 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/env/Dockerfile.alpine +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/env/Dockerfile.debian +24 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/fixtures/mig_test_rpc.defs +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/Gemfile +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/Rakefile +97 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/java/RcdTestExtService.java +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/java/RubyRcdTest.java +16 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/mri/extconf.rb +111 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/mri/rcd_test_ext.c +65 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/mri/rcd_test_ext.h +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/lib/rcd_test.rb +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/rcd_test.gemspec +28 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/test/test_basic.rb +49 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/test_environment_variables.rb +108 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/test_mig.rb +18 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/test_parallel_docker_build.rb +95 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/test_rubygems_plugins.rb +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/test_starter.rb +158 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/test_versions.rb +82 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/LICENSE-APACHE +190 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/LICENSE-MIT +21 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/README.md +42 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/certs/ianks.pem +21 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/exe/rb-sys-dock +495 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/cargo/config.rb +72 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/cargo/metadata.rb +158 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/cargo.rb +9 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/cargo_builder/link_flag_converter.rb +37 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/cargo_builder.rb +370 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/error.rb +43 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/extensiontask.rb +188 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/mkmf/config.rb +75 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/mkmf.rb +413 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/toolchain_info/data.rb +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/toolchain_info.rb +82 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/util/logger.rb +73 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/version.rb +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys.rb +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/BSDL +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/CHANGELOG.md +2463 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/COPYING +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/Dockerfile.jruby +53 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/README.md +240 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/Rakefile +1213 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/Steepfile +55 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/config.yml +920 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/array.rbs +4205 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/basic_object.rbs +376 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/binding.rbs +148 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/builtin.rbs +278 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/class.rbs +223 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/comparable.rbs +192 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/complex.rbs +812 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/constants.rbs +96 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/data.rbs +415 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/dir.rbs +993 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/encoding.rbs +1368 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/enumerable.rbs +2506 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/enumerator/arithmetic_sequence.rbs +70 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/enumerator/product.rbs +92 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/enumerator.rbs +705 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/env.rbs +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/errno.rbs +682 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/errors.rbs +789 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/exception.rbs +485 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/false_class.rbs +82 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/fiber.rbs +570 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/fiber_error.rbs +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/file.rbs +2045 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/file_constants.rbs +463 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/file_stat.rbs +534 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/file_test.rbs +331 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/float.rbs +1292 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/gc.rbs +788 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/global_variables.rbs +184 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/hash.rbs +2183 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/integer.rbs +1374 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/io/buffer.rbs +995 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/io/wait.rbs +48 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/io.rbs +3473 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/kernel.rbs +3172 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/marshal.rbs +207 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/match_data.rbs +637 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/math.rbs +770 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/method.rbs +422 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/module.rbs +1856 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/nil_class.rbs +210 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/numeric.rbs +832 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/object.rbs +108 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/object_space/weak_key_map.rbs +166 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/object_space.rbs +197 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/pathname.rbs +1312 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/proc.rbs +905 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/process.rbs +2316 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/ractor.rbs +914 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/random.rbs +255 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/range.rbs +1209 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rational.rbs +502 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rb_config.rbs +88 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rbs/ops.rbs +154 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rbs/unnamed/argf.rbs +1236 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rbs/unnamed/env_class.rbs +1214 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rbs/unnamed/main_class.rbs +123 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rbs/unnamed/random.rbs +186 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/refinement.rbs +59 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/regexp.rbs +1974 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/ruby.rbs +53 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/ruby_vm.rbs +809 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/basic_specification.rbs +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/config_file.rbs +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/dependency_installer.rbs +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/errors.rbs +112 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/installer.rbs +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/path_support.rbs +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/platform.rbs +7 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/request_set.rbs +49 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/requirement.rbs +138 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/rubygems.rbs +1108 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/source_list.rbs +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/specification.rbs +31 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/stream_ui.rbs +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/uninstaller.rbs +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/version.rbs +133 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/set.rbs +751 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/signal.rbs +110 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/string.rbs +5532 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/struct.rbs +668 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/symbol.rbs +482 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/thread.rbs +1821 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/thread_group.rbs +79 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/time.rbs +1793 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/trace_point.rbs +483 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/true_class.rbs +98 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/unbound_method.rbs +337 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/warning.rbs +87 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/CONTRIBUTING.md +107 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/aliases.md +79 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/architecture.md +110 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/collection.md +192 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/config.md +171 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/data_and_struct.md +86 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/encoding.md +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/gem.md +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/inline.md +634 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/rbs_by_example.md +309 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/release.md +303 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/repo.md +125 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/rust.md +96 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/sigs.md +167 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/stdlib.md +155 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/syntax.md +952 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/tools.md +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/type_fingerprint.md +21 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/wasm_serialization.md +80 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/exe/rbs +7 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/Makefile +273 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/ast_translation.c +1870 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/ast_translation.h +41 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/class_constants.c +189 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/class_constants.h +105 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/compat.h +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/extconf.rb +40 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/legacy_location.c +299 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/legacy_location.h +82 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/main.c +649 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/rbs_extension.h +16 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/rbs_string_bridging.c +9 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/rbs_string_bridging.h +24 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/goodcheck.yml +91 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/ast.h +1055 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/defines.h +104 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/lexer.h +208 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/location.h +40 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/parser.h +187 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/serialize.h +39 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/string.h +47 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/util/rbs_allocator.h +59 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/util/rbs_assert.h +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/util/rbs_buffer.h +83 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/util/rbs_constant_pool.h +155 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/util/rbs_encoding.h +282 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/util/rbs_unescape.h +24 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs.h +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ancestor_graph.rb +92 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/annotate/annotations.rb +199 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/annotate/formatter.rb +82 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/annotate/rdoc_annotator.rb +398 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/annotate/rdoc_source.rb +131 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/annotate.rb +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/annotation.rb +29 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/comment.rb +29 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/declarations.rb +472 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/directives.rb +49 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/members.rb +451 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/ruby/annotations.rb +451 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/ruby/comment_block.rb +247 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/ruby/declarations.rb +291 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/ruby/members.rb +762 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/type_param.rb +235 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/visitor.rb +137 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/buffer.rb +189 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/builtin_names.rb +58 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/cli/colored_io.rb +48 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/cli/diff.rb +84 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/cli/validate.rb +294 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/cli.rb +1253 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/cleaner.rb +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/config/lockfile.rb +92 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/config/lockfile_generator.rb +269 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/config.rb +81 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/installer.rb +32 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/sources/base.rb +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/sources/git.rb +265 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/sources/local.rb +81 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/sources/rubygems.rb +48 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/sources/stdlib.rb +50 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/sources.rb +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection.rb +16 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/constant.rb +28 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/definition.rb +415 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/definition_builder/ancestor_builder.rb +681 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/definition_builder/method_builder.rb +295 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/definition_builder.rb +1057 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/diff.rb +131 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/environment/class_entry.rb +81 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/environment/module_entry.rb +91 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/environment/use_map.rb +77 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/environment.rb +1028 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/environment_loader.rb +167 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/environment_walker.rb +155 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/errors.rb +634 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/factory.rb +18 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/file_finder.rb +28 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/inline_parser/comment_association.rb +117 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/inline_parser.rb +568 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/location_aux.rb +170 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/locator.rb +247 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/method_type.rb +145 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/namespace.rb +154 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/parser/lex_result.rb +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/parser/token.rb +23 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/parser_aux.rb +144 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/helpers.rb +164 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/node_usage.rb +99 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/rb.rb +816 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/rbi.rb +793 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/runtime/helpers.rb +59 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/runtime/reflection.rb +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/runtime/value_object_generator.rb +278 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/runtime.rb +680 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/repository.rb +127 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/resolver/constant_resolver.rb +219 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/resolver/type_name_resolver.rb +167 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/rewriter.rb +70 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/sorter.rb +198 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/source.rb +99 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/substitution.rb +83 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/subtractor.rb +204 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/errors.rb +80 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/guaranteed.rb +30 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/hook.rb +212 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/observer.rb +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/setup.rb +84 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/setup_helper.rb +50 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/tester.rb +167 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/type_check.rb +457 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test.rb +112 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/type_alias_dependency.rb +100 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/type_alias_regularity.rb +126 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/type_name.rb +122 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/types.rb +1646 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/unit_test/convertibles.rb +177 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/unit_test/spy.rb +138 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/unit_test/type_assertions.rb +383 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/unit_test/with_aliases.rb +145 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/unit_test.rb +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/validator.rb +186 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/variance_calculator.rb +189 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/vendorer.rb +71 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/version.rb +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/wasm/deserializer.rb +213 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/wasm/location.rb +61 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/wasm/parser.rb +174 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/wasm/runtime.rb +211 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/wasm/serialization_schema.rb +111 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/writer.rb +424 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs.rb +117 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs_extension.so +0 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs_jars.rb +39 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rdoc/discover.rb +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rdoc_plugin/parser.rb +168 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/rbs.gemspec +77 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/annotation.json +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/comment.json +26 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/decls.json +326 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/function.json +98 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/location.json +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/members.json +266 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/methodType.json +50 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/typeParam.json +52 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/types.json +317 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ancestor_builder.rbs +163 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ancestor_graph.rbs +60 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/annotate/annotations.rbs +102 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/annotate/formatter.rbs +24 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/annotate/rdoc_annotater.rbs +85 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/annotate/rdoc_source.rbs +32 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/annotation.rbs +27 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ast/ruby/annotations.rbs +470 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ast/ruby/comment_block.rbs +127 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ast/ruby/declarations.rbs +158 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ast/ruby/helpers/location_helper.rbs +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ast/ruby/members.rbs +198 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/buffer.rbs +108 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/builtin_names.rbs +44 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/cli/colored_io.rbs +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/cli/diff.rbs +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/cli/validate.rbs +47 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/cli.rbs +89 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/collection/cleaner.rbs +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/collection/config/lockfile.rbs +74 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/collection/config/lockfile_generator.rbs +68 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/collection/config.rbs +46 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/collection/installer.rbs +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/collection/sources.rbs +214 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/collection.rbs +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/comment.rbs +26 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/constant.rbs +21 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/declarations.rbs +274 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/definition.rbs +232 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/definition_builder.rbs +181 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/diff.rbs +28 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/directives.rbs +77 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/environment/class_entry.rbs +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/environment/module_entry.rbs +65 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/environment.rbs +286 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/environment_loader.rbs +111 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/environment_walker.rbs +65 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/errors.rbs +408 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/factory.rbs +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/file_finder.rbs +28 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/inline_parser/comment_association.rbs +71 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/inline_parser.rbs +126 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/location.rbs +135 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/locator.rbs +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/manifest.yaml +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/members.rbs +258 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/method_builder.rbs +89 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/method_types.rbs +58 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/namespace.rbs +161 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/parser.rbs +164 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/prototype/helpers.rbs +29 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/prototype/node_usage.rbs +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/prototype/rb.rbs +96 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/prototype/rbi.rbs +104 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/prototype/runtime.rbs +182 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/rbs.rbs +21 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/rdoc/rbs.rbs +67 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/repository.rbs +85 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/resolver/constant_resolver.rbs +92 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/resolver/context.rbs +34 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/resolver/type_name_resolver.rbs +61 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/rewriter.rbs +45 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/shims/bundler.rbs +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/shims/enumerable.rbs +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/shims/rubygems.rbs +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/sorter.rbs +41 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/source.rbs +48 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/substitution.rbs +48 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/subtractor.rbs +37 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/test/errors.rbs +52 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/test/guranteed.rbs +9 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/test/type_check.rbs +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/test.rbs +82 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/type_alias_dependency.rbs +53 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/type_alias_regularity.rbs +98 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/type_param.rbs +115 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/typename.rbs +89 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/types.rbs +588 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/unit_test/convertibles.rbs +154 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/unit_test/spy.rbs +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/unit_test/type_assertions.rbs +211 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/unit_test/with_aliases.rbs +136 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/use_map.rbs +35 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/util.rbs +9 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/validator.rbs +63 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/variance_calculator.rbs +87 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/vendorer.rbs +51 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/version.rbs +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/visitor.rbs +47 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/wasm/deserializer.rbs +66 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/wasm/serialization_schema.rbs +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/writer.rbs +127 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/ast.c +1644 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/lexer.c +3223 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/lexer.re +187 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/lexstate.c +222 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/location.c +31 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/parser.c +4318 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/serialize.c +965 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/string.c +41 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/util/rbs_allocator.c +171 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/util/rbs_assert.c +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/util/rbs_buffer.c +54 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/util/rbs_constant_pool.c +268 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/util/rbs_encoding.c +21454 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/util/rbs_unescape.c +167 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/abbrev/0/abbrev.rbs +66 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/abbrev/0/array.rbs +26 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/base64/0/base64.rbs +355 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/benchmark/0/benchmark.rbs +452 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/bigdecimal/0/big_decimal.rbs +1647 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/bigdecimal-math/0/big_math.rbs +280 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/bigdecimal-math/0/manifest.yaml +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/cgi/0/core.rbs +911 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/cgi/0/manifest.yaml +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/cgi-escape/0/escape.rbs +171 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/coverage/0/coverage.rbs +266 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/csv/0/csv.rbs +3776 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/csv/0/manifest.yaml +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/date/0/date.rbs +1598 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/date/0/date_time.rbs +617 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/date/0/time.rbs +26 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/dbm/0/dbm.rbs +421 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/delegate/0/delegator.rbs +188 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/delegate/0/kernel.rbs +47 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/delegate/0/simple_delegator.rbs +96 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/did_you_mean/0/did_you_mean.rbs +344 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/digest/0/digest.rbs +693 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/erb/0/erb.rbs +933 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/etc/0/etc.rbs +884 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/fileutils/0/fileutils.rbs +1753 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/find/0/find.rbs +49 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/forwardable/0/forwardable.rbs +271 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/io-console/0/io-console.rbs +414 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/ipaddr/0/ipaddr.rbs +431 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/json/0/json.rbs +1963 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/kconv/0/kconv.rbs +166 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/logger/0/formatter.rbs +45 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/logger/0/log_device.rbs +100 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/logger/0/logger.rbs +796 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/logger/0/manifest.yaml +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/logger/0/period.rbs +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/logger/0/severity.rbs +34 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/kernel.rbs +42 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/abstract_reporter.rbs +52 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/assertion.rbs +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/assertions.rbs +590 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/backtrace_filter.rbs +23 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/bench_spec.rbs +102 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/benchmark.rbs +259 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/composite_reporter.rbs +25 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/compress.rbs +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/error_on_warning.rbs +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/expectation.rbs +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/expectations.rbs +21 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/guard.rbs +64 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/mock.rbs +64 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/parallel/executor.rbs +46 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/parallel/test/class_methods.rbs +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/parallel/test.rbs +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/parallel.rbs +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/pride_io.rbs +62 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/pride_lol.rbs +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/progress_reporter.rbs +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/reportable.rbs +53 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/reporter.rbs +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/result.rbs +28 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/runnable.rbs +163 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/skip.rbs +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/spec/dsl/instance_methods.rbs +48 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/spec/dsl.rbs +129 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/spec.rbs +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/statistics_reporter.rbs +81 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/summary_reporter.rbs +18 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +92 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/test.rbs +69 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/unexpected_error.rbs +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/unexpected_warning.rbs +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/unit/test_case.rbs +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/unit.rbs +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest.rbs +115 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/monitor/0/monitor.rbs +363 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/mutex_m/0/mutex_m.rbs +104 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/net-http/0/manifest.yaml +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/net-http/0/net-http.rbs +5580 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/net-protocol/0/manifest.yaml +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/net-protocol/0/net-protocol.rbs +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/net-smtp/0/manifest.yaml +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/net-smtp/0/net-smtp.rbs +55 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/nkf/0/nkf.rbs +402 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/objspace/0/objspace.rbs +470 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/observable/0/observable.rbs +217 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/open-uri/0/manifest.yaml +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/open-uri/0/open-uri.rbs +433 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/open3/0/open3.rbs +606 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/openssl/0/manifest.yaml +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/openssl/0/openssl.rbs +12237 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/optparse/0/optparse.rbs +1734 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/pathname/0/pathname.rbs +36 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/pp/0/manifest.yaml +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/pp/0/pp.rbs +301 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/prettyprint/0/prettyprint.rbs +383 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/pstore/0/pstore.rbs +608 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/psych/0/core_ext.rbs +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/psych/0/dbm.rbs +237 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/psych/0/manifest.yaml +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/psych/0/psych.rbs +455 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/psych/0/store.rbs +57 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/pty/0/pty.rbs +240 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/random-formatter/0/random-formatter.rbs +277 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/code_object.rbs +52 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/comment.rbs +61 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/context.rbs +153 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/markup.rbs +117 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/options.rbs +76 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/parser.rbs +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/rdoc.rbs +393 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/ri.rbs +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/store.rbs +48 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/top_level.rbs +97 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/resolv/0/manifest.yaml +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/resolv/0/resolv.rbs +1787 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/ripper/0/ripper.rbs +1654 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/securerandom/0/manifest.yaml +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/securerandom/0/securerandom.rbs +49 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/shellwords/0/shellwords.rbs +229 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/singleton/0/singleton.rbs +137 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/addrinfo.rbs +666 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/basic_socket.rbs +590 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/constants.rbs +2295 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/ip_socket.rbs +94 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/socket.rbs +4170 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/socket_error.rbs +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/tcp_server.rbs +192 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/tcp_socket.rbs +87 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/udp_socket.rbs +133 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/unix_server.rbs +169 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/unix_socket.rbs +172 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/stringio/0/stringio.rbs +1682 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/strscan/0/string_scanner.rbs +1648 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/tempfile/0/manifest.yaml +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/tempfile/0/tempfile.rbs +483 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/time/0/time.rbs +434 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/timeout/0/timeout.rbs +132 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/tmpdir/0/tmpdir.rbs +69 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/tsort/0/cyclic.rbs +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/tsort/0/interfaces.rbs +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/tsort/0/tsort.rbs +410 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/common.rbs +621 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/file.rbs +118 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/ftp.rbs +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/generic.rbs +1111 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/http.rbs +104 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/https.rbs +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/ldap.rbs +230 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/ldaps.rbs +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/mailto.rbs +92 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/rfc2396_parser.rbs +189 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/rfc3986_parser.rbs +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/ws.rbs +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/wss.rbs +9 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/yaml/0/manifest.yaml +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/yaml/0/yaml.rbs +1 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/buf_error.rbs +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/data_error.rbs +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/deflate.rbs +211 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/error.rbs +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/gzip_file/crc_error.rbs +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/gzip_file/error.rbs +23 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/gzip_file/length_error.rbs +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/gzip_file/no_footer.rbs +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/gzip_file.rbs +156 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/gzip_reader.rbs +293 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/gzip_writer.rbs +169 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/inflate.rbs +180 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/mem_error.rbs +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/need_dict.rbs +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/stream_end.rbs +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/stream_error.rbs +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/version_error.rbs +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/zlib.rbs +449 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/zstream.rbs +200 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/wasm/README.md +109 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/wasm/rbs_wasm.c +479 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/LICENSE +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/README.md +135 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/datetime.rb +54 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/dumper.rb +182 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/errors.rb +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/inline_table.rb +18 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/keyvalue.rb +45 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/parser.rb +296 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/string.rb +41 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/table.rb +34 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/table_array.rb +43 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/version.rb +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb.rb +90 -0
- data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/Gemfile +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/LICENSE.txt +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/README.md +72 -0
- data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/Rakefile +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/bin/console +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/bin/setup +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb +455 -0
- data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/tsort.gemspec +29 -0
- data/vendor/bundle/ruby/3.4.0/specifications/drb-2.2.3.gemspec +22 -0
- data/vendor/bundle/ruby/3.4.0/specifications/logger-1.7.0.gemspec +22 -0
- data/vendor/bundle/ruby/3.4.0/specifications/minitest-6.0.6.gemspec +35 -0
- data/vendor/bundle/ruby/3.4.0/specifications/prism-1.9.0.gemspec +24 -0
- data/vendor/bundle/ruby/3.4.0/specifications/rake-13.4.2.gemspec +26 -0
- data/vendor/bundle/ruby/3.4.0/specifications/rake-compiler-1.3.2.gemspec +33 -0
- data/vendor/bundle/ruby/3.4.0/specifications/rake-compiler-dock-1.12.0.gemspec +28 -0
- data/vendor/bundle/ruby/3.4.0/specifications/rb_sys-0.9.130.gemspec +29 -0
- data/vendor/bundle/ruby/3.4.0/specifications/rbs-4.2.0.gemspec +33 -0
- data/vendor/bundle/ruby/3.4.0/specifications/toml-rb-6.0.0.gemspec +27 -0
- data/vendor/bundle/ruby/3.4.0/specifications/tsort-0.2.0.gemspec +23 -0
- data/vendor/cache/Cargo.toml +21 -0
- data/vendor/cache/LICENSE +21 -0
- data/vendor/cache/README.md +5 -0
- data/vendor/cache/src/hash.rs +85 -0
- data/vendor/cache/src/lib.rs +751 -0
- data/vendor/cache/src/loom_tests.rs +340 -0
- data/vendor/cache/src/s3fifo.rs +648 -0
- data/vendor/cache/src/sync.rs +25 -0
- data/vendor/cache/src/tests.rs +260 -0
- data/vendor/compaction/Cargo.toml +32 -0
- data/vendor/compaction/LICENSE +21 -0
- data/vendor/compaction/README.md +5 -0
- data/vendor/compaction/src/blob.rs +478 -0
- data/vendor/compaction/src/cursor.rs +700 -0
- data/vendor/compaction/src/gc.rs +802 -0
- data/vendor/compaction/src/job.rs +861 -0
- data/vendor/compaction/src/lib.rs +102 -0
- data/vendor/compaction/src/merge.rs +995 -0
- data/vendor/compaction/src/picker.rs +681 -0
- data/vendor/compaction/src/resolver.rs +1346 -0
- data/vendor/engine/Cargo.toml +56 -0
- data/vendor/engine/LICENSE +21 -0
- data/vendor/engine/README.md +5 -0
- data/vendor/engine/src/admission.rs +421 -0
- data/vendor/engine/src/catalog.rs +1233 -0
- data/vendor/engine/src/check.rs +1386 -0
- data/vendor/engine/src/clock.rs +244 -0
- data/vendor/engine/src/clock_loom.rs +482 -0
- data/vendor/engine/src/close_gate.rs +325 -0
- data/vendor/engine/src/compact.rs +1509 -0
- data/vendor/engine/src/engine/hooks.rs +1654 -0
- data/vendor/engine/src/engine/info.rs +229 -0
- data/vendor/engine/src/engine.rs +6114 -0
- data/vendor/engine/src/error.rs +490 -0
- data/vendor/engine/src/feed.rs +960 -0
- data/vendor/engine/src/feed_reader.rs +1600 -0
- data/vendor/engine/src/flush.rs +839 -0
- data/vendor/engine/src/flushed_roots.rs +158 -0
- data/vendor/engine/src/flushed_through_loom.rs +77 -0
- data/vendor/engine/src/health.rs +201 -0
- data/vendor/engine/src/large.rs +372 -0
- data/vendor/engine/src/large_settle.rs +201 -0
- data/vendor/engine/src/lib.rs +112 -0
- data/vendor/engine/src/load_slot.rs +324 -0
- data/vendor/engine/src/maintenance.rs +935 -0
- data/vendor/engine/src/manifest/flight.rs +563 -0
- data/vendor/engine/src/manifest.rs +1516 -0
- data/vendor/engine/src/nonblocking.rs +603 -0
- data/vendor/engine/src/options.rs +334 -0
- data/vendor/engine/src/position.rs +125 -0
- data/vendor/engine/src/purge_guard.rs +220 -0
- data/vendor/engine/src/read/keys.rs +1049 -0
- data/vendor/engine/src/read/knn.rs +423 -0
- data/vendor/engine/src/read/reduce.rs +2057 -0
- data/vendor/engine/src/read/traverse.rs +1013 -0
- data/vendor/engine/src/read.rs +2429 -0
- data/vendor/engine/src/row_cache.rs +1101 -0
- data/vendor/engine/src/shard/tablets.rs +3582 -0
- data/vendor/engine/src/shard.rs +12215 -0
- data/vendor/engine/src/snapshot.rs +1429 -0
- data/vendor/engine/src/source.rs +1379 -0
- data/vendor/engine/src/timer_state.rs +226 -0
- data/vendor/engine/src/waker.rs +124 -0
- data/vendor/engine/src/watermark_waiters.rs +674 -0
- data/vendor/engine/src/write.rs +1321 -0
- data/vendor/format/Cargo.toml +40 -0
- data/vendor/format/LICENSE +21 -0
- data/vendor/format/README.md +5 -0
- data/vendor/format/src/blob.rs +101 -0
- data/vendor/format/src/block.rs +1120 -0
- data/vendor/format/src/bloom.rs +456 -0
- data/vendor/format/src/buckets.rs +552 -0
- data/vendor/format/src/bytes.rs +101 -0
- data/vendor/format/src/checksum.rs +132 -0
- data/vendor/format/src/compress.rs +196 -0
- data/vendor/format/src/cursor.rs +110 -0
- data/vendor/format/src/distance.rs +598 -0
- data/vendor/format/src/error.rs +93 -0
- data/vendor/format/src/exact.rs +602 -0
- data/vendor/format/src/feed.rs +285 -0
- data/vendor/format/src/filter.rs +157 -0
- data/vendor/format/src/half.rs +182 -0
- data/vendor/format/src/hash.rs +127 -0
- data/vendor/format/src/hll.rs +500 -0
- data/vendor/format/src/ids.rs +95 -0
- data/vendor/format/src/key.rs +620 -0
- data/vendor/format/src/kind_params.rs +101 -0
- data/vendor/format/src/lib.rs +54 -0
- data/vendor/format/src/manifest.rs +1287 -0
- data/vendor/format/src/roaring.rs +865 -0
- data/vendor/format/src/scan.rs +297 -0
- data/vendor/format/src/shm.rs +805 -0
- data/vendor/format/src/sst.rs +233 -0
- data/vendor/format/src/superblock.rs +345 -0
- data/vendor/format/src/value.rs +163 -0
- data/vendor/format/src/varint.rs +87 -0
- data/vendor/format/src/vector.rs +936 -0
- data/vendor/format/src/version.rs +92 -0
- data/vendor/format/src/wal.rs +999 -0
- data/vendor/io/Cargo.toml +29 -0
- data/vendor/io/LICENSE +21 -0
- data/vendor/io/README.md +5 -0
- data/vendor/io/src/async_poll.rs +44 -0
- data/vendor/io/src/buf.rs +694 -0
- data/vendor/io/src/completion.rs +444 -0
- data/vendor/io/src/error.rs +110 -0
- data/vendor/io/src/file.rs +206 -0
- data/vendor/io/src/lib.rs +53 -0
- data/vendor/io/src/nowait.rs +256 -0
- data/vendor/io/src/os/mod.rs +149 -0
- data/vendor/io/src/os/unix.rs +897 -0
- data/vendor/io/src/os/windows.rs +552 -0
- data/vendor/io/src/own.rs +257 -0
- data/vendor/io/src/pread.rs +854 -0
- data/vendor/io/src/ring_wake.rs +113 -0
- data/vendor/io/src/shared.rs +410 -0
- data/vendor/io/src/sim.rs +1545 -0
- data/vendor/io/src/sys.rs +214 -0
- data/vendor/io/src/uring.rs +1839 -0
- data/vendor/io/src/vfs.rs +154 -0
- data/vendor/memory/Cargo.toml +34 -0
- data/vendor/memory/LICENSE +21 -0
- data/vendor/memory/README.md +11 -0
- data/vendor/memory/src/consolidate.rs +640 -0
- data/vendor/memory/src/dedup.rs +231 -0
- data/vendor/memory/src/error.rs +131 -0
- data/vendor/memory/src/feed_loop.rs +572 -0
- data/vendor/memory/src/forget.rs +724 -0
- data/vendor/memory/src/hooks.rs +109 -0
- data/vendor/memory/src/ivf.rs +204 -0
- data/vendor/memory/src/layout.rs +340 -0
- data/vendor/memory/src/lib.rs +61 -0
- data/vendor/memory/src/recall.rs +1182 -0
- data/vendor/memory/src/store.rs +1785 -0
- data/vendor/memory/src/watch.rs +339 -0
- data/vendor/memtable/Cargo.toml +24 -0
- data/vendor/memtable/LICENSE +21 -0
- data/vendor/memtable/README.md +5 -0
- data/vendor/memtable/src/lib.rs +1658 -0
- data/vendor/memtable/src/loom_tests.rs +274 -0
- data/vendor/memtable/src/mem.rs +344 -0
- data/vendor/memtable/src/tests.rs +1061 -0
- data/vendor/pager/Cargo.toml +23 -0
- data/vendor/pager/LICENSE +21 -0
- data/vendor/pager/README.md +5 -0
- data/vendor/pager/src/alloc.rs +1008 -0
- data/vendor/pager/src/lib.rs +1710 -0
- data/vendor/pigeonhole/Cargo.toml +42 -0
- data/vendor/pigeonhole/LICENSE +21 -0
- data/vendor/pigeonhole/README.md +99 -0
- data/vendor/pigeonhole/src/cell.rs +829 -0
- data/vendor/pigeonhole/src/check.rs +368 -0
- data/vendor/pigeonhole/src/db.rs +2324 -0
- data/vendor/pigeonhole/src/doc_support.rs +89 -0
- data/vendor/pigeonhole/src/error.rs +257 -0
- data/vendor/pigeonhole/src/feed.rs +696 -0
- data/vendor/pigeonhole/src/info.rs +425 -0
- data/vendor/pigeonhole/src/lib.rs +202 -0
- data/vendor/pigeonhole/src/merge.rs +135 -0
- data/vendor/pigeonhole/src/metrics.rs +476 -0
- data/vendor/pigeonhole/src/nonblocking.rs +666 -0
- data/vendor/pigeonhole/src/options.rs +2075 -0
- data/vendor/pigeonhole/src/read/budget.rs +584 -0
- data/vendor/pigeonhole/src/read.rs +2463 -0
- data/vendor/pigeonhole/src/recovery.rs +876 -0
- data/vendor/pigeonhole/src/retry.rs +358 -0
- data/vendor/pigeonhole/src/set.rs +103 -0
- data/vendor/pigeonhole/src/table.rs +861 -0
- data/vendor/pigeonhole/src/vector.rs +351 -0
- data/vendor/pigeonhole/src/write.rs +2815 -0
- data/vendor/runtime/Cargo.toml +21 -0
- data/vendor/runtime/LICENSE +21 -0
- data/vendor/runtime/README.md +5 -0
- data/vendor/runtime/src/completion.rs +629 -0
- data/vendor/runtime/src/drivers.rs +1175 -0
- data/vendor/runtime/src/lib.rs +1546 -0
- data/vendor/runtime/src/pool.rs +992 -0
- data/vendor/runtime/src/sched.rs +809 -0
- data/vendor/runtime/src/signal.rs +532 -0
- data/vendor/runtime/src/submit_gate.rs +144 -0
- data/vendor/shm/Cargo.toml +24 -0
- data/vendor/shm/LICENSE +21 -0
- data/vendor/shm/README.md +5 -0
- data/vendor/shm/src/lib.rs +427 -0
- data/vendor/shm/src/lock.rs +153 -0
- data/vendor/shm/src/region.rs +1609 -0
- data/vendor/sst/Cargo.toml +26 -0
- data/vendor/sst/LICENSE +21 -0
- data/vendor/sst/README.md +5 -0
- data/vendor/sst/src/blob.rs +380 -0
- data/vendor/sst/src/iter.rs +803 -0
- data/vendor/sst/src/lib.rs +695 -0
- data/vendor/sst/src/reader.rs +814 -0
- data/vendor/sst/src/writer.rs +596 -0
- data/vendor/text/Cargo.toml +26 -0
- data/vendor/text/LICENSE +21 -0
- data/vendor/text/README.md +9 -0
- data/vendor/text/src/error.rs +108 -0
- data/vendor/text/src/fuzzy.rs +265 -0
- data/vendor/text/src/highlight.rs +236 -0
- data/vendor/text/src/index.rs +1152 -0
- data/vendor/text/src/layout.rs +424 -0
- data/vendor/text/src/lib.rs +75 -0
- data/vendor/text/src/maxscore.rs +658 -0
- data/vendor/text/src/query.rs +450 -0
- data/vendor/text/src/search.rs +569 -0
- data/vendor/text/src/sloppy.rs +460 -0
- data/vendor/text/src/tokenizer.rs +163 -0
- data/vendor/vector/Cargo.toml +28 -0
- data/vendor/vector/LICENSE +21 -0
- data/vendor/vector/README.md +9 -0
- data/vendor/vector/src/error.rs +63 -0
- data/vendor/vector/src/half.rs +167 -0
- data/vendor/vector/src/hooks.rs +135 -0
- data/vendor/vector/src/index.rs +2690 -0
- data/vendor/vector/src/layout.rs +102 -0
- data/vendor/vector/src/lib.rs +52 -0
- data/vendor/vector/src/point.rs +500 -0
- data/vendor/vector/src/rebalancer.rs +200 -0
- data/vendor/vector/src/registry.rs +81 -0
- data/vendor/wal/Cargo.toml +25 -0
- data/vendor/wal/LICENSE +21 -0
- data/vendor/wal/README.md +5 -0
- data/vendor/wal/src/feed.rs +610 -0
- data/vendor/wal/src/foreground.rs +122 -0
- data/vendor/wal/src/lib.rs +458 -0
- data/vendor/wal/src/mem.rs +166 -0
- data/vendor/wal/src/recovery.rs +426 -0
- data/vendor/wal/src/stream.rs +2382 -0
- metadata +1310 -0
|
@@ -0,0 +1,2057 @@
|
|
|
1
|
+
//! Bounded-result read pushdown (D296, #490 A): a visitor runs on each resolved cell of the
|
|
2
|
+
//! input, where the scan would have handed it out, and a reducer keeps a bounded result (the
|
|
3
|
+
//! k best, the first n, one per key). Only the reducer's result leaves the read.
|
|
4
|
+
//!
|
|
5
|
+
//! The scan's own code ([`super::ScanCursor`]) is untouched: this module's loop is a sibling
|
|
6
|
+
//! that drives the same per-family [`Lane`]s (resolver over the tablet's sources), so the
|
|
7
|
+
//! visitor sees exactly what a scan returns (snapshot, deletes, TTL, versions, merges and
|
|
8
|
+
//! value predicates applied) and reads each value where the lane holds it, without assembling
|
|
9
|
+
//! rows. #1167 measured that any change to the scan's per-cell loop costs its shapes.
|
|
10
|
+
//!
|
|
11
|
+
//! Work is cut at tablet boundaries into groups. Each group has its own visitor and reducer,
|
|
12
|
+
//! and stops only on its own account (a visitor's [`Visit::Stop`], or its reducer's `Break`):
|
|
13
|
+
//! no group stops because of another, so a group's result is a function of its key range at
|
|
14
|
+
//! the snapshot, and merging the groups' results gives exactly the sequential result at any
|
|
15
|
+
//! fan-out (D296 rev 1.2). The one shared flag ends every group on an error.
|
|
16
|
+
|
|
17
|
+
use std::ops::{Bound, ControlFlow};
|
|
18
|
+
use std::sync::Arc;
|
|
19
|
+
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
|
|
20
|
+
|
|
21
|
+
use pigeonhole_format::key::{Escaped, TERMINATOR, encode_row_prefix};
|
|
22
|
+
use pigeonhole_format::{Cursor, FamilyId, TableId, Timestamp};
|
|
23
|
+
|
|
24
|
+
use super::keys::{KeyCursor, KeyGroup, KeySet, key_groups};
|
|
25
|
+
use super::{
|
|
26
|
+
FORK_CHECK_ROWS, Lane, LaneValue, MergeKind, ReadSpec, clamp_into, column_of, give_back,
|
|
27
|
+
past_row, row_of, skips_columns, take_scan_resolver,
|
|
28
|
+
};
|
|
29
|
+
use crate::catalog::FamilyMeta;
|
|
30
|
+
use crate::snapshot::{Snapshot, SstSet, TabletEntry, View};
|
|
31
|
+
use crate::source::{Located, Pinned, Source};
|
|
32
|
+
use crate::{ColumnPosition, Error, Result};
|
|
33
|
+
|
|
34
|
+
/// A row range on unescaped row keys, `(start, end)`.
|
|
35
|
+
pub type RowRange = (Bound<Vec<u8>>, Bound<Vec<u8>>);
|
|
36
|
+
|
|
37
|
+
/// What a bounded read reads.
|
|
38
|
+
#[derive(Debug, Clone)]
|
|
39
|
+
#[non_exhaustive]
|
|
40
|
+
pub enum ReadInput {
|
|
41
|
+
/// Row ranges, sorted and disjoint, each `(start, end)` on unescaped row keys. One range
|
|
42
|
+
/// is a scan's input; several cover, for example, an IVF index's probed partitions in one
|
|
43
|
+
/// read under one snapshot.
|
|
44
|
+
Ranges(Vec<RowRange>),
|
|
45
|
+
/// Rows by key (D299's multi-get, #489): sorted and distinct by construction, read with
|
|
46
|
+
/// one forward cursor per source per tablet group.
|
|
47
|
+
Keys(Arc<KeySet>),
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/// What a [`CellVisitor`] tells the read to do after one cell.
|
|
51
|
+
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
52
|
+
pub enum Visit<I> {
|
|
53
|
+
/// Nothing from this cell; go on to the next.
|
|
54
|
+
Skip,
|
|
55
|
+
/// Push `I` to the reducer and go on.
|
|
56
|
+
Emit(I),
|
|
57
|
+
/// Push `I`, then skip the rest of this row (a seek past it, not a walk).
|
|
58
|
+
EmitAndNextRow(I),
|
|
59
|
+
/// Skip the rest of this row.
|
|
60
|
+
NextRow,
|
|
61
|
+
/// End this group's read.
|
|
62
|
+
Stop,
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/// Runs on each resolved cell of a bounded read.
|
|
66
|
+
pub trait CellVisitor {
|
|
67
|
+
/// What it hands the reducer.
|
|
68
|
+
type Item;
|
|
69
|
+
|
|
70
|
+
/// Whether [`visit`](Self::visit) reads its `qualifier`. A visitor that doesn't (a
|
|
71
|
+
/// nearest-neighbour search scores the value alone) gets an empty one, and a range read
|
|
72
|
+
/// unescapes the qualifier only for an item the reducer [`admits`](Reducer::admits)
|
|
73
|
+
/// (#1283 lever 1). A constant, so a visitor that reads it compiles as before.
|
|
74
|
+
const QUALIFIER: bool = true;
|
|
75
|
+
|
|
76
|
+
/// One cell, borrowed for the call: `row` and `qualifier` unescaped, `value` the stored
|
|
77
|
+
/// value with its tag byte (in place where the source holds it).
|
|
78
|
+
fn visit(
|
|
79
|
+
&mut self,
|
|
80
|
+
row: &[u8],
|
|
81
|
+
family: FamilyId,
|
|
82
|
+
qualifier: &[u8],
|
|
83
|
+
ts: Timestamp,
|
|
84
|
+
value: &[u8],
|
|
85
|
+
) -> Visit<Self::Item>;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/// The cell an item came from, borrowed for a [`Reducer::push`]. Cells order as a scan hands
|
|
89
|
+
/// them out: by row, then family in the read's family order, then qualifier, then newest
|
|
90
|
+
/// version first. That is a total order over a read's cells.
|
|
91
|
+
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
92
|
+
pub struct CellRef<'a> {
|
|
93
|
+
/// Unescaped row key.
|
|
94
|
+
pub row: &'a [u8],
|
|
95
|
+
/// The family's position in the read's family order (the scan's).
|
|
96
|
+
pub family_rank: u32,
|
|
97
|
+
/// The family.
|
|
98
|
+
pub family: FamilyId,
|
|
99
|
+
/// Unescaped qualifier.
|
|
100
|
+
pub qualifier: &'a [u8],
|
|
101
|
+
/// The version's timestamp.
|
|
102
|
+
pub ts: Timestamp,
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
impl CellRef<'_> {
|
|
106
|
+
fn order(&self) -> (&[u8], u32, &[u8], std::cmp::Reverse<Timestamp>) {
|
|
107
|
+
(
|
|
108
|
+
self.row,
|
|
109
|
+
self.family_rank,
|
|
110
|
+
self.qualifier,
|
|
111
|
+
std::cmp::Reverse(self.ts),
|
|
112
|
+
)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/// An owned copy.
|
|
116
|
+
pub fn to_key(&self) -> CellKey {
|
|
117
|
+
CellKey {
|
|
118
|
+
row: self.row.to_vec(),
|
|
119
|
+
family_rank: self.family_rank,
|
|
120
|
+
family: self.family,
|
|
121
|
+
qualifier: self.qualifier.to_vec(),
|
|
122
|
+
ts: self.ts,
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
impl PartialOrd for CellRef<'_> {
|
|
128
|
+
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
|
|
129
|
+
Some(self.cmp(other))
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
impl Ord for CellRef<'_> {
|
|
134
|
+
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
|
|
135
|
+
self.order().cmp(&other.order())
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/// An owned [`CellRef`]: a result's cell, ordered the same way.
|
|
140
|
+
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
|
141
|
+
pub struct CellKey {
|
|
142
|
+
/// Unescaped row key.
|
|
143
|
+
pub row: Vec<u8>,
|
|
144
|
+
/// The family's position in the read's family order.
|
|
145
|
+
pub family_rank: u32,
|
|
146
|
+
/// The family.
|
|
147
|
+
pub family: FamilyId,
|
|
148
|
+
/// Unescaped qualifier.
|
|
149
|
+
pub qualifier: Vec<u8>,
|
|
150
|
+
/// The version's timestamp.
|
|
151
|
+
pub ts: Timestamp,
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
impl CellKey {
|
|
155
|
+
/// This key, borrowed.
|
|
156
|
+
pub fn as_ref(&self) -> CellRef<'_> {
|
|
157
|
+
CellRef {
|
|
158
|
+
row: &self.row,
|
|
159
|
+
family_rank: self.family_rank,
|
|
160
|
+
family: self.family,
|
|
161
|
+
qualifier: &self.qualifier,
|
|
162
|
+
ts: self.ts,
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
impl PartialOrd for CellKey {
|
|
168
|
+
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
|
|
169
|
+
Some(self.cmp(other))
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
impl Ord for CellKey {
|
|
174
|
+
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
|
|
175
|
+
self.as_ref().cmp(&other.as_ref())
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/// Keeps a bounded result. `merge` must be associative and commutative, and the result a
|
|
180
|
+
/// function of the multiset of pushes, so fan-out equals the sequential read.
|
|
181
|
+
pub trait Reducer: Send {
|
|
182
|
+
/// What it keeps.
|
|
183
|
+
type Item: Send;
|
|
184
|
+
|
|
185
|
+
/// One item from `cell`. A group pushes in cell order. `Break` ends this group's read
|
|
186
|
+
/// (the reducer is full, or has all it can take).
|
|
187
|
+
fn push(&mut self, cell: CellRef<'_>, item: Self::Item) -> ControlFlow<()>;
|
|
188
|
+
|
|
189
|
+
/// Whether `item` could be kept, judged before its cell is built: `false` only when
|
|
190
|
+
/// [`push`](Self::push) would drop it whatever its cell, and then it isn't pushed (#1283
|
|
191
|
+
/// lever 1). It never changes what is kept: an item that ties the bound is admitted, and
|
|
192
|
+
/// `push` breaks the tie by cell.
|
|
193
|
+
#[inline]
|
|
194
|
+
fn admits(&self, _item: &Self::Item) -> bool {
|
|
195
|
+
true
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/// Folds another group's result in.
|
|
199
|
+
fn merge(&mut self, other: Self);
|
|
200
|
+
|
|
201
|
+
/// The result, in the reducer's order.
|
|
202
|
+
fn finish(self) -> Vec<(CellKey, Self::Item)>;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/// A bounded read's input, per-row selection and fan-out.
|
|
206
|
+
#[derive(Debug, Clone)]
|
|
207
|
+
#[non_exhaustive]
|
|
208
|
+
pub struct ReduceSpec {
|
|
209
|
+
/// The rows read.
|
|
210
|
+
pub input: ReadInput,
|
|
211
|
+
/// Families, qualifier selection, time range, value predicates and versions, as for a scan.
|
|
212
|
+
pub read: ReadSpec,
|
|
213
|
+
/// Threads the call may use (1 = the caller's only). More run tablet groups on scoped
|
|
214
|
+
/// threads owned by the call, never the engine's: only when the input is large enough to
|
|
215
|
+
/// pay for them (`parallel_floor` estimated entries per thread), and never on a thread
|
|
216
|
+
/// that drives a shard (D88).
|
|
217
|
+
pub parallelism: usize,
|
|
218
|
+
/// Estimated entries per thread below which a read does not fan out
|
|
219
|
+
/// ([`PARALLEL_FLOOR_ENTRIES`] by default; 0 fans out whenever there are groups). For a
|
|
220
|
+
/// [`ReadInput::Keys`] input it counts keys: a key set's rows are not estimated before
|
|
221
|
+
/// they are read. Key groups are per tablet, so keys inside one tablet never fan out.
|
|
222
|
+
pub parallel_floor: u64,
|
|
223
|
+
/// D308: the read of this row (unescaped), if the input reaches it, resumes after this
|
|
224
|
+
/// column: families the read selects before the position's skip the row, the
|
|
225
|
+
/// position's family starts past the column (all its versions), and later families
|
|
226
|
+
/// start at the selection's own bound. Other rows are read as usual. A position from
|
|
227
|
+
/// another table, or whose family the read doesn't select, is `InvalidArgument`; so is
|
|
228
|
+
/// one whose row a range excludes by its start (`Bound::Excluded(row)`): the row would be
|
|
229
|
+
/// skipped whole, so a range resumed in a row starts at `Bound::Included(row)`.
|
|
230
|
+
pub resume: Option<(Vec<u8>, ColumnPosition)>,
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
impl ReduceSpec {
|
|
234
|
+
/// `input` with the default selection, on the caller's thread.
|
|
235
|
+
pub fn new(input: ReadInput) -> Self {
|
|
236
|
+
Self {
|
|
237
|
+
input,
|
|
238
|
+
read: ReadSpec::default(),
|
|
239
|
+
parallelism: 1,
|
|
240
|
+
parallel_floor: PARALLEL_FLOOR_ENTRIES,
|
|
241
|
+
resume: None,
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/// A bounded read's result and counts.
|
|
247
|
+
#[derive(Debug)]
|
|
248
|
+
#[non_exhaustive]
|
|
249
|
+
pub struct Reduced<I> {
|
|
250
|
+
/// `(cell, item)`, in the reducer's order.
|
|
251
|
+
pub items: Vec<(CellKey, I)>,
|
|
252
|
+
/// Counts over every group.
|
|
253
|
+
pub stats: ReduceStats,
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/// Counts of a bounded read.
|
|
257
|
+
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
|
|
258
|
+
#[non_exhaustive]
|
|
259
|
+
pub struct ReduceStats {
|
|
260
|
+
/// Tablet groups read.
|
|
261
|
+
pub groups: u64,
|
|
262
|
+
/// Rows the visitor saw a cell of.
|
|
263
|
+
pub rows: u64,
|
|
264
|
+
/// Cells the visitor saw.
|
|
265
|
+
pub cells: u64,
|
|
266
|
+
/// Threads used (1 when the read ran on the caller's thread).
|
|
267
|
+
pub threads: u64,
|
|
268
|
+
/// Lanes read straight from their one SST, with nothing to resolve (#1283 lever 3).
|
|
269
|
+
pub plain_lanes: u64,
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
impl ReduceStats {
|
|
273
|
+
fn add(&mut self, o: &ReduceStats) {
|
|
274
|
+
self.groups += o.groups;
|
|
275
|
+
self.rows += o.rows;
|
|
276
|
+
self.cells += o.cells;
|
|
277
|
+
self.plain_lanes += o.plain_lanes;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/// Estimated entries a tablet group must hold, on average, before a read fans out: about
|
|
282
|
+
/// 20,000 rows at today's per-row cost is some 2 ms, against 10-20 µs to start a thread
|
|
283
|
+
/// (D296 rev 1, perf287's work floor).
|
|
284
|
+
pub const PARALLEL_FLOOR_ENTRIES: u64 = 20_000;
|
|
285
|
+
|
|
286
|
+
/// One tablet's share of one input range.
|
|
287
|
+
struct Group<'a> {
|
|
288
|
+
tablet: &'a TabletEntry,
|
|
289
|
+
/// The range, unescaped (for the excluded start and the end check).
|
|
290
|
+
start: &'a Bound<Vec<u8>>,
|
|
291
|
+
end: &'a Bound<Vec<u8>>,
|
|
292
|
+
/// The range clamped to the tablet, as row prefixes (`None` = unbounded).
|
|
293
|
+
lo: Option<Vec<u8>>,
|
|
294
|
+
hi: Option<Vec<u8>>,
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/// A unit of a bounded read: one tablet's share of a range, or one tablet's run of keys.
|
|
298
|
+
enum Work<'a> {
|
|
299
|
+
Range(Group<'a>),
|
|
300
|
+
Keys(KeyGroup),
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/// Cuts `input` into work units, in key order.
|
|
304
|
+
fn work<'a>(snapshot: &'a Snapshot, table: TableId, input: &'a ReadInput) -> Result<Vec<Work<'a>>> {
|
|
305
|
+
match input {
|
|
306
|
+
ReadInput::Ranges(ranges) => Ok(groups(&snapshot.view, table, ranges)?
|
|
307
|
+
.into_iter()
|
|
308
|
+
.map(Work::Range)
|
|
309
|
+
.collect()),
|
|
310
|
+
ReadInput::Keys(keys) => Ok(key_groups(snapshot, table, keys)?
|
|
311
|
+
.into_iter()
|
|
312
|
+
.map(Work::Keys)
|
|
313
|
+
.collect()),
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/// Cuts row ranges into tablet groups, in key order.
|
|
318
|
+
fn groups<'a>(view: &'a View, table: TableId, ranges: &'a [RowRange]) -> Result<Vec<Group<'a>>> {
|
|
319
|
+
// Sorted and disjoint, or a cell would be visited (and counted by a reducer) twice.
|
|
320
|
+
for pair in ranges.windows(2) {
|
|
321
|
+
if !before(&pair[0].1, &pair[1].0) {
|
|
322
|
+
return Err(Error::InvalidArgument(
|
|
323
|
+
"bounded read: the ranges must be sorted and disjoint".to_owned(),
|
|
324
|
+
));
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
let mut out = Vec::new();
|
|
328
|
+
let (mut lo, mut hi) = (Vec::new(), Vec::new());
|
|
329
|
+
for (start, end) in ranges {
|
|
330
|
+
let s = match start {
|
|
331
|
+
Bound::Included(s) | Bound::Excluded(s) => {
|
|
332
|
+
let mut k = Vec::new();
|
|
333
|
+
encode_row_prefix(&mut k, s)?;
|
|
334
|
+
Some(k)
|
|
335
|
+
}
|
|
336
|
+
Bound::Unbounded => None,
|
|
337
|
+
};
|
|
338
|
+
let e = match end {
|
|
339
|
+
Bound::Excluded(e) => {
|
|
340
|
+
let mut k = Vec::new();
|
|
341
|
+
encode_row_prefix(&mut k, e)?;
|
|
342
|
+
Some(k)
|
|
343
|
+
}
|
|
344
|
+
Bound::Included(e) => {
|
|
345
|
+
let mut k = Vec::new();
|
|
346
|
+
encode_row_prefix(&mut k, e)?;
|
|
347
|
+
let mut past = Vec::new();
|
|
348
|
+
past_row(&k, &mut past);
|
|
349
|
+
Some(past)
|
|
350
|
+
}
|
|
351
|
+
Bound::Unbounded => None,
|
|
352
|
+
};
|
|
353
|
+
for tablet in view.tablets().tablets_of(table) {
|
|
354
|
+
let (has_lo, has_hi) =
|
|
355
|
+
clamp_into(tablet, s.as_deref(), e.as_deref(), &mut lo, &mut hi)?;
|
|
356
|
+
if has_lo && has_hi && lo >= hi {
|
|
357
|
+
continue;
|
|
358
|
+
}
|
|
359
|
+
out.push(Group {
|
|
360
|
+
tablet,
|
|
361
|
+
start,
|
|
362
|
+
end,
|
|
363
|
+
lo: has_lo.then(|| lo.clone()),
|
|
364
|
+
hi: has_hi.then(|| hi.clone()),
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
Ok(out)
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/// Whether every row a range ending at `end` holds comes before every row a range starting
|
|
372
|
+
/// at `start` holds.
|
|
373
|
+
fn before(end: &Bound<Vec<u8>>, start: &Bound<Vec<u8>>) -> bool {
|
|
374
|
+
match (end, start) {
|
|
375
|
+
(Bound::Unbounded, _) | (_, Bound::Unbounded) => false,
|
|
376
|
+
(Bound::Included(e), Bound::Included(s)) => e < s,
|
|
377
|
+
(Bound::Included(e) | Bound::Excluded(e), Bound::Excluded(s))
|
|
378
|
+
| (Bound::Excluded(e), Bound::Included(s)) => e <= s,
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/// Entries the group's sources hold (SSTs it may read, memtables): an over-estimate after a
|
|
383
|
+
/// split, enough to decide whether fan-out pays.
|
|
384
|
+
fn estimate(view: &View, families: &[FamilyId], g: &Group<'_>) -> u64 {
|
|
385
|
+
let mut n = 0;
|
|
386
|
+
for &family in families {
|
|
387
|
+
let located = view.locate(g.tablet.shard, g.tablet.id, family);
|
|
388
|
+
if let Some(ssts) = located.ssts {
|
|
389
|
+
n += ssts
|
|
390
|
+
.levels
|
|
391
|
+
.iter()
|
|
392
|
+
.flatten()
|
|
393
|
+
.map(|s| s.meta.entries)
|
|
394
|
+
.sum::<u64>();
|
|
395
|
+
}
|
|
396
|
+
if let Some(mems) = located.mems {
|
|
397
|
+
n += mems.readers.iter().map(|r| r.len() as u64).sum::<u64>();
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
n
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/// What a group's read needs from the call.
|
|
404
|
+
struct Ctx<'a> {
|
|
405
|
+
snapshot: &'a Snapshot,
|
|
406
|
+
/// For the `Keys` input's cursors (their async-read counters).
|
|
407
|
+
shared: &'a Arc<crate::shard::Shared>,
|
|
408
|
+
input: &'a ReadInput,
|
|
409
|
+
families: &'a [FamilyId],
|
|
410
|
+
read: &'a ReadSpec,
|
|
411
|
+
now: Timestamp,
|
|
412
|
+
abort: &'a AtomicBool,
|
|
413
|
+
resume: Option<&'a Resume>,
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/// [`ReduceSpec::resume`], checked and encoded: the row, the position's family's rank in the
|
|
417
|
+
/// read's family order, and the key just past every version of the column.
|
|
418
|
+
pub(super) struct Resume {
|
|
419
|
+
row: Vec<u8>,
|
|
420
|
+
rank: u32,
|
|
421
|
+
past: Vec<u8>,
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
impl Resume {
|
|
425
|
+
pub(super) fn new(
|
|
426
|
+
table: TableId,
|
|
427
|
+
families: &[FamilyId],
|
|
428
|
+
(row, pos): &(Vec<u8>, ColumnPosition),
|
|
429
|
+
) -> Result<Self> {
|
|
430
|
+
if pos.table() != table {
|
|
431
|
+
return Err(Error::InvalidArgument(
|
|
432
|
+
"a position from another table".to_owned(),
|
|
433
|
+
));
|
|
434
|
+
}
|
|
435
|
+
let Some(rank) = families.iter().position(|f| *f == pos.family()) else {
|
|
436
|
+
return Err(Error::InvalidArgument(
|
|
437
|
+
"a position whose family the read does not select".to_owned(),
|
|
438
|
+
));
|
|
439
|
+
};
|
|
440
|
+
let mut col = Vec::new();
|
|
441
|
+
pigeonhole_format::key::encode_column_prefix(&mut col, row, pos.qualifier())?;
|
|
442
|
+
let mut past = Vec::new();
|
|
443
|
+
past_row(&col, &mut past);
|
|
444
|
+
Ok(Self {
|
|
445
|
+
row: row.clone(),
|
|
446
|
+
rank: rank as u32,
|
|
447
|
+
past,
|
|
448
|
+
})
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
/// Whether `row` (unescaped) is the position's row.
|
|
452
|
+
pub(super) fn is(&self, row: &[u8]) -> bool {
|
|
453
|
+
self.row == row
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
/// Positions the lane of family rank `rank`, pending in the position's row (escaped as
|
|
457
|
+
/// `row_esc`), as the resume says: dropped from the row, moved past the column, or left.
|
|
458
|
+
pub(super) fn apply<L: ReduceLane>(
|
|
459
|
+
&self,
|
|
460
|
+
lane: &mut L,
|
|
461
|
+
rank: u32,
|
|
462
|
+
row_esc: &[u8],
|
|
463
|
+
) -> Result<()> {
|
|
464
|
+
if !in_row(lane, row_esc) {
|
|
465
|
+
return Ok(());
|
|
466
|
+
}
|
|
467
|
+
match rank.cmp(&self.rank) {
|
|
468
|
+
std::cmp::Ordering::Less => lane.drop_row(),
|
|
469
|
+
std::cmp::Ordering::Equal => {
|
|
470
|
+
if lane.col() < self.past.as_slice() {
|
|
471
|
+
lane.reseek(&self.past)?;
|
|
472
|
+
}
|
|
473
|
+
Ok(())
|
|
474
|
+
}
|
|
475
|
+
std::cmp::Ordering::Greater => Ok(()),
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
/// A lane `visit_lanes` reads: a [`Lane`] (through the MVCC resolver), or a [`PlainLane`]
|
|
481
|
+
/// (#1283 lever 3). A group reads through one kind only, so each is its own instance of the
|
|
482
|
+
/// loop, and neither pays a dispatch per cell.
|
|
483
|
+
pub(super) trait ReduceLane {
|
|
484
|
+
/// The lane's family.
|
|
485
|
+
fn family(&self) -> FamilyId;
|
|
486
|
+
/// A cell is held (fetched, not yet handed on).
|
|
487
|
+
fn pending(&self) -> bool;
|
|
488
|
+
/// No cell is left.
|
|
489
|
+
fn done(&self) -> bool;
|
|
490
|
+
/// The held cell's timestamp.
|
|
491
|
+
fn ts(&self) -> Timestamp;
|
|
492
|
+
/// Moves to the next visible cell.
|
|
493
|
+
fn fetch(&mut self) -> Result<()>;
|
|
494
|
+
/// The held cell's column prefix (only while pending).
|
|
495
|
+
fn col(&self) -> &[u8];
|
|
496
|
+
/// The held cell's stored value (only while pending).
|
|
497
|
+
fn value(&self) -> &[u8];
|
|
498
|
+
/// Drops the held cell and the rest of its row.
|
|
499
|
+
fn drop_row(&mut self) -> Result<()>;
|
|
500
|
+
/// Drops the held cell and holds the first visible one at or after `key`.
|
|
501
|
+
fn reseek(&mut self, key: &[u8]) -> Result<()>;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
impl ReduceLane for Lane {
|
|
505
|
+
#[inline]
|
|
506
|
+
fn family(&self) -> FamilyId {
|
|
507
|
+
self.family
|
|
508
|
+
}
|
|
509
|
+
#[inline]
|
|
510
|
+
fn pending(&self) -> bool {
|
|
511
|
+
self.pending
|
|
512
|
+
}
|
|
513
|
+
#[inline]
|
|
514
|
+
fn done(&self) -> bool {
|
|
515
|
+
self.done
|
|
516
|
+
}
|
|
517
|
+
#[inline]
|
|
518
|
+
fn ts(&self) -> Timestamp {
|
|
519
|
+
self.ts
|
|
520
|
+
}
|
|
521
|
+
#[inline]
|
|
522
|
+
fn fetch(&mut self) -> Result<()> {
|
|
523
|
+
Lane::fetch(self)
|
|
524
|
+
}
|
|
525
|
+
#[inline]
|
|
526
|
+
fn col(&self) -> &[u8] {
|
|
527
|
+
Lane::col(self)
|
|
528
|
+
}
|
|
529
|
+
#[inline]
|
|
530
|
+
fn value(&self) -> &[u8] {
|
|
531
|
+
Lane::value(self)
|
|
532
|
+
}
|
|
533
|
+
fn drop_row(&mut self) -> Result<()> {
|
|
534
|
+
self.pending = false;
|
|
535
|
+
self.resolver.skip_row()
|
|
536
|
+
}
|
|
537
|
+
fn reseek(&mut self, key: &[u8]) -> Result<()> {
|
|
538
|
+
self.pending = false;
|
|
539
|
+
self.pinned = None;
|
|
540
|
+
self.resolver.seek(key)?;
|
|
541
|
+
Lane::fetch(self)
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
/// A lane over the one SST source of its family in the tablet, when nothing in it needs the
|
|
546
|
+
/// MVCC resolver (#1283 lever 3, [`plain_lane`]). A column's first entry in key order is
|
|
547
|
+
/// then its version (newest timestamp, then newest seqno), so the lane takes it from the
|
|
548
|
+
/// block as it lies and steps past the column's older entries: no merge, group walk or copy.
|
|
549
|
+
struct PlainLane {
|
|
550
|
+
family: FamilyId,
|
|
551
|
+
src: Source,
|
|
552
|
+
/// The view's SSTs and blob files, to read separated values.
|
|
553
|
+
ssts: Arc<SstSet>,
|
|
554
|
+
/// The column prefix of the cell last taken: an entry still in it is an older version.
|
|
555
|
+
col: Vec<u8>,
|
|
556
|
+
/// The group's end (an encoded row prefix), as `CellResolver::set_upper_bound`.
|
|
557
|
+
hi: Option<Vec<u8>>,
|
|
558
|
+
/// The source is on the held cell (it moves past it on the next fetch).
|
|
559
|
+
held: bool,
|
|
560
|
+
ts: Timestamp,
|
|
561
|
+
/// A separated value, read from its blob file.
|
|
562
|
+
pinned: Option<LaneValue>,
|
|
563
|
+
pending: bool,
|
|
564
|
+
done: bool,
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
impl PlainLane {
|
|
568
|
+
/// The lane `lane` (opened by `open_lanes`, plain by [`plain_lane`]) as a plain one: its
|
|
569
|
+
/// SST source, seeked to the group's start. The resolver goes back to the pool.
|
|
570
|
+
fn from_lane(mut lane: Lane, g: &Group<'_>) -> Result<PlainLane> {
|
|
571
|
+
let mut sources = std::mem::take(lane.resolver.cursor_mut().sources_mut());
|
|
572
|
+
give_back(lane.resolver);
|
|
573
|
+
// The empty memtables' sources go (`plain_lane` checked they hold nothing).
|
|
574
|
+
sources.retain(|s| matches!(s, Source::Sst(_)));
|
|
575
|
+
let mut src = sources.pop().expect("plain_lane checked one SST source");
|
|
576
|
+
src.seek(g.lo.as_deref().unwrap_or(&[]))?;
|
|
577
|
+
Ok(PlainLane {
|
|
578
|
+
family: lane.family,
|
|
579
|
+
src,
|
|
580
|
+
ssts: lane.ssts,
|
|
581
|
+
col: Vec::new(),
|
|
582
|
+
hi: g.hi.clone(),
|
|
583
|
+
held: false,
|
|
584
|
+
ts: 0,
|
|
585
|
+
pinned: None,
|
|
586
|
+
pending: false,
|
|
587
|
+
done: false,
|
|
588
|
+
})
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
impl ReduceLane for PlainLane {
|
|
593
|
+
#[inline]
|
|
594
|
+
fn family(&self) -> FamilyId {
|
|
595
|
+
self.family
|
|
596
|
+
}
|
|
597
|
+
#[inline]
|
|
598
|
+
fn pending(&self) -> bool {
|
|
599
|
+
self.pending
|
|
600
|
+
}
|
|
601
|
+
#[inline]
|
|
602
|
+
fn done(&self) -> bool {
|
|
603
|
+
self.done
|
|
604
|
+
}
|
|
605
|
+
#[inline]
|
|
606
|
+
fn ts(&self) -> Timestamp {
|
|
607
|
+
self.ts
|
|
608
|
+
}
|
|
609
|
+
fn fetch(&mut self) -> Result<()> {
|
|
610
|
+
self.pending = false;
|
|
611
|
+
self.pinned = None;
|
|
612
|
+
if self.done {
|
|
613
|
+
return Ok(());
|
|
614
|
+
}
|
|
615
|
+
if std::mem::take(&mut self.held) {
|
|
616
|
+
self.src.next()?;
|
|
617
|
+
}
|
|
618
|
+
while self.src.valid() {
|
|
619
|
+
let key = self.src.key();
|
|
620
|
+
if self.hi.as_deref().is_some_and(|hi| key >= hi) {
|
|
621
|
+
break;
|
|
622
|
+
}
|
|
623
|
+
let (col, ts, _, kind) = pigeonhole_format::key::split_suffix(key)?;
|
|
624
|
+
if col == self.col.as_slice() {
|
|
625
|
+
// An older version of the column just taken.
|
|
626
|
+
self.src.next()?;
|
|
627
|
+
continue;
|
|
628
|
+
}
|
|
629
|
+
if kind != pigeonhole_format::Kind::Put {
|
|
630
|
+
// `plain_lane` checked the SSTs hold no deletes, and the family no operands.
|
|
631
|
+
return Err(Error::Corruption(
|
|
632
|
+
"an entry other than a put in an SST counted without deletes or operands"
|
|
633
|
+
.into(),
|
|
634
|
+
));
|
|
635
|
+
}
|
|
636
|
+
self.col.clear();
|
|
637
|
+
self.col.extend_from_slice(col);
|
|
638
|
+
self.held = true;
|
|
639
|
+
self.ts = ts;
|
|
640
|
+
if let Some(v) = self.ssts.read_blob(self.src.value())? {
|
|
641
|
+
self.pinned = Some(LaneValue::Pinned(Pinned::Block(v)));
|
|
642
|
+
}
|
|
643
|
+
self.pending = true;
|
|
644
|
+
return Ok(());
|
|
645
|
+
}
|
|
646
|
+
self.done = true;
|
|
647
|
+
Ok(())
|
|
648
|
+
}
|
|
649
|
+
#[inline]
|
|
650
|
+
fn col(&self) -> &[u8] {
|
|
651
|
+
column_of(self.src.key())
|
|
652
|
+
}
|
|
653
|
+
#[inline]
|
|
654
|
+
fn value(&self) -> &[u8] {
|
|
655
|
+
match &self.pinned {
|
|
656
|
+
Some(v) => v,
|
|
657
|
+
None => self.src.value(),
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
fn drop_row(&mut self) -> Result<()> {
|
|
661
|
+
// The source is on the held cell, in the row: skip from there.
|
|
662
|
+
self.pending = false;
|
|
663
|
+
self.held = false;
|
|
664
|
+
self.src.skip_row()
|
|
665
|
+
}
|
|
666
|
+
fn reseek(&mut self, key: &[u8]) -> Result<()> {
|
|
667
|
+
self.pending = false;
|
|
668
|
+
self.held = false;
|
|
669
|
+
self.col.clear();
|
|
670
|
+
self.src.seek(key)?;
|
|
671
|
+
self.fetch()
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
/// Whether a lane with `sources` (filled for `located` with `filter`) and options `opts` can
|
|
676
|
+
/// read plain ([`PlainLane`]) at read point `snapshot`. Checked once, when the lane opens
|
|
677
|
+
/// (simp724's review on #1283):
|
|
678
|
+
/// 1. one SST source (an SST, or one level's SSTs), and every memtable of the family here
|
|
679
|
+
/// empty. `scan_sources_located` adds a source for every memtable, the empty active one
|
|
680
|
+
/// included; one empty when the lane opens holds nothing at or below the read point,
|
|
681
|
+
/// since every commit there applied before the read point became visible;
|
|
682
|
+
/// 2. no delete entries (cell, column or family: `SstMeta::deletes` counts every kind) in
|
|
683
|
+
/// any of the family's SSTs here;
|
|
684
|
+
/// 3. every entry at or below the read point;
|
|
685
|
+
/// 4. a standard or vector family (plain puts) with no merge operator, known or not;
|
|
686
|
+
/// 5. one version, no time range (the resolver's or the filter's), no column limit and no
|
|
687
|
+
/// value predicate;
|
|
688
|
+
/// 6. no TTL.
|
|
689
|
+
fn plain_lane(
|
|
690
|
+
located: &Located<'_>,
|
|
691
|
+
meta: &FamilyMeta,
|
|
692
|
+
opts: &pigeonhole_compaction::ResolveOptions,
|
|
693
|
+
filter: &pigeonhole_format::scan::ScanFilter,
|
|
694
|
+
sources: &[Source],
|
|
695
|
+
snapshot: pigeonhole_format::Seqno,
|
|
696
|
+
) -> bool {
|
|
697
|
+
let Some(ssts) = located.ssts else {
|
|
698
|
+
return false;
|
|
699
|
+
};
|
|
700
|
+
sources.iter().filter(|s| matches!(s, Source::Sst(_))).count() == 1
|
|
701
|
+
&& located
|
|
702
|
+
.mems
|
|
703
|
+
.is_none_or(|m| m.readers.iter().all(|r| r.is_empty()))
|
|
704
|
+
&& ssts
|
|
705
|
+
.iter()
|
|
706
|
+
.all(|s| s.meta.deletes == 0 && s.meta.seqno_range.1 <= snapshot)
|
|
707
|
+
// A kind added later stays out until listed here.
|
|
708
|
+
&& matches!(
|
|
709
|
+
meta.options.kind,
|
|
710
|
+
pigeonhole_format::manifest::FamilyKind::Standard
|
|
711
|
+
| pigeonhole_format::manifest::FamilyKind::Vector
|
|
712
|
+
)
|
|
713
|
+
// `merge_op` alone is also `None` for an operator this build doesn't know
|
|
714
|
+
// (`MergeKind::Unknown`), whose operands are still there.
|
|
715
|
+
&& meta.merge == MergeKind::None
|
|
716
|
+
&& meta.merge_op.is_none()
|
|
717
|
+
&& meta.options.ttl_micros == 0
|
|
718
|
+
&& opts.versions == 1
|
|
719
|
+
&& opts.time_range.is_none()
|
|
720
|
+
&& filter.time_range.is_none()
|
|
721
|
+
&& opts.columns_per_row == 0
|
|
722
|
+
&& opts.value.is_none()
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
/// Opens the group's lanes, one per family with data in the tablet's range, each seeked to
|
|
726
|
+
/// the group's start: [`super::ScanCursor`]'s tablet opening, for one tablet.
|
|
727
|
+
fn open_lanes(
|
|
728
|
+
ctx: &Ctx<'_>,
|
|
729
|
+
g: &Group<'_>,
|
|
730
|
+
lanes: &mut Vec<Lane>,
|
|
731
|
+
plain: &mut Vec<bool>,
|
|
732
|
+
) -> Result<()> {
|
|
733
|
+
let view = &ctx.snapshot.view;
|
|
734
|
+
for &family in ctx.families {
|
|
735
|
+
let located = view.locate(g.tablet.shard, g.tablet.id, family);
|
|
736
|
+
if !located.has_data() {
|
|
737
|
+
continue;
|
|
738
|
+
}
|
|
739
|
+
let Some(meta) = view.catalog.family(family) else {
|
|
740
|
+
continue;
|
|
741
|
+
};
|
|
742
|
+
let (mut opts, filter) = ctx.read.resolve_opts(meta, ctx.snapshot.seqno, ctx.now);
|
|
743
|
+
let resolver_blobs = super::ResolverBlobs::attach(&mut opts, &view.ssts);
|
|
744
|
+
let mut resolver = take_scan_resolver();
|
|
745
|
+
let filled = view.scan_sources_located::<false>(
|
|
746
|
+
&located,
|
|
747
|
+
&filter,
|
|
748
|
+
g.lo.as_deref(),
|
|
749
|
+
g.hi.as_deref(),
|
|
750
|
+
false,
|
|
751
|
+
resolver.cursor_mut().sources_mut(),
|
|
752
|
+
);
|
|
753
|
+
if let Err(e) = filled {
|
|
754
|
+
give_back(resolver);
|
|
755
|
+
return Err(e);
|
|
756
|
+
}
|
|
757
|
+
if resolver.cursor_mut().sources().is_empty() {
|
|
758
|
+
give_back(resolver);
|
|
759
|
+
continue;
|
|
760
|
+
}
|
|
761
|
+
opts.skip_columns = skips_columns(resolver.cursor_mut().sources());
|
|
762
|
+
plain.push(plain_lane(
|
|
763
|
+
&located,
|
|
764
|
+
meta,
|
|
765
|
+
&opts,
|
|
766
|
+
&filter,
|
|
767
|
+
resolver.cursor_mut().sources(),
|
|
768
|
+
ctx.snapshot.seqno,
|
|
769
|
+
));
|
|
770
|
+
resolver.cursor_mut().reset();
|
|
771
|
+
resolver.reset(opts);
|
|
772
|
+
resolver.set_upper_bound(g.hi.as_deref());
|
|
773
|
+
lanes.push(Lane {
|
|
774
|
+
family,
|
|
775
|
+
unknown_merge: (meta.merge == MergeKind::Unknown)
|
|
776
|
+
.then(|| meta.options.merge_operator.clone()),
|
|
777
|
+
resolver,
|
|
778
|
+
grew: false,
|
|
779
|
+
ssts: Arc::clone(&view.ssts),
|
|
780
|
+
resolver_blobs,
|
|
781
|
+
ts: 0,
|
|
782
|
+
pinned: None,
|
|
783
|
+
pending: false,
|
|
784
|
+
done: false,
|
|
785
|
+
});
|
|
786
|
+
let lane = lanes.last_mut().expect("pushed above");
|
|
787
|
+
lane.resolver.seek(g.lo.as_deref().unwrap_or(&[]))?;
|
|
788
|
+
}
|
|
789
|
+
Ok(())
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
/// The family's position in the read's family order.
|
|
793
|
+
fn rank_of(families: &[FamilyId], family: FamilyId) -> u32 {
|
|
794
|
+
families
|
|
795
|
+
.iter()
|
|
796
|
+
.position(|f| *f == family)
|
|
797
|
+
.unwrap_or(usize::MAX) as u32
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
/// Whether the lane's pending cell is in the row whose escaped key is `row_esc`.
|
|
801
|
+
pub(super) fn in_row<L: ReduceLane>(lane: &L, row_esc: &[u8]) -> bool {
|
|
802
|
+
if !lane.pending() {
|
|
803
|
+
return false;
|
|
804
|
+
}
|
|
805
|
+
let col = lane.col();
|
|
806
|
+
let row_len = row_esc.len() + TERMINATOR.len();
|
|
807
|
+
col.len() >= row_len && col.starts_with(row_esc) && col[row_esc.len()..row_len] == TERMINATOR
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
/// Drops the rest of the row in every lane (a seek past it).
|
|
811
|
+
fn skip_row<L: ReduceLane>(lanes: &mut [L], row_esc: &[u8]) -> Result<()> {
|
|
812
|
+
for lane in lanes {
|
|
813
|
+
if in_row(lane, row_esc) {
|
|
814
|
+
lane.drop_row()?;
|
|
815
|
+
}
|
|
816
|
+
}
|
|
817
|
+
Ok(())
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
/// Reads one group into `reducer`; `true` when the reducer broke (it has all it can take).
|
|
821
|
+
fn run_group<V, R>(
|
|
822
|
+
ctx: &Ctx<'_>,
|
|
823
|
+
g: &Group<'_>,
|
|
824
|
+
visitor: &mut V,
|
|
825
|
+
reducer: &mut R,
|
|
826
|
+
stats: &mut ReduceStats,
|
|
827
|
+
) -> Result<bool>
|
|
828
|
+
where
|
|
829
|
+
V: CellVisitor<Item = R::Item>,
|
|
830
|
+
R: Reducer,
|
|
831
|
+
{
|
|
832
|
+
ctx.snapshot.check_process()?;
|
|
833
|
+
let mut lanes = Vec::new();
|
|
834
|
+
let mut plain = Vec::new();
|
|
835
|
+
let opened = open_lanes(ctx, g, &mut lanes, &mut plain);
|
|
836
|
+
// Each lane's family position in the read's family order, once per group (perf287's
|
|
837
|
+
// nit on #1209: not a search per cell).
|
|
838
|
+
let ranks: Vec<u32> = lanes
|
|
839
|
+
.iter()
|
|
840
|
+
.map(|l| rank_of(ctx.families, l.family))
|
|
841
|
+
.collect();
|
|
842
|
+
if opened.is_ok() && !lanes.is_empty() && plain.iter().all(|p| *p) {
|
|
843
|
+
// Every lane plain (#1283 lever 3): the group reads through `PlainLane`s, a second
|
|
844
|
+
// instance of `visit_lanes`, so neither kind of lane pays for the other per cell.
|
|
845
|
+
let mut plains = Vec::with_capacity(lanes.len());
|
|
846
|
+
let mut moved = Ok(());
|
|
847
|
+
for lane in lanes {
|
|
848
|
+
match moved.and_then(|()| PlainLane::from_lane(lane, g)) {
|
|
849
|
+
Ok(p) => {
|
|
850
|
+
plains.push(p);
|
|
851
|
+
moved = Ok(());
|
|
852
|
+
}
|
|
853
|
+
Err(e) => moved = Err(e),
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
stats.plain_lanes += plains.len() as u64;
|
|
857
|
+
let read =
|
|
858
|
+
moved.and_then(|()| visit_lanes(ctx, g, &mut plains, &ranks, visitor, reducer, stats));
|
|
859
|
+
stats.groups += 1;
|
|
860
|
+
return ctx.snapshot.checked(read);
|
|
861
|
+
}
|
|
862
|
+
let read =
|
|
863
|
+
opened.and_then(|()| visit_lanes(ctx, g, &mut lanes, &ranks, visitor, reducer, stats));
|
|
864
|
+
for lane in lanes {
|
|
865
|
+
if !lane.grew {
|
|
866
|
+
give_back(lane.resolver);
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
stats.groups += 1;
|
|
870
|
+
ctx.snapshot.checked(read)
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
fn visit_lanes<V, R, L>(
|
|
874
|
+
ctx: &Ctx<'_>,
|
|
875
|
+
g: &Group<'_>,
|
|
876
|
+
lanes: &mut [L],
|
|
877
|
+
ranks: &[u32],
|
|
878
|
+
visitor: &mut V,
|
|
879
|
+
reducer: &mut R,
|
|
880
|
+
stats: &mut ReduceStats,
|
|
881
|
+
) -> Result<bool>
|
|
882
|
+
where
|
|
883
|
+
V: CellVisitor<Item = R::Item>,
|
|
884
|
+
R: Reducer,
|
|
885
|
+
L: ReduceLane,
|
|
886
|
+
{
|
|
887
|
+
let (mut row_esc, mut row, mut qualifier) = (Vec::new(), Vec::new(), Vec::new());
|
|
888
|
+
loop {
|
|
889
|
+
if ctx.abort.load(Ordering::Relaxed) {
|
|
890
|
+
return Ok(false);
|
|
891
|
+
}
|
|
892
|
+
for lane in lanes.iter_mut() {
|
|
893
|
+
if !lane.pending() && !lane.done() {
|
|
894
|
+
lane.fetch()?;
|
|
895
|
+
}
|
|
896
|
+
}
|
|
897
|
+
// The smallest pending row across lanes.
|
|
898
|
+
let Some(best) = lanes
|
|
899
|
+
.iter()
|
|
900
|
+
.filter(|l| l.pending())
|
|
901
|
+
.map(|l| row_of(l.col()))
|
|
902
|
+
.min()
|
|
903
|
+
else {
|
|
904
|
+
return Ok(false);
|
|
905
|
+
};
|
|
906
|
+
row_esc.clear();
|
|
907
|
+
row_esc.extend_from_slice(best);
|
|
908
|
+
row.clear();
|
|
909
|
+
Escaped::new(&row_esc).unescape_long_into(&mut row);
|
|
910
|
+
if matches!(g.start, Bound::Excluded(s) if *s == row) {
|
|
911
|
+
skip_row(lanes, &row_esc)?;
|
|
912
|
+
continue;
|
|
913
|
+
}
|
|
914
|
+
let past = match g.end {
|
|
915
|
+
Bound::Included(e) => row > *e,
|
|
916
|
+
Bound::Excluded(e) => row >= *e,
|
|
917
|
+
Bound::Unbounded => false,
|
|
918
|
+
};
|
|
919
|
+
if past {
|
|
920
|
+
return Ok(false);
|
|
921
|
+
}
|
|
922
|
+
if let Some(r) = ctx.resume
|
|
923
|
+
&& r.is(&row)
|
|
924
|
+
{
|
|
925
|
+
for (lane, &rank) in lanes.iter_mut().zip(ranks) {
|
|
926
|
+
r.apply(lane, rank, &row_esc)?;
|
|
927
|
+
}
|
|
928
|
+
if !lanes.iter().any(|l| in_row(l, &row_esc)) {
|
|
929
|
+
continue;
|
|
930
|
+
}
|
|
931
|
+
}
|
|
932
|
+
stats.rows += 1;
|
|
933
|
+
if stats.rows.is_multiple_of(FORK_CHECK_ROWS) {
|
|
934
|
+
ctx.snapshot.check_process()?;
|
|
935
|
+
}
|
|
936
|
+
let row_len = row_esc.len() + TERMINATOR.len();
|
|
937
|
+
let mut next_row = false;
|
|
938
|
+
'lanes: for (lane, &family_rank) in lanes.iter_mut().zip(ranks) {
|
|
939
|
+
while in_row(lane, &row_esc) {
|
|
940
|
+
let col = lane.col();
|
|
941
|
+
let end = col.len().saturating_sub(2).max(row_len);
|
|
942
|
+
// Unescaped before the visit only for a visitor that reads it; otherwise only
|
|
943
|
+
// for an item the reducer admits (#1283 lever 1).
|
|
944
|
+
if V::QUALIFIER {
|
|
945
|
+
qualifier.clear();
|
|
946
|
+
Escaped::new(&col[row_len..end]).unescape_into(&mut qualifier);
|
|
947
|
+
}
|
|
948
|
+
stats.cells += 1;
|
|
949
|
+
let q: &[u8] = if V::QUALIFIER { &qualifier } else { &[] };
|
|
950
|
+
let visit = visitor.visit(&row, lane.family(), q, lane.ts(), lane.value());
|
|
951
|
+
let (item, after) = match visit {
|
|
952
|
+
Visit::Skip => (None, None),
|
|
953
|
+
Visit::Emit(item) => (Some(item), None),
|
|
954
|
+
Visit::EmitAndNextRow(item) => (Some(item), Some(false)),
|
|
955
|
+
Visit::NextRow => (None, Some(false)),
|
|
956
|
+
Visit::Stop => return Ok(false),
|
|
957
|
+
};
|
|
958
|
+
if let Some(item) = item
|
|
959
|
+
&& (V::QUALIFIER || reducer.admits(&item))
|
|
960
|
+
{
|
|
961
|
+
if !V::QUALIFIER {
|
|
962
|
+
let col = lane.col();
|
|
963
|
+
qualifier.clear();
|
|
964
|
+
Escaped::new(&col[row_len..end]).unescape_into(&mut qualifier);
|
|
965
|
+
}
|
|
966
|
+
let cell = CellRef {
|
|
967
|
+
row: &row,
|
|
968
|
+
family_rank,
|
|
969
|
+
family: lane.family(),
|
|
970
|
+
qualifier: &qualifier,
|
|
971
|
+
ts: lane.ts(),
|
|
972
|
+
};
|
|
973
|
+
if reducer.push(cell, item).is_break() {
|
|
974
|
+
return Ok(true);
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
if after.is_some() {
|
|
978
|
+
next_row = true;
|
|
979
|
+
break 'lanes;
|
|
980
|
+
}
|
|
981
|
+
lane.fetch()?;
|
|
982
|
+
}
|
|
983
|
+
}
|
|
984
|
+
if next_row {
|
|
985
|
+
skip_row(lanes, &row_esc)?;
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
/// Reads one key group into `reducer` through its own [`KeyCursor`] (D296 PR 2): the visitor
|
|
991
|
+
/// sees each present key's resolved cells in place, as for a range; `NextRow` skips the rest
|
|
992
|
+
/// of the key without reading it. `true` when the reducer broke.
|
|
993
|
+
fn run_keys<V, R>(
|
|
994
|
+
ctx: &Ctx<'_>,
|
|
995
|
+
group: &KeyGroup,
|
|
996
|
+
visitor: &mut V,
|
|
997
|
+
reducer: &mut R,
|
|
998
|
+
stats: &mut ReduceStats,
|
|
999
|
+
) -> Result<bool>
|
|
1000
|
+
where
|
|
1001
|
+
V: CellVisitor<Item = R::Item>,
|
|
1002
|
+
R: Reducer,
|
|
1003
|
+
{
|
|
1004
|
+
let ReadInput::Keys(keys) = &ctx.input else {
|
|
1005
|
+
unreachable!("a key group comes from a Keys input");
|
|
1006
|
+
};
|
|
1007
|
+
let mut cur = KeyCursor::for_group(
|
|
1008
|
+
ctx.snapshot.clone(),
|
|
1009
|
+
ctx.families.to_vec(),
|
|
1010
|
+
ctx.read.clone(),
|
|
1011
|
+
ctx.now,
|
|
1012
|
+
Arc::clone(keys),
|
|
1013
|
+
group.clone(),
|
|
1014
|
+
Arc::clone(ctx.shared),
|
|
1015
|
+
);
|
|
1016
|
+
stats.groups += 1;
|
|
1017
|
+
let mut row = Vec::new();
|
|
1018
|
+
// Cells come grouped by family: the rank of the last family seen, looked up once.
|
|
1019
|
+
let mut rank: Option<(FamilyId, u32)> = None;
|
|
1020
|
+
while let Some(i) = cur.next_key()? {
|
|
1021
|
+
if ctx.abort.load(Ordering::Relaxed) {
|
|
1022
|
+
return Ok(false);
|
|
1023
|
+
}
|
|
1024
|
+
row.clear();
|
|
1025
|
+
row.extend_from_slice(keys.get(i));
|
|
1026
|
+
if let Some(r) = ctx.resume
|
|
1027
|
+
&& r.is(&row)
|
|
1028
|
+
&& !cur.resume_in_row(r)?
|
|
1029
|
+
{
|
|
1030
|
+
continue;
|
|
1031
|
+
}
|
|
1032
|
+
stats.rows += 1;
|
|
1033
|
+
loop {
|
|
1034
|
+
let Some(c) = cur.next_cell()? else {
|
|
1035
|
+
break;
|
|
1036
|
+
};
|
|
1037
|
+
stats.cells += 1;
|
|
1038
|
+
let family_rank = match rank {
|
|
1039
|
+
Some((f, r)) if f == c.family => r,
|
|
1040
|
+
_ => {
|
|
1041
|
+
let r = rank_of(ctx.families, c.family);
|
|
1042
|
+
rank = Some((c.family, r));
|
|
1043
|
+
r
|
|
1044
|
+
}
|
|
1045
|
+
};
|
|
1046
|
+
let cell = CellRef {
|
|
1047
|
+
row: &row,
|
|
1048
|
+
family_rank,
|
|
1049
|
+
family: c.family,
|
|
1050
|
+
qualifier: c.qualifier,
|
|
1051
|
+
ts: c.ts,
|
|
1052
|
+
};
|
|
1053
|
+
let (item, next_row) = match visitor.visit(&row, c.family, c.qualifier, c.ts, c.stored)
|
|
1054
|
+
{
|
|
1055
|
+
Visit::Skip => (None, false),
|
|
1056
|
+
Visit::Emit(item) => (Some(item), false),
|
|
1057
|
+
Visit::EmitAndNextRow(item) => (Some(item), true),
|
|
1058
|
+
Visit::NextRow => (None, true),
|
|
1059
|
+
Visit::Stop => return Ok(false),
|
|
1060
|
+
};
|
|
1061
|
+
if let Some(item) = item
|
|
1062
|
+
&& reducer.push(cell, item).is_break()
|
|
1063
|
+
{
|
|
1064
|
+
return Ok(true);
|
|
1065
|
+
}
|
|
1066
|
+
if next_row {
|
|
1067
|
+
cur.skip_rest_of_key();
|
|
1068
|
+
break;
|
|
1069
|
+
}
|
|
1070
|
+
}
|
|
1071
|
+
}
|
|
1072
|
+
Ok(false)
|
|
1073
|
+
}
|
|
1074
|
+
|
|
1075
|
+
/// [`Engine::reduce`](crate::Engine::reduce): [`reduce_into`], then the merged reducer's
|
|
1076
|
+
/// [`Reducer::finish`].
|
|
1077
|
+
pub(crate) fn reduce<V, R>(
|
|
1078
|
+
snapshot: &Snapshot,
|
|
1079
|
+
table: TableId,
|
|
1080
|
+
families: &[FamilyId],
|
|
1081
|
+
spec: &ReduceSpec,
|
|
1082
|
+
ctx: (Timestamp, bool, &Arc<crate::shard::Shared>),
|
|
1083
|
+
visitor: &(impl Fn() -> V + Sync),
|
|
1084
|
+
reducer: &(impl Fn() -> R + Sync),
|
|
1085
|
+
) -> Result<Reduced<R::Item>>
|
|
1086
|
+
where
|
|
1087
|
+
V: CellVisitor<Item = R::Item>,
|
|
1088
|
+
R: Reducer,
|
|
1089
|
+
{
|
|
1090
|
+
let (acc, stats) = reduce_into(snapshot, table, families, spec, ctx, visitor, reducer)?;
|
|
1091
|
+
Ok(Reduced {
|
|
1092
|
+
items: acc.finish(),
|
|
1093
|
+
stats,
|
|
1094
|
+
})
|
|
1095
|
+
}
|
|
1096
|
+
|
|
1097
|
+
/// The groups, sequential or fanned out, merged into one reducer and handed back unfinished,
|
|
1098
|
+
/// for a caller that takes its result in another form (traversal's `DedupeLimit::into_nodes`,
|
|
1099
|
+
/// D304).
|
|
1100
|
+
pub(crate) fn reduce_into<V, R>(
|
|
1101
|
+
snapshot: &Snapshot,
|
|
1102
|
+
table: TableId,
|
|
1103
|
+
families: &[FamilyId],
|
|
1104
|
+
spec: &ReduceSpec,
|
|
1105
|
+
(now, may_fan_out, shared): (Timestamp, bool, &Arc<crate::shard::Shared>),
|
|
1106
|
+
visitor: &(impl Fn() -> V + Sync),
|
|
1107
|
+
reducer: &(impl Fn() -> R + Sync),
|
|
1108
|
+
) -> Result<(R, ReduceStats)>
|
|
1109
|
+
where
|
|
1110
|
+
V: CellVisitor<Item = R::Item>,
|
|
1111
|
+
R: Reducer,
|
|
1112
|
+
{
|
|
1113
|
+
let view = Arc::clone(&snapshot.view);
|
|
1114
|
+
let resume = spec
|
|
1115
|
+
.resume
|
|
1116
|
+
.as_ref()
|
|
1117
|
+
.map(|r| Resume::new(table, families, r))
|
|
1118
|
+
.transpose()?;
|
|
1119
|
+
// perf287's N1 on #1264: an excluded start skips its row before the resume could apply.
|
|
1120
|
+
if let (Some((row, _)), ReadInput::Ranges(ranges)) = (&spec.resume, &spec.input)
|
|
1121
|
+
&& ranges
|
|
1122
|
+
.iter()
|
|
1123
|
+
.any(|(start, _)| matches!(start, Bound::Excluded(s) if s == row))
|
|
1124
|
+
{
|
|
1125
|
+
return Err(Error::InvalidArgument(
|
|
1126
|
+
"a resume in a row that a range's excluded start skips: start the range at the \
|
|
1127
|
+
row, included"
|
|
1128
|
+
.to_owned(),
|
|
1129
|
+
));
|
|
1130
|
+
}
|
|
1131
|
+
let groups = work(snapshot, table, &spec.input)?;
|
|
1132
|
+
let abort = AtomicBool::new(false);
|
|
1133
|
+
let ctx = Ctx {
|
|
1134
|
+
snapshot,
|
|
1135
|
+
shared,
|
|
1136
|
+
input: &spec.input,
|
|
1137
|
+
families,
|
|
1138
|
+
read: &spec.read,
|
|
1139
|
+
now,
|
|
1140
|
+
abort: &abort,
|
|
1141
|
+
resume: resume.as_ref(),
|
|
1142
|
+
};
|
|
1143
|
+
let threads = if may_fan_out && spec.parallelism > 1 && groups.len() > 1 {
|
|
1144
|
+
let by_work = match spec.parallel_floor {
|
|
1145
|
+
0 => usize::MAX,
|
|
1146
|
+
floor => {
|
|
1147
|
+
let total: u64 = groups
|
|
1148
|
+
.iter()
|
|
1149
|
+
.map(|w| match w {
|
|
1150
|
+
Work::Range(g) => estimate(&view, families, g),
|
|
1151
|
+
Work::Keys(k) => k.keys.len() as u64,
|
|
1152
|
+
})
|
|
1153
|
+
.sum();
|
|
1154
|
+
usize::try_from(total / floor).unwrap_or(usize::MAX).max(1)
|
|
1155
|
+
}
|
|
1156
|
+
};
|
|
1157
|
+
spec.parallelism.min(groups.len()).min(by_work)
|
|
1158
|
+
} else {
|
|
1159
|
+
1
|
|
1160
|
+
};
|
|
1161
|
+
// One visitor per group. `true` when the reducer broke.
|
|
1162
|
+
let run_into = |w: &Work<'_>, r: &mut R, stats: &mut ReduceStats| -> Result<bool> {
|
|
1163
|
+
let mut v = visitor();
|
|
1164
|
+
match w {
|
|
1165
|
+
Work::Range(g) => run_group(&ctx, g, &mut v, r, stats),
|
|
1166
|
+
Work::Keys(k) => run_keys(&ctx, k, &mut v, r, stats),
|
|
1167
|
+
}
|
|
1168
|
+
};
|
|
1169
|
+
// Fanned out, one reducer per group as well: a group stops only on its own account.
|
|
1170
|
+
let run = |w: &Work<'_>, stats: &mut ReduceStats| -> Result<R> {
|
|
1171
|
+
let mut r = reducer();
|
|
1172
|
+
run_into(w, &mut r, stats)?;
|
|
1173
|
+
Ok(r)
|
|
1174
|
+
};
|
|
1175
|
+
let mut stats = ReduceStats::default();
|
|
1176
|
+
let mut acc = reducer();
|
|
1177
|
+
if threads <= 1 {
|
|
1178
|
+
// Sequentially, every group pushes into the one accumulator (D308 B2). The groups
|
|
1179
|
+
// are in key order, so its pushes are the read's cells in order, exactly as one
|
|
1180
|
+
// scan would push them; a `Break` means the whole read has what it needs, and the
|
|
1181
|
+
// groups after it are not read. No per-group merge.
|
|
1182
|
+
for g in &groups {
|
|
1183
|
+
if run_into(g, &mut acc, &mut stats)? {
|
|
1184
|
+
break;
|
|
1185
|
+
}
|
|
1186
|
+
}
|
|
1187
|
+
stats.threads = 1;
|
|
1188
|
+
} else {
|
|
1189
|
+
let next = AtomicUsize::new(0);
|
|
1190
|
+
let results: Vec<Result<(R, ReduceStats)>> = std::thread::scope(|s| {
|
|
1191
|
+
let workers: Vec<_> = (0..threads)
|
|
1192
|
+
.map(|_| {
|
|
1193
|
+
s.spawn(|| -> Result<(R, ReduceStats)> {
|
|
1194
|
+
let mut mine = reducer();
|
|
1195
|
+
let mut st = ReduceStats::default();
|
|
1196
|
+
loop {
|
|
1197
|
+
let i = next.fetch_add(1, Ordering::Relaxed);
|
|
1198
|
+
let Some(g) = groups.get(i) else {
|
|
1199
|
+
return Ok((mine, st));
|
|
1200
|
+
};
|
|
1201
|
+
match run(g, &mut st) {
|
|
1202
|
+
Ok(r) => mine.merge(r),
|
|
1203
|
+
Err(e) => {
|
|
1204
|
+
abort.store(true, Ordering::Relaxed);
|
|
1205
|
+
return Err(e);
|
|
1206
|
+
}
|
|
1207
|
+
}
|
|
1208
|
+
}
|
|
1209
|
+
})
|
|
1210
|
+
})
|
|
1211
|
+
.collect();
|
|
1212
|
+
workers
|
|
1213
|
+
.into_iter()
|
|
1214
|
+
// A worker's panic is the caller's, as it would be on the caller's thread.
|
|
1215
|
+
.map(|w| w.join().unwrap_or_else(|p| std::panic::resume_unwind(p)))
|
|
1216
|
+
.collect()
|
|
1217
|
+
});
|
|
1218
|
+
for r in results {
|
|
1219
|
+
let (r, st) = r?;
|
|
1220
|
+
acc.merge(r);
|
|
1221
|
+
stats.add(&st);
|
|
1222
|
+
}
|
|
1223
|
+
stats.threads = threads as u64;
|
|
1224
|
+
}
|
|
1225
|
+
Ok((acc, stats))
|
|
1226
|
+
}
|
|
1227
|
+
|
|
1228
|
+
/// The `k` items with the smallest scores, ties broken by cell order: a total order, so the
|
|
1229
|
+
/// result is the same at any fan-out and in any push order (D296 R1).
|
|
1230
|
+
#[derive(Debug, Clone)]
|
|
1231
|
+
pub struct TopK<S> {
|
|
1232
|
+
k: usize,
|
|
1233
|
+
/// Sorted ascending by (score, cell); at most `k`.
|
|
1234
|
+
kept: Vec<(S, CellKey)>,
|
|
1235
|
+
}
|
|
1236
|
+
|
|
1237
|
+
impl<S: Ord> TopK<S> {
|
|
1238
|
+
/// Keeps the `k` smallest scores.
|
|
1239
|
+
pub fn new(k: usize) -> Self {
|
|
1240
|
+
Self {
|
|
1241
|
+
k,
|
|
1242
|
+
kept: Vec::with_capacity(k.min(1024) + 1),
|
|
1243
|
+
}
|
|
1244
|
+
}
|
|
1245
|
+
|
|
1246
|
+
/// Whether `(score, cell)` would enter.
|
|
1247
|
+
fn enters(&self, score: &S, cell: CellRef<'_>) -> bool {
|
|
1248
|
+
if self.k == 0 {
|
|
1249
|
+
return false;
|
|
1250
|
+
}
|
|
1251
|
+
match self.kept.last() {
|
|
1252
|
+
Some((ws, wc)) if self.kept.len() == self.k => (score, cell) < (ws, wc.as_ref()),
|
|
1253
|
+
_ => true,
|
|
1254
|
+
}
|
|
1255
|
+
}
|
|
1256
|
+
|
|
1257
|
+
fn insert(&mut self, score: S, key: CellKey) {
|
|
1258
|
+
if !self.enters(&score, key.as_ref()) {
|
|
1259
|
+
return;
|
|
1260
|
+
}
|
|
1261
|
+
let at = self.kept.partition_point(|(s, k)| (s, k) < (&score, &key));
|
|
1262
|
+
self.kept.insert(at, (score, key));
|
|
1263
|
+
self.kept.truncate(self.k);
|
|
1264
|
+
}
|
|
1265
|
+
}
|
|
1266
|
+
|
|
1267
|
+
impl<S: Ord + Send> Reducer for TopK<S> {
|
|
1268
|
+
type Item = S;
|
|
1269
|
+
|
|
1270
|
+
fn push(&mut self, cell: CellRef<'_>, item: S) -> ControlFlow<()> {
|
|
1271
|
+
// Only a candidate that enters is copied.
|
|
1272
|
+
if self.enters(&item, cell) {
|
|
1273
|
+
self.insert(item, cell.to_key());
|
|
1274
|
+
}
|
|
1275
|
+
ControlFlow::Continue(())
|
|
1276
|
+
}
|
|
1277
|
+
|
|
1278
|
+
/// A score above the worst kept one, with `k` kept, can't enter whatever its cell; one
|
|
1279
|
+
/// equal to it can, by a smaller cell.
|
|
1280
|
+
#[inline]
|
|
1281
|
+
fn admits(&self, item: &S) -> bool {
|
|
1282
|
+
match self.kept.last() {
|
|
1283
|
+
Some((worst, _)) if self.kept.len() == self.k => item <= worst,
|
|
1284
|
+
_ => self.k > 0,
|
|
1285
|
+
}
|
|
1286
|
+
}
|
|
1287
|
+
|
|
1288
|
+
fn merge(&mut self, other: Self) {
|
|
1289
|
+
for (s, key) in other.kept {
|
|
1290
|
+
self.insert(s, key);
|
|
1291
|
+
}
|
|
1292
|
+
}
|
|
1293
|
+
|
|
1294
|
+
fn finish(self) -> Vec<(CellKey, S)> {
|
|
1295
|
+
self.kept.into_iter().map(|(s, k)| (k, s)).collect()
|
|
1296
|
+
}
|
|
1297
|
+
}
|
|
1298
|
+
|
|
1299
|
+
/// The first `n` cells in scan order. A group pushes in that order and stops at its own n-th;
|
|
1300
|
+
/// merging keeps the `n` smallest cells, which is the sequential first `n` (D296 rev 1.2).
|
|
1301
|
+
#[derive(Debug, Clone)]
|
|
1302
|
+
pub struct Limit<I> {
|
|
1303
|
+
n: usize,
|
|
1304
|
+
/// In cell order; at most `n`.
|
|
1305
|
+
kept: Vec<(CellKey, I)>,
|
|
1306
|
+
}
|
|
1307
|
+
|
|
1308
|
+
impl<I> Limit<I> {
|
|
1309
|
+
/// Keeps the first `n`.
|
|
1310
|
+
pub fn new(n: usize) -> Self {
|
|
1311
|
+
Self {
|
|
1312
|
+
n,
|
|
1313
|
+
kept: Vec::new(),
|
|
1314
|
+
}
|
|
1315
|
+
}
|
|
1316
|
+
}
|
|
1317
|
+
|
|
1318
|
+
impl<I: Send> Reducer for Limit<I> {
|
|
1319
|
+
type Item = I;
|
|
1320
|
+
|
|
1321
|
+
fn push(&mut self, cell: CellRef<'_>, item: I) -> ControlFlow<()> {
|
|
1322
|
+
if self.kept.len() >= self.n {
|
|
1323
|
+
return ControlFlow::Break(());
|
|
1324
|
+
}
|
|
1325
|
+
// A group pushes in cell order, so this appends.
|
|
1326
|
+
debug_assert!(self.kept.last().is_none_or(|(k, _)| k.as_ref() < cell));
|
|
1327
|
+
self.kept.push((cell.to_key(), item));
|
|
1328
|
+
if self.kept.len() >= self.n {
|
|
1329
|
+
ControlFlow::Break(())
|
|
1330
|
+
} else {
|
|
1331
|
+
ControlFlow::Continue(())
|
|
1332
|
+
}
|
|
1333
|
+
}
|
|
1334
|
+
|
|
1335
|
+
fn merge(&mut self, other: Self) {
|
|
1336
|
+
let mut all = std::mem::take(&mut self.kept);
|
|
1337
|
+
all.extend(other.kept);
|
|
1338
|
+
all.sort_by(|a, b| a.0.cmp(&b.0));
|
|
1339
|
+
all.truncate(self.n);
|
|
1340
|
+
self.kept = all;
|
|
1341
|
+
}
|
|
1342
|
+
|
|
1343
|
+
fn finish(self) -> Vec<(CellKey, I)> {
|
|
1344
|
+
self.kept
|
|
1345
|
+
}
|
|
1346
|
+
}
|
|
1347
|
+
|
|
1348
|
+
/// D308: the per-item overhead in a budget's size, standing for the timestamp (8 bytes), the
|
|
1349
|
+
/// family and the item's framing. Stable from 1.1.0.
|
|
1350
|
+
pub const BUDGET_ITEM_OVERHEAD: u64 = 16;
|
|
1351
|
+
|
|
1352
|
+
/// The first column past a [`ByteBudget`]'s prefix: its first cell, and its size as the
|
|
1353
|
+
/// first item of a page (every version the read selects, plus the row key).
|
|
1354
|
+
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
1355
|
+
pub struct Overflow {
|
|
1356
|
+
/// The column's first cell.
|
|
1357
|
+
pub key: CellKey,
|
|
1358
|
+
/// Its size, the row key included: a budget of this size returns it whole when a read
|
|
1359
|
+
/// resumes at it.
|
|
1360
|
+
pub bytes: u64,
|
|
1361
|
+
}
|
|
1362
|
+
|
|
1363
|
+
/// A [`ByteBudget`]'s result.
|
|
1364
|
+
#[derive(Debug)]
|
|
1365
|
+
#[non_exhaustive]
|
|
1366
|
+
pub struct BytePage<I> {
|
|
1367
|
+
/// The kept cells, in cell order.
|
|
1368
|
+
pub items: Vec<(CellKey, I)>,
|
|
1369
|
+
/// Their size by D308's rule: each item's own size, plus each row's key once.
|
|
1370
|
+
pub bytes: u64,
|
|
1371
|
+
/// The first column that didn't fit, when the budget cut the read.
|
|
1372
|
+
pub overflow: Option<Overflow>,
|
|
1373
|
+
/// Whether [`ByteBudget::with_rows`]'s row limit stopped the read first: true only when
|
|
1374
|
+
/// a row followed the `n`-th, so an input of exactly `n` rows gives `false` (the read ran
|
|
1375
|
+
/// out, with nothing to resume). Then `overflow` is `None`.
|
|
1376
|
+
pub cut_by_rows: bool,
|
|
1377
|
+
}
|
|
1378
|
+
|
|
1379
|
+
struct Kept<I> {
|
|
1380
|
+
key: CellKey,
|
|
1381
|
+
item: I,
|
|
1382
|
+
/// The item's own size, without its row key.
|
|
1383
|
+
size: u64,
|
|
1384
|
+
}
|
|
1385
|
+
|
|
1386
|
+
/// The longest prefix of the read's cells, in cell order, whose size is at most `budget`
|
|
1387
|
+
/// bytes (D308): `Limit` measured in bytes, cut at column boundaries. An item's own size is
|
|
1388
|
+
/// `size(cell, item)` (by D308, its qualifier, its value and [`BUDGET_ITEM_OVERHEAD`]); each
|
|
1389
|
+
/// row's key counts once, on the row's first kept cell.
|
|
1390
|
+
///
|
|
1391
|
+
/// A column (every version the read selects) is admitted whole or not at all: the read
|
|
1392
|
+
/// pushes one cell per version, so a column that doesn't fit is rolled back, and its
|
|
1393
|
+
/// remaining versions are counted into the [`Overflow`] before the group breaks on the next
|
|
1394
|
+
/// column. A group stops on its own budget (D296 rev 1.2); `merge` concatenates and cuts the
|
|
1395
|
+
/// global prefix again, which is exact: a row never spans two groups, so each cell's size is
|
|
1396
|
+
/// the same in its group as in the whole read, and a group's share of the global prefix is a
|
|
1397
|
+
/// prefix of its own cells that its budget already covered.
|
|
1398
|
+
pub struct ByteBudget<I, F, L: RowLimit = NoRowLimit> {
|
|
1399
|
+
budget: u64,
|
|
1400
|
+
size: F,
|
|
1401
|
+
kept: Vec<Kept<I>>,
|
|
1402
|
+
used: u64,
|
|
1403
|
+
/// The open column's first cell, and its start in `kept`.
|
|
1404
|
+
open: Option<CellKey>,
|
|
1405
|
+
open_at: usize,
|
|
1406
|
+
overflow: Option<Overflow>,
|
|
1407
|
+
/// D308's N4 (#1280): a scan's `limit` bounds the read too. [`NoRowLimit`] (the default,
|
|
1408
|
+
/// zero-sized) compiles every row-limit branch away, so a read without one runs exactly
|
|
1409
|
+
/// the budget's own code (#1284: an in-struct limit cost scan-budget 20 instructions per
|
|
1410
|
+
/// cell, mostly codegen around fields it never used).
|
|
1411
|
+
limit: L,
|
|
1412
|
+
}
|
|
1413
|
+
|
|
1414
|
+
/// A [`ByteBudget`]'s row limit: [`NoRowLimit`] or [`RowsLimit`].
|
|
1415
|
+
pub trait RowLimit: Send {
|
|
1416
|
+
/// Whether this limits rows at all; `false` compiles the limit's branches away.
|
|
1417
|
+
const LIMITED: bool;
|
|
1418
|
+
/// The most rows the read keeps.
|
|
1419
|
+
fn max_rows(&self) -> usize;
|
|
1420
|
+
/// Rows with a kept cell (this group's own account until `cut`).
|
|
1421
|
+
fn kept_rows(&self) -> usize;
|
|
1422
|
+
/// Sets the kept-row count.
|
|
1423
|
+
fn set_kept_rows(&mut self, n: usize);
|
|
1424
|
+
/// Whether more rows followed the limit's last.
|
|
1425
|
+
fn full(&self) -> bool;
|
|
1426
|
+
/// Records whether more rows followed the limit's last.
|
|
1427
|
+
fn set_full(&mut self, full: bool);
|
|
1428
|
+
}
|
|
1429
|
+
|
|
1430
|
+
/// No row limit: the budget alone stops the read.
|
|
1431
|
+
#[derive(Debug, Clone, Copy, Default)]
|
|
1432
|
+
pub struct NoRowLimit;
|
|
1433
|
+
|
|
1434
|
+
impl RowLimit for NoRowLimit {
|
|
1435
|
+
const LIMITED: bool = false;
|
|
1436
|
+
fn max_rows(&self) -> usize {
|
|
1437
|
+
usize::MAX
|
|
1438
|
+
}
|
|
1439
|
+
fn kept_rows(&self) -> usize {
|
|
1440
|
+
0
|
|
1441
|
+
}
|
|
1442
|
+
fn set_kept_rows(&mut self, _: usize) {}
|
|
1443
|
+
fn full(&self) -> bool {
|
|
1444
|
+
false
|
|
1445
|
+
}
|
|
1446
|
+
fn set_full(&mut self, _: bool) {}
|
|
1447
|
+
}
|
|
1448
|
+
|
|
1449
|
+
/// At most `n` rows ([`ByteBudget::with_rows`]).
|
|
1450
|
+
#[derive(Debug, Clone, Copy)]
|
|
1451
|
+
pub struct RowsLimit {
|
|
1452
|
+
n: usize,
|
|
1453
|
+
kept: usize,
|
|
1454
|
+
full: bool,
|
|
1455
|
+
}
|
|
1456
|
+
|
|
1457
|
+
impl RowLimit for RowsLimit {
|
|
1458
|
+
const LIMITED: bool = true;
|
|
1459
|
+
fn max_rows(&self) -> usize {
|
|
1460
|
+
self.n
|
|
1461
|
+
}
|
|
1462
|
+
fn kept_rows(&self) -> usize {
|
|
1463
|
+
self.kept
|
|
1464
|
+
}
|
|
1465
|
+
fn set_kept_rows(&mut self, n: usize) {
|
|
1466
|
+
self.kept = n;
|
|
1467
|
+
}
|
|
1468
|
+
fn full(&self) -> bool {
|
|
1469
|
+
self.full
|
|
1470
|
+
}
|
|
1471
|
+
fn set_full(&mut self, full: bool) {
|
|
1472
|
+
self.full = full;
|
|
1473
|
+
}
|
|
1474
|
+
}
|
|
1475
|
+
|
|
1476
|
+
impl<I, F, L: RowLimit> std::fmt::Debug for ByteBudget<I, F, L> {
|
|
1477
|
+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
1478
|
+
f.debug_struct("ByteBudget")
|
|
1479
|
+
.field("budget", &self.budget)
|
|
1480
|
+
.field("kept", &self.kept.len())
|
|
1481
|
+
.field("used", &self.used)
|
|
1482
|
+
.field("overflow", &self.overflow)
|
|
1483
|
+
.finish()
|
|
1484
|
+
}
|
|
1485
|
+
}
|
|
1486
|
+
|
|
1487
|
+
impl<I, F: Fn(&CellRef<'_>, &I) -> u64> ByteBudget<I, F> {
|
|
1488
|
+
/// Keeps the in-budget prefix, an item's own size given by `size`.
|
|
1489
|
+
pub fn new(budget: u64, size: F) -> Self {
|
|
1490
|
+
Self {
|
|
1491
|
+
budget,
|
|
1492
|
+
size,
|
|
1493
|
+
kept: Vec::new(),
|
|
1494
|
+
used: 0,
|
|
1495
|
+
open: None,
|
|
1496
|
+
open_at: 0,
|
|
1497
|
+
overflow: None,
|
|
1498
|
+
limit: NoRowLimit,
|
|
1499
|
+
}
|
|
1500
|
+
}
|
|
1501
|
+
|
|
1502
|
+
/// Also stops after `n` rows (a scan's `limit`; #1280, perf287's N4 on #1281): whichever
|
|
1503
|
+
/// of the budget and the row limit stops the read first wins, and the read reads no
|
|
1504
|
+
/// further than that. A group stops at its own `n`-th row, which keeps everything the
|
|
1505
|
+
/// merged prefix needs from it, as `Limit` does.
|
|
1506
|
+
pub fn with_rows(self, n: usize) -> ByteBudget<I, F, RowsLimit> {
|
|
1507
|
+
ByteBudget {
|
|
1508
|
+
budget: self.budget,
|
|
1509
|
+
size: self.size,
|
|
1510
|
+
kept: self.kept,
|
|
1511
|
+
used: self.used,
|
|
1512
|
+
open: self.open,
|
|
1513
|
+
open_at: self.open_at,
|
|
1514
|
+
overflow: self.overflow,
|
|
1515
|
+
limit: RowsLimit {
|
|
1516
|
+
n,
|
|
1517
|
+
kept: 0,
|
|
1518
|
+
full: false,
|
|
1519
|
+
},
|
|
1520
|
+
}
|
|
1521
|
+
}
|
|
1522
|
+
}
|
|
1523
|
+
|
|
1524
|
+
impl<I, F: Fn(&CellRef<'_>, &I) -> u64, L: RowLimit> ByteBudget<I, F, L> {
|
|
1525
|
+
/// The result: the kept cells, their size, and the first column that didn't fit.
|
|
1526
|
+
pub fn into_page(mut self) -> BytePage<I> {
|
|
1527
|
+
self.cut();
|
|
1528
|
+
BytePage {
|
|
1529
|
+
bytes: self.used,
|
|
1530
|
+
overflow: self.overflow,
|
|
1531
|
+
cut_by_rows: self.limit.full(),
|
|
1532
|
+
items: self.kept.into_iter().map(|k| (k.key, k.item)).collect(),
|
|
1533
|
+
}
|
|
1534
|
+
}
|
|
1535
|
+
|
|
1536
|
+
/// Re-cuts `kept` (in cell order) to the global prefix: columns admitted whole while
|
|
1537
|
+
/// they fit, and nothing at or past a recorded overflow. With a row limit, also no row
|
|
1538
|
+
/// past the limit's last.
|
|
1539
|
+
fn cut(&mut self) {
|
|
1540
|
+
let mut used = 0u64;
|
|
1541
|
+
let mut keep = 0;
|
|
1542
|
+
let mut i = 0;
|
|
1543
|
+
let mut rows = 0usize;
|
|
1544
|
+
let mut hit_rows = false;
|
|
1545
|
+
let mut first_out: Option<Overflow> = None;
|
|
1546
|
+
while i < self.kept.len() {
|
|
1547
|
+
if let Some(o) = &self.overflow
|
|
1548
|
+
&& self.kept[i].key >= o.key
|
|
1549
|
+
{
|
|
1550
|
+
break;
|
|
1551
|
+
}
|
|
1552
|
+
// The column starting at `i`.
|
|
1553
|
+
let mut j = i + 1;
|
|
1554
|
+
while j < self.kept.len() && same_column(&self.kept[j].key, &self.kept[i].key) {
|
|
1555
|
+
j += 1;
|
|
1556
|
+
}
|
|
1557
|
+
let row = &self.kept[i].key.row;
|
|
1558
|
+
let new_row = keep == 0 || self.kept[keep - 1].key.row != *row;
|
|
1559
|
+
if L::LIMITED && new_row && rows == self.limit.max_rows() {
|
|
1560
|
+
// The row limit stops first: what follows is past it.
|
|
1561
|
+
hit_rows = true;
|
|
1562
|
+
break;
|
|
1563
|
+
}
|
|
1564
|
+
let own: u64 = self.kept[i..j].iter().map(|k| k.size).sum();
|
|
1565
|
+
let charge = if new_row { row.len() as u64 } else { 0 };
|
|
1566
|
+
if used + own + charge > self.budget {
|
|
1567
|
+
first_out = Some(Overflow {
|
|
1568
|
+
key: self.kept[i].key.clone(),
|
|
1569
|
+
bytes: own + row.len() as u64,
|
|
1570
|
+
});
|
|
1571
|
+
break;
|
|
1572
|
+
}
|
|
1573
|
+
used += own + charge;
|
|
1574
|
+
if L::LIMITED {
|
|
1575
|
+
rows += usize::from(new_row);
|
|
1576
|
+
}
|
|
1577
|
+
keep = j;
|
|
1578
|
+
i = j;
|
|
1579
|
+
}
|
|
1580
|
+
let mut overflow = match (self.overflow.take(), first_out) {
|
|
1581
|
+
(Some(a), Some(b)) => Some(if a.key <= b.key { a } else { b }),
|
|
1582
|
+
(a, b) => a.or(b),
|
|
1583
|
+
};
|
|
1584
|
+
if L::LIMITED {
|
|
1585
|
+
// An overflow in a row past the limit's last: the row limit stopped the read
|
|
1586
|
+
// first.
|
|
1587
|
+
let last_row = keep.checked_sub(1).map(|k| self.kept[k].key.row.as_slice());
|
|
1588
|
+
if let Some(o) = &overflow
|
|
1589
|
+
&& rows == self.limit.max_rows()
|
|
1590
|
+
&& last_row != Some(o.key.row.as_slice())
|
|
1591
|
+
{
|
|
1592
|
+
overflow = None;
|
|
1593
|
+
hit_rows = true;
|
|
1594
|
+
}
|
|
1595
|
+
// The budget stopping first (an overflow within the limit's rows) wins over a
|
|
1596
|
+
// group's own row limit.
|
|
1597
|
+
let full = overflow.is_none() && (hit_rows || self.limit.full());
|
|
1598
|
+
self.limit.set_full(full);
|
|
1599
|
+
self.limit.set_kept_rows(rows);
|
|
1600
|
+
}
|
|
1601
|
+
self.overflow = overflow;
|
|
1602
|
+
self.kept.truncate(keep);
|
|
1603
|
+
self.used = used;
|
|
1604
|
+
}
|
|
1605
|
+
}
|
|
1606
|
+
|
|
1607
|
+
fn same_column(a: &CellKey, b: &CellKey) -> bool {
|
|
1608
|
+
a.row == b.row && a.family_rank == b.family_rank && a.qualifier == b.qualifier
|
|
1609
|
+
}
|
|
1610
|
+
|
|
1611
|
+
impl<I: Send, F: Fn(&CellRef<'_>, &I) -> u64 + Send, L: RowLimit> Reducer for ByteBudget<I, F, L> {
|
|
1612
|
+
type Item = I;
|
|
1613
|
+
|
|
1614
|
+
fn push(&mut self, cell: CellRef<'_>, item: I) -> ControlFlow<()> {
|
|
1615
|
+
let same = self.open.as_ref().is_some_and(|o| {
|
|
1616
|
+
o.row == cell.row && o.family_rank == cell.family_rank && o.qualifier == cell.qualifier
|
|
1617
|
+
});
|
|
1618
|
+
let size = (self.size)(&cell, &item);
|
|
1619
|
+
if let Some(o) = &mut self.overflow {
|
|
1620
|
+
// The overflow column's later versions count into its size; the next column ends
|
|
1621
|
+
// the group (B1).
|
|
1622
|
+
if same {
|
|
1623
|
+
o.bytes += size;
|
|
1624
|
+
return ControlFlow::Continue(());
|
|
1625
|
+
}
|
|
1626
|
+
return ControlFlow::Break(());
|
|
1627
|
+
}
|
|
1628
|
+
// At the row limit, a new row ends the group (a cell of the open column never starts
|
|
1629
|
+
// one).
|
|
1630
|
+
if L::LIMITED
|
|
1631
|
+
&& !same
|
|
1632
|
+
&& self.limit.kept_rows() == self.limit.max_rows()
|
|
1633
|
+
&& self.kept.last().is_none_or(|k| k.key.row != cell.row)
|
|
1634
|
+
{
|
|
1635
|
+
self.limit.set_full(true);
|
|
1636
|
+
return ControlFlow::Break(());
|
|
1637
|
+
}
|
|
1638
|
+
if !same {
|
|
1639
|
+
self.open = Some(cell.to_key());
|
|
1640
|
+
self.open_at = self.kept.len();
|
|
1641
|
+
}
|
|
1642
|
+
// A group pushes in cell order, so this appends.
|
|
1643
|
+
debug_assert!(self.kept.last().is_none_or(|k| k.key.as_ref() < cell));
|
|
1644
|
+
let new_row = self.kept.last().is_none_or(|k| k.key.row != cell.row);
|
|
1645
|
+
let charge = if new_row { cell.row.len() as u64 } else { 0 };
|
|
1646
|
+
if self.used + size + charge <= self.budget {
|
|
1647
|
+
self.used += size + charge;
|
|
1648
|
+
if L::LIMITED && new_row {
|
|
1649
|
+
self.limit.set_kept_rows(self.limit.kept_rows() + 1);
|
|
1650
|
+
}
|
|
1651
|
+
self.kept.push(Kept {
|
|
1652
|
+
key: cell.to_key(),
|
|
1653
|
+
item,
|
|
1654
|
+
size,
|
|
1655
|
+
});
|
|
1656
|
+
return ControlFlow::Continue(());
|
|
1657
|
+
}
|
|
1658
|
+
// The column doesn't fit: roll back its earlier versions.
|
|
1659
|
+
let rolled: Vec<Kept<I>> = self.kept.drain(self.open_at..).collect();
|
|
1660
|
+
let own: u64 = rolled.iter().map(|k| k.size).sum::<u64>() + size;
|
|
1661
|
+
let open = self.open.clone().expect("a column is open");
|
|
1662
|
+
self.overflow = Some(Overflow {
|
|
1663
|
+
bytes: own + open.row.len() as u64,
|
|
1664
|
+
key: open,
|
|
1665
|
+
});
|
|
1666
|
+
let kept_row = self.kept.last().map(|k| k.key.row.as_slice());
|
|
1667
|
+
let rolled_charge = rolled
|
|
1668
|
+
.first()
|
|
1669
|
+
.filter(|k| kept_row != Some(k.key.row.as_slice()))
|
|
1670
|
+
.map_or(0, |k| k.key.row.len() as u64);
|
|
1671
|
+
self.used -= rolled.iter().map(|k| k.size).sum::<u64>() + rolled_charge;
|
|
1672
|
+
// A rolled-back column that opened its row takes the row back out of the count.
|
|
1673
|
+
if L::LIMITED
|
|
1674
|
+
&& rolled
|
|
1675
|
+
.first()
|
|
1676
|
+
.is_some_and(|k| kept_row != Some(k.key.row.as_slice()))
|
|
1677
|
+
{
|
|
1678
|
+
self.limit.set_kept_rows(self.limit.kept_rows() - 1);
|
|
1679
|
+
}
|
|
1680
|
+
ControlFlow::Continue(())
|
|
1681
|
+
}
|
|
1682
|
+
|
|
1683
|
+
fn merge(&mut self, other: Self) {
|
|
1684
|
+
if L::LIMITED {
|
|
1685
|
+
self.limit.set_full(self.limit.full() || other.limit.full());
|
|
1686
|
+
}
|
|
1687
|
+
let mut all = std::mem::take(&mut self.kept);
|
|
1688
|
+
all.extend(other.kept);
|
|
1689
|
+
all.sort_by(|a, b| a.key.cmp(&b.key));
|
|
1690
|
+
self.kept = all;
|
|
1691
|
+
self.overflow = match (self.overflow.take(), other.overflow) {
|
|
1692
|
+
(Some(a), Some(b)) => Some(if a.key <= b.key { a } else { b }),
|
|
1693
|
+
(a, b) => a.or(b),
|
|
1694
|
+
};
|
|
1695
|
+
self.cut();
|
|
1696
|
+
self.open = None;
|
|
1697
|
+
self.open_at = self.kept.len();
|
|
1698
|
+
}
|
|
1699
|
+
|
|
1700
|
+
fn finish(self) -> Vec<(CellKey, I)> {
|
|
1701
|
+
self.into_page().items
|
|
1702
|
+
}
|
|
1703
|
+
}
|
|
1704
|
+
|
|
1705
|
+
/// One item per key the item gives (for example a traversal's destination node), the one
|
|
1706
|
+
/// from the first cell in scan order when a key repeats; keys in `exclude` are dropped
|
|
1707
|
+
/// (#489's visited set). Order-independent, so the same at any fan-out (D296 S2).
|
|
1708
|
+
pub struct Dedupe<I, K, F> {
|
|
1709
|
+
key_of: F,
|
|
1710
|
+
exclude: Option<Arc<std::collections::HashSet<K>>>,
|
|
1711
|
+
kept: std::collections::HashMap<K, (CellKey, I)>,
|
|
1712
|
+
}
|
|
1713
|
+
|
|
1714
|
+
impl<I, K, F> std::fmt::Debug for Dedupe<I, K, F> {
|
|
1715
|
+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
1716
|
+
f.debug_struct("Dedupe")
|
|
1717
|
+
.field("kept", &self.kept.len())
|
|
1718
|
+
.finish_non_exhaustive()
|
|
1719
|
+
}
|
|
1720
|
+
}
|
|
1721
|
+
|
|
1722
|
+
impl<I, K: std::hash::Hash + Eq, F: Fn(&I) -> K> Dedupe<I, K, F> {
|
|
1723
|
+
/// One item per `key_of(item)`, none whose key is in `exclude`.
|
|
1724
|
+
pub fn new(key_of: F, exclude: Option<Arc<std::collections::HashSet<K>>>) -> Self {
|
|
1725
|
+
Self {
|
|
1726
|
+
key_of,
|
|
1727
|
+
exclude,
|
|
1728
|
+
kept: std::collections::HashMap::new(),
|
|
1729
|
+
}
|
|
1730
|
+
}
|
|
1731
|
+
|
|
1732
|
+
fn offer(&mut self, cell: CellRef<'_>, item: I) {
|
|
1733
|
+
let key = (self.key_of)(&item);
|
|
1734
|
+
if self.exclude.as_ref().is_some_and(|x| x.contains(&key)) {
|
|
1735
|
+
return;
|
|
1736
|
+
}
|
|
1737
|
+
match self.kept.entry(key) {
|
|
1738
|
+
std::collections::hash_map::Entry::Occupied(mut o) => {
|
|
1739
|
+
if cell < o.get().0.as_ref() {
|
|
1740
|
+
o.insert((cell.to_key(), item));
|
|
1741
|
+
}
|
|
1742
|
+
}
|
|
1743
|
+
std::collections::hash_map::Entry::Vacant(v) => {
|
|
1744
|
+
v.insert((cell.to_key(), item));
|
|
1745
|
+
}
|
|
1746
|
+
}
|
|
1747
|
+
}
|
|
1748
|
+
}
|
|
1749
|
+
|
|
1750
|
+
impl<I, K, F> Reducer for Dedupe<I, K, F>
|
|
1751
|
+
where
|
|
1752
|
+
I: Send,
|
|
1753
|
+
K: std::hash::Hash + Eq + Send + Sync,
|
|
1754
|
+
F: Fn(&I) -> K + Send,
|
|
1755
|
+
{
|
|
1756
|
+
type Item = I;
|
|
1757
|
+
|
|
1758
|
+
fn push(&mut self, cell: CellRef<'_>, item: I) -> ControlFlow<()> {
|
|
1759
|
+
self.offer(cell, item);
|
|
1760
|
+
ControlFlow::Continue(())
|
|
1761
|
+
}
|
|
1762
|
+
|
|
1763
|
+
fn merge(&mut self, other: Self) {
|
|
1764
|
+
for (_, (cell, item)) in other.kept {
|
|
1765
|
+
self.offer(cell.as_ref(), item);
|
|
1766
|
+
}
|
|
1767
|
+
}
|
|
1768
|
+
|
|
1769
|
+
fn finish(self) -> Vec<(CellKey, I)> {
|
|
1770
|
+
let mut out: Vec<_> = self.kept.into_values().collect();
|
|
1771
|
+
out.sort_by(|a, b| a.0.cmp(&b.0));
|
|
1772
|
+
out
|
|
1773
|
+
}
|
|
1774
|
+
}
|
|
1775
|
+
|
|
1776
|
+
#[cfg(test)]
|
|
1777
|
+
mod tests {
|
|
1778
|
+
use super::*;
|
|
1779
|
+
|
|
1780
|
+
fn cell(row: &'static str, rank: u32, q: &'static str, ts: Timestamp) -> CellRef<'static> {
|
|
1781
|
+
CellRef {
|
|
1782
|
+
row: row.as_bytes(),
|
|
1783
|
+
family_rank: rank,
|
|
1784
|
+
family: FamilyId(rank),
|
|
1785
|
+
qualifier: q.as_bytes(),
|
|
1786
|
+
ts,
|
|
1787
|
+
}
|
|
1788
|
+
}
|
|
1789
|
+
|
|
1790
|
+
fn rows<I>(items: &[(CellKey, I)]) -> Vec<(&[u8], u32, &[u8], Timestamp)> {
|
|
1791
|
+
items
|
|
1792
|
+
.iter()
|
|
1793
|
+
.map(|(k, _)| {
|
|
1794
|
+
(
|
|
1795
|
+
k.row.as_slice(),
|
|
1796
|
+
k.family_rank,
|
|
1797
|
+
k.qualifier.as_slice(),
|
|
1798
|
+
k.ts,
|
|
1799
|
+
)
|
|
1800
|
+
})
|
|
1801
|
+
.collect()
|
|
1802
|
+
}
|
|
1803
|
+
|
|
1804
|
+
#[test]
|
|
1805
|
+
fn cells_order_as_a_scan_does_family_before_qualifier_newest_version_first() {
|
|
1806
|
+
assert!(
|
|
1807
|
+
cell("r", 0, "z", 1) < cell("r", 1, "a", 1),
|
|
1808
|
+
"family rank before qualifier"
|
|
1809
|
+
);
|
|
1810
|
+
assert!(
|
|
1811
|
+
cell("r", 0, "q", 9) < cell("r", 0, "q", 3),
|
|
1812
|
+
"newest version first"
|
|
1813
|
+
);
|
|
1814
|
+
assert!(cell("a", 9, "z", 0) < cell("b", 0, "a", 9), "row first");
|
|
1815
|
+
}
|
|
1816
|
+
|
|
1817
|
+
#[test]
|
|
1818
|
+
fn top_k_breaks_equal_scores_by_cell_order_in_any_merge_order() {
|
|
1819
|
+
// Equal scores across "groups": the first cells in scan order among the ties win,
|
|
1820
|
+
// including two versions of one column and the same qualifier in two families.
|
|
1821
|
+
let cells = [
|
|
1822
|
+
(cell("r3", 0, "a", 1), 1u32),
|
|
1823
|
+
(cell("r1", 1, "a", 1), 1),
|
|
1824
|
+
(cell("r1", 0, "b", 1), 1),
|
|
1825
|
+
(cell("r1", 0, "b", 5), 1),
|
|
1826
|
+
(cell("r2", 0, "a", 1), 1),
|
|
1827
|
+
(cell("r0", 0, "z", 1), 2),
|
|
1828
|
+
];
|
|
1829
|
+
let mut seq = TopK::new(3);
|
|
1830
|
+
for (c, s) in cells {
|
|
1831
|
+
let _ = seq.push(c, s);
|
|
1832
|
+
}
|
|
1833
|
+
let want = seq.finish();
|
|
1834
|
+
assert_eq!(
|
|
1835
|
+
rows(&want),
|
|
1836
|
+
vec![
|
|
1837
|
+
(&b"r1"[..], 0, &b"b"[..], 5),
|
|
1838
|
+
(b"r1", 0, b"b", 1),
|
|
1839
|
+
(b"r1", 1, b"a", 1)
|
|
1840
|
+
]
|
|
1841
|
+
);
|
|
1842
|
+
for split in 0..=cells.len() {
|
|
1843
|
+
let (a, b) = cells.split_at(split);
|
|
1844
|
+
let (mut x, mut y) = (TopK::new(3), TopK::new(3));
|
|
1845
|
+
for (c, s) in a {
|
|
1846
|
+
let _ = x.push(*c, *s);
|
|
1847
|
+
}
|
|
1848
|
+
for (c, s) in b.iter().rev() {
|
|
1849
|
+
let _ = y.push(*c, *s);
|
|
1850
|
+
}
|
|
1851
|
+
y.merge(x);
|
|
1852
|
+
assert_eq!(y.finish(), want, "split at {split}");
|
|
1853
|
+
}
|
|
1854
|
+
}
|
|
1855
|
+
|
|
1856
|
+
/// #1283 lever 1: `admits` refuses exactly the scores `push` would drop whatever their
|
|
1857
|
+
/// cell (above the worst kept, with `k` kept), and admits a tie, which `push` settles
|
|
1858
|
+
/// by cell. Dropping a refused item before its push keeps the same result.
|
|
1859
|
+
#[test]
|
|
1860
|
+
fn top_k_admits_every_score_that_could_enter() {
|
|
1861
|
+
assert!(!TopK::<u32>::new(0).admits(&0));
|
|
1862
|
+
let mut t = TopK::new(2);
|
|
1863
|
+
assert!(t.admits(&9), "room left");
|
|
1864
|
+
let _ = t.push(cell("b", 0, "q", 1), 5u32);
|
|
1865
|
+
assert!(t.admits(&9), "room left");
|
|
1866
|
+
let _ = t.push(cell("c", 0, "q", 1), 7);
|
|
1867
|
+
assert!(t.admits(&6) && t.admits(&7), "below and tying the worst");
|
|
1868
|
+
assert!(!t.admits(&8), "above the worst");
|
|
1869
|
+
// A tie with a smaller cell enters; it was admitted.
|
|
1870
|
+
let _ = t.push(cell("a", 0, "q", 1), 7);
|
|
1871
|
+
assert_eq!(
|
|
1872
|
+
rows(&t.clone().finish()),
|
|
1873
|
+
vec![(&b"b"[..], 0, &b"q"[..], 1), (b"a", 0, b"q", 1)]
|
|
1874
|
+
);
|
|
1875
|
+
// Every refused score is one `push` drops.
|
|
1876
|
+
let before = t.clone().finish();
|
|
1877
|
+
let _ = t.push(cell("0", 0, "", 0), 8);
|
|
1878
|
+
assert_eq!(t.finish(), before);
|
|
1879
|
+
}
|
|
1880
|
+
|
|
1881
|
+
#[test]
|
|
1882
|
+
fn limit_keeps_the_first_n_cells_in_scan_order_whichever_group_finishes_first() {
|
|
1883
|
+
// Within a row, family 0's "z" comes before family 1's "a" (ctr274's case).
|
|
1884
|
+
let mut early = Limit::new(2);
|
|
1885
|
+
assert!(early.push(cell("a", 0, "z", 1), 1).is_continue());
|
|
1886
|
+
assert!(early.push(cell("a", 1, "a", 1), 2).is_break());
|
|
1887
|
+
let mut late = Limit::new(2);
|
|
1888
|
+
let _ = late.push(cell("m", 0, "a", 1), 3);
|
|
1889
|
+
let _ = late.push(cell("n", 0, "a", 1), 4);
|
|
1890
|
+
late.merge(early);
|
|
1891
|
+
let got: Vec<i32> = late.finish().into_iter().map(|(_, i)| i).collect();
|
|
1892
|
+
assert_eq!(got, vec![1, 2]);
|
|
1893
|
+
}
|
|
1894
|
+
|
|
1895
|
+
#[test]
|
|
1896
|
+
fn dedupe_keeps_the_first_cell_per_key_and_drops_excluded_keys() {
|
|
1897
|
+
fn key(i: &u32) -> u32 {
|
|
1898
|
+
*i
|
|
1899
|
+
}
|
|
1900
|
+
let exclude = Arc::new(std::collections::HashSet::from([9u32]));
|
|
1901
|
+
let mut a = Dedupe::new(key as fn(&u32) -> u32, Some(Arc::clone(&exclude)));
|
|
1902
|
+
let _ = a.push(cell("r2", 0, "q", 1), 7);
|
|
1903
|
+
let _ = a.push(cell("r1", 0, "q", 1), 9);
|
|
1904
|
+
let mut b = Dedupe::new(key as fn(&u32) -> u32, Some(exclude));
|
|
1905
|
+
let _ = b.push(cell("r1", 0, "q", 1), 7);
|
|
1906
|
+
a.merge(b);
|
|
1907
|
+
let got = a.finish();
|
|
1908
|
+
assert_eq!(got.len(), 1);
|
|
1909
|
+
assert_eq!((got[0].0.row.as_slice(), got[0].1), (&b"r1"[..], 7));
|
|
1910
|
+
}
|
|
1911
|
+
|
|
1912
|
+
/// D308: cut a read's cells into groups at row boundaries, push each group into its own
|
|
1913
|
+
/// budget with its local stop, merge in a random order: the result (cells, size and
|
|
1914
|
+
/// overflow) equals one budget over the whole read, and the hand-cut prefix.
|
|
1915
|
+
/// The whole read's page, and the page of its groups (cut at `cuts`) merged in `plan`'s
|
|
1916
|
+
/// order: each step takes a remaining group by index, merged into the accumulator or the
|
|
1917
|
+
/// accumulator into it.
|
|
1918
|
+
fn pages<F, L>(
|
|
1919
|
+
make: impl Fn() -> ByteBudget<u64, F, L>,
|
|
1920
|
+
cells: &[(CellKey, u64)],
|
|
1921
|
+
cuts: &[usize],
|
|
1922
|
+
plan: &[(usize, bool)],
|
|
1923
|
+
) -> (BytePage<u64>, BytePage<u64>)
|
|
1924
|
+
where
|
|
1925
|
+
F: Fn(&CellRef<'_>, &u64) -> u64 + Send,
|
|
1926
|
+
L: RowLimit,
|
|
1927
|
+
{
|
|
1928
|
+
let run = |part: &[(CellKey, u64)]| {
|
|
1929
|
+
let mut b = make();
|
|
1930
|
+
for (k, n) in part {
|
|
1931
|
+
if b.push(k.as_ref(), *n).is_break() {
|
|
1932
|
+
break;
|
|
1933
|
+
}
|
|
1934
|
+
}
|
|
1935
|
+
b
|
|
1936
|
+
};
|
|
1937
|
+
let whole = run(cells).into_page();
|
|
1938
|
+
let mut parts: Vec<_> = cuts.windows(2).map(|w| run(&cells[w[0]..w[1]])).collect();
|
|
1939
|
+
let mut steps = plan.iter();
|
|
1940
|
+
let (first, _) = steps.next().expect("a group at least");
|
|
1941
|
+
let mut acc = parts.swap_remove(*first);
|
|
1942
|
+
for (pick, into_acc) in steps {
|
|
1943
|
+
let next = parts.swap_remove(*pick);
|
|
1944
|
+
if *into_acc {
|
|
1945
|
+
acc.merge(next);
|
|
1946
|
+
} else {
|
|
1947
|
+
let mut other = next;
|
|
1948
|
+
other.merge(acc);
|
|
1949
|
+
acc = other;
|
|
1950
|
+
}
|
|
1951
|
+
}
|
|
1952
|
+
(whole, acc.into_page())
|
|
1953
|
+
}
|
|
1954
|
+
|
|
1955
|
+
#[test]
|
|
1956
|
+
fn a_byte_budget_merges_to_the_sequential_result_in_any_order() {
|
|
1957
|
+
struct Rng(u64);
|
|
1958
|
+
impl Rng {
|
|
1959
|
+
fn below(&mut self, n: u64) -> u64 {
|
|
1960
|
+
self.0 ^= self.0 << 13;
|
|
1961
|
+
self.0 ^= self.0 >> 7;
|
|
1962
|
+
self.0 ^= self.0 << 17;
|
|
1963
|
+
self.0 % n
|
|
1964
|
+
}
|
|
1965
|
+
}
|
|
1966
|
+
let seed = 0x5EED_D308;
|
|
1967
|
+
let mut rng = Rng(seed);
|
|
1968
|
+
// An item's own size: the length it carries.
|
|
1969
|
+
let size = |_: &CellRef<'_>, n: &u64| *n;
|
|
1970
|
+
for case in 0..500 {
|
|
1971
|
+
// Cells in cell order: rows, then two families, qualifiers, and 1 to 3 versions.
|
|
1972
|
+
let mut cells: Vec<(CellKey, u64)> = Vec::new();
|
|
1973
|
+
for r in 0..1 + rng.below(8) {
|
|
1974
|
+
let row = vec![b'r'; 1 + r as usize];
|
|
1975
|
+
for rank in 0..2 {
|
|
1976
|
+
for q in 0..rng.below(3) {
|
|
1977
|
+
let versions = 1 + rng.below(3);
|
|
1978
|
+
for v in 0..versions {
|
|
1979
|
+
cells.push((
|
|
1980
|
+
CellKey {
|
|
1981
|
+
row: row.clone(),
|
|
1982
|
+
family_rank: rank,
|
|
1983
|
+
family: FamilyId(rank),
|
|
1984
|
+
qualifier: vec![b'q', q as u8],
|
|
1985
|
+
ts: 10 - v,
|
|
1986
|
+
},
|
|
1987
|
+
1 + rng.below(20),
|
|
1988
|
+
));
|
|
1989
|
+
}
|
|
1990
|
+
}
|
|
1991
|
+
}
|
|
1992
|
+
}
|
|
1993
|
+
let budget = rng.below(120);
|
|
1994
|
+
// A row limit (a scan's `limit`, #1280) in a third of the cases.
|
|
1995
|
+
let row_limit = (rng.below(3) == 0).then(|| rng.below(5) as usize);
|
|
1996
|
+
// Groups at row boundaries, and the order they merge in.
|
|
1997
|
+
let mut cuts = vec![0];
|
|
1998
|
+
for i in 1..cells.len() {
|
|
1999
|
+
if cells[i].0.row != cells[i - 1].0.row && rng.below(2) == 0 {
|
|
2000
|
+
cuts.push(i);
|
|
2001
|
+
}
|
|
2002
|
+
}
|
|
2003
|
+
cuts.push(cells.len());
|
|
2004
|
+
let mut plan = Vec::new();
|
|
2005
|
+
for left in (1..cuts.len()).rev() {
|
|
2006
|
+
plan.push((rng.below(left as u64) as usize, rng.below(2) == 0));
|
|
2007
|
+
}
|
|
2008
|
+
let (whole, merged) = match row_limit {
|
|
2009
|
+
None => pages(|| ByteBudget::new(budget, size), &cells, &cuts, &plan),
|
|
2010
|
+
Some(n) => pages(
|
|
2011
|
+
|| ByteBudget::new(budget, size).with_rows(n),
|
|
2012
|
+
&cells,
|
|
2013
|
+
&cuts,
|
|
2014
|
+
&plan,
|
|
2015
|
+
),
|
|
2016
|
+
};
|
|
2017
|
+
let ctx = format!("seed {seed:#x}, case {case}, budget {budget}, rows {row_limit:?}");
|
|
2018
|
+
assert_eq!(rows(&merged.items), rows(&whole.items), "{ctx}");
|
|
2019
|
+
assert_eq!(merged.bytes, whole.bytes, "{ctx}");
|
|
2020
|
+
assert_eq!(merged.overflow, whole.overflow, "{ctx}");
|
|
2021
|
+
assert_eq!(merged.cut_by_rows, whole.cut_by_rows, "{ctx}");
|
|
2022
|
+
assert!(whole.bytes <= budget, "{ctx}");
|
|
2023
|
+
// The hand-cut prefix: whole columns while they fit and the row limit allows,
|
|
2024
|
+
// each row's key once.
|
|
2025
|
+
let (mut used, mut keep, mut i) = (0u64, 0usize, 0usize);
|
|
2026
|
+
let (mut over, mut cut_rows, mut kept_rows) = (None, false, 0usize);
|
|
2027
|
+
while i < cells.len() {
|
|
2028
|
+
let mut j = i + 1;
|
|
2029
|
+
while j < cells.len() && same_column(&cells[j].0, &cells[i].0) {
|
|
2030
|
+
j += 1;
|
|
2031
|
+
}
|
|
2032
|
+
let own: u64 = cells[i..j].iter().map(|c| c.1).sum();
|
|
2033
|
+
let row = cells[i].0.row.len() as u64;
|
|
2034
|
+
let new_row = keep == 0 || cells[keep - 1].0.row != cells[i].0.row;
|
|
2035
|
+
if new_row && row_limit == Some(kept_rows) {
|
|
2036
|
+
cut_rows = true;
|
|
2037
|
+
break;
|
|
2038
|
+
}
|
|
2039
|
+
let charge = if new_row { row } else { 0 };
|
|
2040
|
+
if used + own + charge > budget {
|
|
2041
|
+
over = Some((cells[i].0.clone(), own + row));
|
|
2042
|
+
break;
|
|
2043
|
+
}
|
|
2044
|
+
used += own + charge;
|
|
2045
|
+
kept_rows += usize::from(new_row);
|
|
2046
|
+
keep = j;
|
|
2047
|
+
i = j;
|
|
2048
|
+
}
|
|
2049
|
+
let want: Vec<CellKey> = cells[..keep].iter().map(|c| c.0.clone()).collect();
|
|
2050
|
+
assert_eq!(whole.cut_by_rows, cut_rows, "{ctx}");
|
|
2051
|
+
let got: Vec<CellKey> = whole.items.iter().map(|c| c.0.clone()).collect();
|
|
2052
|
+
assert_eq!(got, want, "{ctx}");
|
|
2053
|
+
assert_eq!(whole.bytes, used, "{ctx}");
|
|
2054
|
+
assert_eq!(whole.overflow.map(|o| (o.key, o.bytes)), over, "{ctx}");
|
|
2055
|
+
}
|
|
2056
|
+
}
|
|
2057
|
+
}
|