From 05b0eaecad5e40390352a4e182179a29ac784372 Mon Sep 17 00:00:00 2001 From: Lorina Poland Date: Mon, 28 Jun 2021 10:19:46 -0700 Subject: [PATCH] Migrate documentation to AsciiDoc This commit sets up a new documentation structure and format: * The directory struture changes from a Sphinx project to an Antora module layout. * The formatting of the content changes from reStructuredText to AsciiDoc. The documentation must now be built and published with Antora. Initially only from the cassandra-website repository. This change was done to make maintaining versioned website documentation easier. As Antora is designed to generate versioned documentation. The old directory structure was: - doc/ - cql3/ - CQL.css - CQL.textile - source/ - _static/ - _templates/ - _theme/ - _util/ - / - conf.py - index.rst - - make.bat - Makefile - README.md - SASI.md - <*.spec files> - The new directory structure organises the documentation into modules: - doc/ - cql3 - modules/ - cassandra/ - assets/ - examples/ - pages/ - partials/ - nav.adoc - ROOT/ - pages/ - nav.adoc - scripts/ - antora.yaml - README.md - SASI.md patch by Lorina Poland, Anthony Grasso; reviewed by Anthony Grasso, Mick Semb Wever for CASSANDRA-16763 Co-authored-by: Anthony Grasso --- .build/build-rat.xml | 3 + .gitignore | 4 +- build.xml | 11 +- doc/Makefile | 284 +- doc/README.md | 36 +- doc/SASI.md | 798 ---- doc/antora.yml | 18 + doc/make.bat | 299 -- doc/modules/ROOT/nav.adoc | 4 + doc/modules/ROOT/pages/index.adoc | 48 + .../assets/images/Figure_1_backups.jpg | Bin 0 -> 38551 bytes .../assets/images/Figure_1_data_model.jpg | Bin 0 -> 17469 bytes .../assets/images/Figure_1_guarantees.jpg | Bin 0 -> 17993 bytes .../assets/images/Figure_1_read_repair.jpg | Bin 0 -> 36919 bytes .../assets/images/Figure_2_data_model.jpg | Bin 0 -> 20925 bytes .../assets/images/Figure_2_read_repair.jpg | Bin 0 -> 45595 bytes .../assets/images/Figure_3_read_repair.jpg | Bin 0 -> 43021 bytes .../assets/images/Figure_4_read_repair.jpg | Bin 0 -> 43021 bytes .../assets/images/Figure_5_read_repair.jpg | Bin 0 -> 42560 bytes .../assets/images/Figure_6_read_repair.jpg | Bin 0 -> 57489 bytes .../images/data_modeling_chebotko_logical.png | Bin 0 -> 87366 bytes .../data_modeling_chebotko_physical.png | Bin 0 -> 4553809 bytes .../images/data_modeling_hotel_bucketing.png | Bin 0 -> 22009 bytes .../assets/images/data_modeling_hotel_erd.png | Bin 0 -> 233309 bytes .../images/data_modeling_hotel_logical.png | Bin 0 -> 116998 bytes .../images/data_modeling_hotel_physical.png | Bin 0 -> 119795 bytes .../images/data_modeling_hotel_queries.png | Bin 0 -> 103940 bytes .../images/data_modeling_hotel_relational.png | Bin 0 -> 102656 bytes .../data_modeling_reservation_logical.png | Bin 0 -> 121750 bytes .../data_modeling_reservation_physical.png | Bin 0 -> 142416 bytes .../cassandra/assets/images/docs_commit.png | Bin 0 -> 104667 bytes .../assets/images/docs_create_branch.png | Bin 0 -> 181860 bytes .../assets/images/docs_create_file.png | Bin 0 -> 209110 bytes .../cassandra/assets/images/docs_editor.png | Bin 0 -> 106175 bytes .../cassandra/assets/images/docs_fork.png | Bin 0 -> 76159 bytes .../cassandra/assets/images/docs_pr.png | Bin 0 -> 156081 bytes .../cassandra/assets/images/docs_preview.png | Bin 0 -> 123826 bytes .../assets}/images/eclipse_debug0.png | Bin .../assets}/images/eclipse_debug1.png | Bin .../assets}/images/eclipse_debug2.png | Bin .../assets}/images/eclipse_debug3.png | Bin .../assets}/images/eclipse_debug4.png | Bin .../assets}/images/eclipse_debug5.png | Bin .../assets}/images/eclipse_debug6.png | Bin .../assets/images/example-stress-graph.png | Bin 0 -> 359103 bytes doc/modules/cassandra/assets/images/hints.svg | 9 + doc/modules/cassandra/assets/images/ring.svg | 11 + .../cassandra/assets/images/vnodes.svg | 11 + .../cassandra/examples/BASH/add_repo_keys.sh | 1 + .../cassandra/examples/BASH/apt-get_cass.sh | 1 + .../cassandra/examples/BASH/apt-get_update.sh | 1 + .../cassandra/examples/BASH/check_backups.sh | 1 + .../examples/BASH/cqlsh_localhost.sh | 1 + .../cassandra/examples/BASH/curl_install.sh | 1 + .../examples/BASH/curl_verify_sha.sh | 1 + .../cassandra/examples/BASH/docker_cqlsh.sh | 1 + .../cassandra/examples/BASH/docker_pull.sh | 1 + .../cassandra/examples/BASH/docker_remove.sh | 1 + .../cassandra/examples/BASH/docker_run.sh | 1 + .../cassandra/examples/BASH/docker_run_qs.sh | 3 + .../cassandra/examples/BASH/find_backups.sh | 1 + .../cassandra/examples/BASH/find_snapshots.sh | 1 + .../cassandra/examples/BASH/find_sstables.sh | 1 + .../examples/BASH/find_two_snapshots.sh | 1 + .../examples/BASH/flush_and_check.sh | 2 + .../examples/BASH/get_deb_package.sh | 2 + .../cassandra/examples/BASH/java_verify.sh | 1 + .../examples/BASH/nodetool_clearsnapshot.sh | 1 + .../BASH/nodetool_clearsnapshot_all.sh | 1 + .../cassandra/examples/BASH/nodetool_flush.sh | 3 + .../examples/BASH/nodetool_flush_table.sh | 1 + .../examples/BASH/nodetool_list_snapshots.sh | 1 + .../examples/BASH/nodetool_snapshot.sh | 1 + .../examples/BASH/nodetool_status.sh | 1 + .../examples/BASH/nodetool_status_nobin.sh | 1 + .../cassandra/examples/BASH/run_cqlsh.sh | 1 + .../examples/BASH/run_cqlsh_nobin.sh | 1 + .../examples/BASH/snapshot_backup2.sh | 1 + .../examples/BASH/snapshot_both_backups.sh | 1 + .../cassandra/examples/BASH/snapshot_files.sh | 1 + .../examples/BASH/snapshot_mult_ks.sh | 1 + .../examples/BASH/snapshot_mult_tables.sh | 1 + .../BASH/snapshot_mult_tables_again.sh | 1 + .../examples/BASH/snapshot_one_table.sh | 1 + .../examples/BASH/snapshot_one_table2.sh | 1 + .../cassandra/examples/BASH/start_tarball.sh | 1 + .../cassandra/examples/BASH/tail_syslog.sh | 1 + .../examples/BASH/tail_syslog_package.sh | 1 + .../cassandra/examples/BASH/tarball.sh | 1 + .../cassandra/examples/BASH/verify_gpg.sh | 1 + .../cassandra/examples/BASH/yum_cass.sh | 1 + .../cassandra/examples/BASH/yum_start.sh | 1 + .../cassandra/examples/BASH/yum_update.sh | 1 + .../cassandra/examples/BNF/aggregate_name.bnf | 1 + .../cassandra/examples/BNF/alter_ks.bnf | 2 + .../examples/BNF/alter_mv_statement.bnf | 1 + .../examples/BNF/alter_role_statement.bnf | 1 + .../cassandra/examples/BNF/alter_table.bnf | 4 + .../examples/BNF/alter_udt_statement.bnf | 3 + .../examples/BNF/alter_user_statement.bnf | 1 + .../examples/BNF/batch_statement.bnf | 5 + .../examples/BNF/collection_literal.bnf | 4 + .../examples/BNF/collection_type.bnf | 3 + doc/modules/cassandra/examples/BNF/column.bnf | 1 + .../cassandra/examples/BNF/constant.bnf | 8 + .../cassandra/examples/BNF/cql_statement.bnf | 48 + .../cassandra/examples/BNF/cql_type.bnf | 1 + .../BNF/create_aggregate_statement.bnf | 6 + .../BNF/create_function_statement.bnf | 6 + .../examples/BNF/create_index_statement.bnf | 5 + .../cassandra/examples/BNF/create_ks.bnf | 2 + .../examples/BNF/create_mv_statement.bnf | 4 + .../examples/BNF/create_role_statement.bnf | 9 + .../cassandra/examples/BNF/create_table.bnf | 12 + .../examples/BNF/create_trigger_statement.bnf | 3 + .../cassandra/examples/BNF/create_type.bnf | 3 + .../examples/BNF/create_user_statement.bnf | 4 + .../cassandra/examples/BNF/custom_type.bnf | 1 + .../examples/BNF/delete_statement.bnf | 5 + .../BNF/describe_aggregate_statement.bnf | 1 + .../BNF/describe_aggregates_statement.bnf | 1 + .../BNF/describe_cluster_statement.bnf | 1 + .../BNF/describe_function_statement.bnf | 1 + .../BNF/describe_functions_statement.bnf | 1 + .../examples/BNF/describe_index_statement.bnf | 1 + .../BNF/describe_keyspace_statement.bnf | 1 + .../BNF/describe_keyspaces_statement.bnf | 1 + .../describe_materialized_view_statement.bnf | 1 + .../BNF/describe_object_statement.bnf | 1 + .../BNF/describe_schema_statement.bnf | 1 + .../examples/BNF/describe_table_statement.bnf | 1 + .../BNF/describe_tables_statement.bnf | 1 + .../examples/BNF/describe_type_statement.bnf | 1 + .../examples/BNF/describe_types_statement.bnf | 1 + .../examples/BNF/drop_aggregate_statement.bnf | 2 + .../examples/BNF/drop_function_statement.bnf | 2 + .../examples/BNF/drop_index_statement.bnf | 1 + .../cassandra/examples/BNF/drop_ks.bnf | 1 + .../examples/BNF/drop_mv_statement.bnf | 1 + .../examples/BNF/drop_role_statement.bnf | 1 + .../cassandra/examples/BNF/drop_table.bnf | 1 + .../examples/BNF/drop_trigger_statement.bnf | 1 + .../examples/BNF/drop_udt_statement.bnf | 1 + .../examples/BNF/drop_user_statement.bnf | 1 + .../cassandra/examples/BNF/function.bnf | 1 + .../BNF/grant_permission_statement.bnf | 12 + .../examples/BNF/grant_role_statement.bnf | 1 + .../cassandra/examples/BNF/identifier.bnf | 3 + doc/modules/cassandra/examples/BNF/index.bnf | 1 + .../cassandra/examples/BNF/index_name.bnf | 1 + .../examples/BNF/insert_statement.bnf | 6 + .../cassandra/examples/BNF/ks_table.bnf | 5 + .../BNF/list_permissions_statement.bnf | 1 + .../examples/BNF/list_roles_statement.bnf | 1 + .../examples/BNF/list_users_statement.bnf | 1 + .../examples/BNF/materialized_view.bnf | 1 + .../cassandra/examples/BNF/native_type.bnf | 4 + .../cassandra/examples/BNF/options.bnf | 4 + .../BNF/revoke_permission_statement.bnf | 1 + .../examples/BNF/revoke_role_statement.bnf | 1 + .../cassandra/examples/BNF/role_name.bnf | 1 + .../examples/BNF/select_statement.bnf | 21 + doc/modules/cassandra/examples/BNF/term.bnf | 6 + .../cassandra/examples/BNF/trigger_name.bnf | 1 + .../cassandra/examples/BNF/truncate_table.bnf | 1 + doc/modules/cassandra/examples/BNF/tuple.bnf | 2 + doc/modules/cassandra/examples/BNF/udt.bnf | 2 + .../cassandra/examples/BNF/udt_literal.bnf | 1 + .../examples/BNF/update_statement.bnf | 13 + doc/modules/cassandra/examples/BNF/use_ks.bnf | 1 + .../cassandra/examples/BNF/view_name.bnf | 1 + .../examples/CQL/allow_filtering.cql | 9 + .../cassandra/examples/CQL/alter_ks.cql | 2 + .../cassandra/examples/CQL/alter_role.cql | 1 + .../examples/CQL/alter_table_add_column.cql | 1 + .../examples/CQL/alter_table_spec_retry.cql | 1 + .../CQL/alter_table_spec_retry_percent.cql | 1 + .../examples/CQL/alter_table_with_comment.cql | 2 + .../cassandra/examples/CQL/alter_user.cql | 2 + doc/modules/cassandra/examples/CQL/as.cql | 13 + .../examples/CQL/autoexpand_exclude_dc.cql | 4 + .../cassandra/examples/CQL/autoexpand_ks.cql | 4 + .../examples/CQL/autoexpand_ks_override.cql | 4 + doc/modules/cassandra/examples/CQL/avg.cql | 1 + .../examples/CQL/batch_statement.cql | 6 + .../cassandra/examples/CQL/caching_option.cql | 6 + .../cassandra/examples/CQL/chunk_length.cql | 6 + doc/modules/cassandra/examples/CQL/count.cql | 2 + .../cassandra/examples/CQL/count_nonnull.cql | 1 + .../examples/CQL/create_function.cql | 15 + .../cassandra/examples/CQL/create_index.cql | 8 + .../cassandra/examples/CQL/create_ks.cql | 6 + .../examples/CQL/create_ks2_backup.cql | 2 + .../examples/CQL/create_ks_backup.cql | 2 + .../examples/CQL/create_ks_trans_repl.cql | 2 + .../examples/CQL/create_mv_statement.cql | 5 + .../cassandra/examples/CQL/create_role.cql | 6 + .../examples/CQL/create_role_ifnotexists.cql | 2 + .../examples/CQL/create_static_column.cql | 7 + .../cassandra/examples/CQL/create_table.cql | 23 + .../examples/CQL/create_table2_backup.cql | 14 + .../examples/CQL/create_table_backup.cql | 13 + .../CQL/create_table_clustercolumn.cql | 7 + .../examples/CQL/create_table_compound_pk.cql | 7 + .../examples/CQL/create_table_simple.cql | 4 + .../examples/CQL/create_table_single_pk.cql | 1 + .../cassandra/examples/CQL/create_trigger.cql | 1 + .../cassandra/examples/CQL/create_user.cql | 2 + .../examples/CQL/create_user_role.cql | 14 + .../cassandra/examples/CQL/currentdate.cql | 1 + .../examples/CQL/datetime_arithmetic.cql | 1 + .../examples/CQL/delete_all_elements_list.cql | 1 + .../examples/CQL/delete_element_list.cql | 1 + .../cassandra/examples/CQL/delete_map.cql | 2 + .../cassandra/examples/CQL/delete_set.cql | 1 + .../examples/CQL/delete_statement.cql | 5 + .../cassandra/examples/CQL/drop_aggregate.cql | 4 + .../cassandra/examples/CQL/drop_function.cql | 4 + .../cassandra/examples/CQL/drop_ks.cql | 1 + .../cassandra/examples/CQL/drop_trigger.cql | 1 + .../examples/CQL/function_dollarsign.cql | 15 + .../examples/CQL/function_overload.cql | 2 + .../examples/CQL/function_udfcontext.cql | 11 + .../cassandra/examples/CQL/grant_describe.cql | 1 + .../cassandra/examples/CQL/grant_drop.cql | 1 + .../cassandra/examples/CQL/grant_execute.cql | 1 + .../cassandra/examples/CQL/grant_modify.cql | 1 + .../cassandra/examples/CQL/grant_perm.cql | 1 + .../cassandra/examples/CQL/grant_role.cql | 1 + .../examples/CQL/insert_data2_backup.cql | 5 + .../examples/CQL/insert_data_backup.cql | 6 + .../examples/CQL/insert_duration.cql | 6 + .../cassandra/examples/CQL/insert_json.cql | 1 + .../examples/CQL/insert_statement.cql | 5 + .../examples/CQL/insert_static_data.cql | 2 + .../examples/CQL/insert_table_cc_addl.cql | 1 + .../CQL/insert_table_clustercolumn.cql | 5 + .../CQL/insert_table_clustercolumn2.cql | 5 + .../examples/CQL/insert_table_compound_pk.cql | 5 + .../cassandra/examples/CQL/insert_udt.cql | 17 + doc/modules/cassandra/examples/CQL/list.cql | 12 + .../cassandra/examples/CQL/list_all_perm.cql | 1 + .../cassandra/examples/CQL/list_perm.cql | 1 + .../cassandra/examples/CQL/list_roles.cql | 1 + .../examples/CQL/list_roles_nonrecursive.cql | 1 + .../cassandra/examples/CQL/list_roles_of.cql | 1 + .../examples/CQL/list_select_perm.cql | 1 + doc/modules/cassandra/examples/CQL/map.cql | 11 + .../cassandra/examples/CQL/min_max.cql | 1 + .../cassandra/examples/CQL/mv_table_def.cql | 8 + .../cassandra/examples/CQL/mv_table_error.cql | 13 + .../examples/CQL/mv_table_from_base.cql | 9 + .../cassandra/examples/CQL/no_revoke.cql | 5 + .../cassandra/examples/CQL/qs_create_ks.cql | 2 + .../examples/CQL/qs_create_table.cql | 6 + .../cassandra/examples/CQL/qs_insert_data.cql | 7 + .../examples/CQL/qs_insert_data_again.cql | 1 + .../cassandra/examples/CQL/qs_select_data.cql | 1 + .../examples/CQL/query_allow_filtering.cql | 5 + .../CQL/query_fail_allow_filtering.cql | 1 + .../CQL/query_nofail_allow_filtering.cql | 1 + .../examples/CQL/rename_udt_field.cql | 1 + .../cassandra/examples/CQL/revoke_perm.cql | 5 + .../cassandra/examples/CQL/revoke_role.cql | 1 + .../cassandra/examples/CQL/role_error.cql | 6 + .../examples/CQL/select_data2_backup.cql | 2 + .../examples/CQL/select_data_backup.cql | 2 + .../cassandra/examples/CQL/select_range.cql | 1 + .../examples/CQL/select_statement.cql | 11 + .../examples/CQL/select_static_data.cql | 1 + .../CQL/select_table_clustercolumn.cql | 1 + .../examples/CQL/select_table_compound_pk.cql | 1 + doc/modules/cassandra/examples/CQL/set.cql | 11 + .../examples/CQL/spec_retry_values.cql | 6 + doc/modules/cassandra/examples/CQL/sum.cql | 1 + .../examples/CQL/table_for_where.cql | 9 + .../examples/CQL/timeuuid_min_max.cql | 3 + .../cassandra/examples/CQL/timeuuid_now.cql | 1 + doc/modules/cassandra/examples/CQL/token.cql | 2 + doc/modules/cassandra/examples/CQL/tuple.cql | 6 + doc/modules/cassandra/examples/CQL/uda.cql | 41 + doc/modules/cassandra/examples/CQL/udt.cql | 16 + .../cassandra/examples/CQL/update_list.cql | 2 + .../cassandra/examples/CQL/update_map.cql | 2 + .../CQL/update_particular_list_element.cql | 1 + .../cassandra/examples/CQL/update_set.cql | 1 + .../examples/CQL/update_statement.cql | 10 + .../cassandra/examples/CQL/update_ttl_map.cql | 1 + doc/modules/cassandra/examples/CQL/use_ks.cql | 1 + doc/modules/cassandra/examples/CQL/where.cql | 4 + .../cassandra/examples/CQL/where_fail.cql | 5 + .../CQL/where_group_cluster_columns.cql | 3 + .../cassandra/examples/CQL/where_in_tuple.cql | 3 + .../CQL/where_no_group_cluster_columns.cql | 4 + .../cassandra/examples/JAVA/udf_imports.java | 8 + .../cassandra/examples/JAVA/udfcontext.java | 11 + .../examples/RESULTS/add_repo_keys.result | 4 + .../examples/RESULTS/add_yum_repo.result | 6 + .../RESULTS/autoexpand_exclude_dc.result | 1 + .../examples/RESULTS/autoexpand_ks.result | 1 + .../RESULTS/autoexpand_ks_override.result | 1 + .../examples/RESULTS/cqlsh_localhost.result | 11 + .../examples/RESULTS/curl_verify_sha.result | 1 + .../examples/RESULTS/find_backups.result | 4 + .../RESULTS/find_backups_table.result | 1 + .../RESULTS/find_two_snapshots.result | 3 + .../examples/RESULTS/flush_and_check.result | 9 + .../examples/RESULTS/flush_and_check2.result | 17 + .../RESULTS/insert_data2_backup.result | 13 + .../RESULTS/insert_table_cc_addl.result | 9 + .../examples/RESULTS/java_verify.result | 3 + .../cassandra/examples/RESULTS/no_bups.result | 1 + .../RESULTS/nodetool_list_snapshots.result | 13 + .../RESULTS/nodetool_snapshot_help.result | 54 + .../RESULTS/select_data2_backup.result | 13 + .../RESULTS/select_data_backup.result | 15 + .../examples/RESULTS/select_range.result | 6 + .../RESULTS/select_static_data.result | 4 + .../RESULTS/select_table_clustercolumn.result | 9 + .../RESULTS/select_table_compound_pk.result | 9 + .../examples/RESULTS/snapshot_all.result | 4 + .../examples/RESULTS/snapshot_backup2.result | 3 + .../RESULTS/snapshot_backup2_find.result | 2 + .../examples/RESULTS/snapshot_files.result | 11 + .../examples/RESULTS/snapshot_mult_ks.result | 3 + .../RESULTS/snapshot_mult_tables.result | 3 + .../RESULTS/snapshot_mult_tables_again.result | 3 + .../RESULTS/snapshot_one_table2.result | 3 + .../examples/RESULTS/tail_syslog.result | 1 + .../examples/RESULTS/verify_gpg.result | 2 + .../examples/TEXT/tarball_install_dirs.txt | 11 + .../examples/YAML/auto_snapshot.yaml | 1 + .../examples/YAML/incremental_bups.yaml | 1 + .../YAML/snapshot_before_compaction.yaml | 1 + .../examples/YAML/stress-example.yaml | 62 + .../examples/YAML/stress-lwt-example.yaml | 88 + doc/modules/cassandra/nav.adoc | 97 + .../cassandra/pages/architecture/dynamo.adoc | 531 +++ .../pages/architecture/guarantees.adoc | 108 + .../pages/architecture/images/ring.svg | 11 + .../pages/architecture/images/vnodes.svg | 11 + .../cassandra/pages/architecture/index.adoc | 9 + .../pages/architecture/overview.adoc | 101 + .../cassandra/pages/architecture/snitch.adoc | 74 + .../pages/architecture/storage_engine.adoc | 225 + .../configuration/cass_cl_archive_file.adoc | 48 + .../pages/configuration/cass_env_sh_file.adoc | 162 + .../configuration/cass_jvm_options_file.adoc | 22 + .../configuration/cass_logback_xml_file.adoc | 166 + .../pages/configuration/cass_rackdc_file.adoc | 79 + .../pages/configuration/cass_topo_file.adoc | 53 + .../cassandra/pages/configuration/index.adoc | 11 + doc/modules/cassandra/pages/cql/SASI.adoc | 809 ++++ .../cassandra/pages/cql/appendices.adoc | 179 + doc/modules/cassandra/pages/cql/changes.adoc | 215 + .../cassandra/pages/cql/cql_singlefile.adoc | 3904 +++++++++++++++++ doc/modules/cassandra/pages/cql/ddl.adoc | 799 ++++ .../cassandra/pages/cql/definitions.adoc | 187 + doc/modules/cassandra/pages/cql/dml.adoc | 458 ++ .../cassandra/pages/cql/functions.adoc | 504 +++ doc/modules/cassandra/pages/cql/index.adoc | 24 + doc/modules/cassandra/pages/cql/indexes.adoc | 63 + doc/modules/cassandra/pages/cql/json.adoc | 125 + doc/modules/cassandra/pages/cql/mvs.adoc | 158 + .../cassandra/pages/cql/operators.adoc | 68 + doc/modules/cassandra/pages/cql/security.adoc | 611 +++ doc/modules/cassandra/pages/cql/triggers.adoc | 50 + doc/modules/cassandra/pages/cql/types.adoc | 539 +++ .../data_modeling_conceptual.adoc | 44 + .../data_modeling/data_modeling_logical.adoc | 195 + .../data_modeling/data_modeling_physical.adoc | 96 + .../data_modeling/data_modeling_queries.adoc | 60 + .../data_modeling/data_modeling_rdbms.adoc | 144 + .../data_modeling/data_modeling_refining.adoc | 201 + .../data_modeling/data_modeling_schema.adoc | 130 + .../data_modeling/data_modeling_tools.adoc | 44 + .../images/Figure_1_data_model.jpg | Bin 0 -> 17469 bytes .../images/Figure_2_data_model.jpg | Bin 0 -> 20925 bytes .../images/data_modeling_chebotko_logical.png | Bin 0 -> 87366 bytes .../data_modeling_chebotko_physical.png | Bin 0 -> 4553809 bytes .../images/data_modeling_hotel_bucketing.png | Bin 0 -> 22009 bytes .../images/data_modeling_hotel_erd.png | Bin 0 -> 233309 bytes .../images/data_modeling_hotel_logical.png | Bin 0 -> 116998 bytes .../images/data_modeling_hotel_physical.png | Bin 0 -> 119795 bytes .../images/data_modeling_hotel_queries.png | Bin 0 -> 103940 bytes .../images/data_modeling_hotel_relational.png | Bin 0 -> 102656 bytes .../data_modeling_reservation_logical.png | Bin 0 -> 121750 bytes .../data_modeling_reservation_physical.png | Bin 0 -> 142416 bytes .../cassandra/pages/data_modeling/index.adoc | 11 + .../cassandra/pages/data_modeling/intro.adoc | 220 + doc/modules/cassandra/pages/faq/index.adoc | 290 ++ .../pages/getting_started/configuring.adoc | 84 + .../pages/getting_started/drivers.adoc | 90 + .../pages/getting_started/index.adoc | 30 + .../pages/getting_started/installing.adoc | 344 ++ .../pages/getting_started/production.adoc | 163 + .../pages/getting_started/querying.adoc | 31 + .../pages/getting_started/quickstart.adoc | 100 + .../pages/operating/audit_logging.adoc | 224 + .../cassandra/pages/operating/backups.adoc | 517 +++ .../pages/operating/bloom_filters.adoc | 64 + .../pages/operating/bulk_loading.adoc | 842 ++++ .../cassandra/pages/operating/cdc.adoc | 86 + .../pages/operating/compaction/index.adoc | 339 ++ .../pages/operating/compaction/lcs.adoc | 81 + .../pages/operating/compaction/stcs.adoc | 42 + .../pages/operating/compaction/twcs.adoc | 75 + .../pages/operating/compression.adoc | 187 + .../cassandra/pages/operating/hardware.adoc | 100 + .../cassandra/pages/operating/hints.adoc | 248 ++ .../cassandra/pages/operating/index.adoc | 15 + .../cassandra/pages/operating/metrics.adoc | 1088 +++++ .../pages/operating/read_repair.adoc | 264 ++ .../cassandra/pages/operating/repair.adoc | 222 + .../cassandra/pages/operating/security.adoc | 527 +++ .../pages/operating/topo_changes.adoc | 133 + .../cassandra/pages/plugins/index.adoc | 36 + .../pages/tools/cassandra_stress.adoc | 326 ++ doc/modules/cassandra/pages/tools/cqlsh.adoc | 482 ++ doc/modules/cassandra/pages/tools/index.adoc | 9 + .../cassandra/pages/tools/sstable/index.adoc | 20 + .../pages/tools/sstable/sstabledump.adoc | 286 ++ .../tools/sstable/sstableexpiredblockers.adoc | 42 + .../tools/sstable/sstablelevelreset.adoc | 69 + .../pages/tools/sstable/sstableloader.adoc | 316 ++ .../pages/tools/sstable/sstablemetadata.adoc | 320 ++ .../tools/sstable/sstableofflinerelevel.adoc | 94 + .../tools/sstable/sstablerepairedset.adoc | 83 + .../pages/tools/sstable/sstablescrub.adoc | 102 + .../pages/tools/sstable/sstablesplit.adoc | 96 + .../pages/tools/sstable/sstableupgrade.adoc | 136 + .../pages/tools/sstable/sstableutil.adoc | 102 + .../pages/tools/sstable/sstableverify.adoc | 82 + .../pages/troubleshooting/finding_nodes.adoc | 133 + .../pages/troubleshooting/index.adoc | 19 + .../pages/troubleshooting/reading_logs.adoc | 247 ++ .../pages/troubleshooting/use_nodetool.adoc | 242 + .../pages/troubleshooting/use_tools.adoc | 578 +++ .../cassandra/partials/java_version.adoc | 23 + .../partials/nodetool_and_cqlsh.adoc | 21 + .../partials/nodetool_and_cqlsh_nobin.adoc | 21 + .../cassandra/partials/package_versions.adoc | 5 + .../cassandra/partials/tail_syslog.adoc | 25 + .../convert_yaml_to_adoc.py} | 24 +- doc/scripts/gen-nodetool-docs.py | 83 + doc/source/_static/extra.css | 77 - doc/source/_templates/indexcontent.html | 89 - .../_theme/cassandra_theme/defindex.html | 40 - doc/source/_theme/cassandra_theme/layout.html | 108 - doc/source/_theme/cassandra_theme/search.html | 67 - doc/source/_theme/cassandra_theme/theme.conf | 3 - doc/source/_util/cql.py | 283 -- doc/source/architecture/dynamo.rst | 139 - doc/source/architecture/guarantees.rst | 20 - doc/source/architecture/index.rst | 29 - doc/source/architecture/overview.rst | 20 - doc/source/architecture/storage_engine.rst | 129 - doc/source/bugs.rst | 30 - doc/source/conf.py | 441 -- doc/source/configuration/index.rst | 25 - doc/source/contactus.rst | 53 - doc/source/cql/appendices.rst | 333 -- doc/source/cql/changes.rst | 204 - doc/source/cql/ddl.rst | 649 --- doc/source/cql/definitions.rst | 232 - doc/source/cql/dml.rst | 522 --- doc/source/cql/functions.rst | 558 --- doc/source/cql/index.rst | 47 - doc/source/cql/indexes.rst | 83 - doc/source/cql/json.rst | 115 - doc/source/cql/mvs.rst | 166 - doc/source/cql/security.rst | 502 --- doc/source/cql/triggers.rst | 63 - doc/source/cql/types.rst | 559 --- doc/source/data_modeling/index.rst | 20 - doc/source/development/code_style.rst | 94 - doc/source/development/how_to_commit.rst | 151 - doc/source/development/how_to_review.rst | 71 - doc/source/development/ide.rst | 161 - doc/source/development/index.rst | 29 - doc/source/development/license_compliance.rst | 37 - doc/source/development/patches.rst | 125 - doc/source/development/testing.rst | 170 - doc/source/faq/index.rst | 298 -- doc/source/getting_started/configuring.rst | 67 - doc/source/getting_started/drivers.rst | 107 - doc/source/getting_started/index.rst | 33 - doc/source/getting_started/installing.rst | 106 - doc/source/getting_started/querying.rst | 52 - doc/source/index.rst | 41 - doc/source/operating/backups.rst | 22 - doc/source/operating/bloom_filters.rst | 65 - doc/source/operating/bulk_loading.rst | 24 - doc/source/operating/cdc.rst | 89 - doc/source/operating/compaction.rst | 443 -- doc/source/operating/compression.rst | 94 - doc/source/operating/error_codes.txt | 31 - doc/source/operating/hardware.rst | 87 - doc/source/operating/hints.rst | 22 - doc/source/operating/index.rst | 39 - doc/source/operating/metrics.rst | 710 --- doc/source/operating/read_repair.rst | 22 - doc/source/operating/repair.rst | 22 - doc/source/operating/security.rst | 410 -- doc/source/operating/snitch.rst | 78 - doc/source/operating/topo_changes.rst | 124 - doc/source/tools/cqlsh.rst | 455 -- doc/source/tools/index.rst | 26 - doc/source/tools/nodetool.rst | 22 - doc/source/troubleshooting/index.rst | 20 - 510 files changed, 23214 insertions(+), 11345 deletions(-) delete mode 100644 doc/SASI.md create mode 100644 doc/antora.yml delete mode 100644 doc/make.bat create mode 100644 doc/modules/ROOT/nav.adoc create mode 100644 doc/modules/ROOT/pages/index.adoc create mode 100644 doc/modules/cassandra/assets/images/Figure_1_backups.jpg create mode 100644 doc/modules/cassandra/assets/images/Figure_1_data_model.jpg create mode 100644 doc/modules/cassandra/assets/images/Figure_1_guarantees.jpg create mode 100644 doc/modules/cassandra/assets/images/Figure_1_read_repair.jpg create mode 100644 doc/modules/cassandra/assets/images/Figure_2_data_model.jpg create mode 100644 doc/modules/cassandra/assets/images/Figure_2_read_repair.jpg create mode 100644 doc/modules/cassandra/assets/images/Figure_3_read_repair.jpg create mode 100644 doc/modules/cassandra/assets/images/Figure_4_read_repair.jpg create mode 100644 doc/modules/cassandra/assets/images/Figure_5_read_repair.jpg create mode 100644 doc/modules/cassandra/assets/images/Figure_6_read_repair.jpg create mode 100755 doc/modules/cassandra/assets/images/data_modeling_chebotko_logical.png create mode 100644 doc/modules/cassandra/assets/images/data_modeling_chebotko_physical.png create mode 100644 doc/modules/cassandra/assets/images/data_modeling_hotel_bucketing.png create mode 100755 doc/modules/cassandra/assets/images/data_modeling_hotel_erd.png create mode 100755 doc/modules/cassandra/assets/images/data_modeling_hotel_logical.png create mode 100644 doc/modules/cassandra/assets/images/data_modeling_hotel_physical.png create mode 100755 doc/modules/cassandra/assets/images/data_modeling_hotel_queries.png create mode 100755 doc/modules/cassandra/assets/images/data_modeling_hotel_relational.png create mode 100755 doc/modules/cassandra/assets/images/data_modeling_reservation_logical.png create mode 100755 doc/modules/cassandra/assets/images/data_modeling_reservation_physical.png create mode 100644 doc/modules/cassandra/assets/images/docs_commit.png create mode 100644 doc/modules/cassandra/assets/images/docs_create_branch.png create mode 100644 doc/modules/cassandra/assets/images/docs_create_file.png create mode 100644 doc/modules/cassandra/assets/images/docs_editor.png create mode 100644 doc/modules/cassandra/assets/images/docs_fork.png create mode 100644 doc/modules/cassandra/assets/images/docs_pr.png create mode 100644 doc/modules/cassandra/assets/images/docs_preview.png rename doc/{source/development => modules/cassandra/assets}/images/eclipse_debug0.png (100%) rename doc/{source/development => modules/cassandra/assets}/images/eclipse_debug1.png (100%) rename doc/{source/development => modules/cassandra/assets}/images/eclipse_debug2.png (100%) rename doc/{source/development => modules/cassandra/assets}/images/eclipse_debug3.png (100%) rename doc/{source/development => modules/cassandra/assets}/images/eclipse_debug4.png (100%) rename doc/{source/development => modules/cassandra/assets}/images/eclipse_debug5.png (100%) rename doc/{source/development => modules/cassandra/assets}/images/eclipse_debug6.png (100%) create mode 100644 doc/modules/cassandra/assets/images/example-stress-graph.png create mode 100644 doc/modules/cassandra/assets/images/hints.svg create mode 100644 doc/modules/cassandra/assets/images/ring.svg create mode 100644 doc/modules/cassandra/assets/images/vnodes.svg create mode 100644 doc/modules/cassandra/examples/BASH/add_repo_keys.sh create mode 100644 doc/modules/cassandra/examples/BASH/apt-get_cass.sh create mode 100644 doc/modules/cassandra/examples/BASH/apt-get_update.sh create mode 100644 doc/modules/cassandra/examples/BASH/check_backups.sh create mode 100644 doc/modules/cassandra/examples/BASH/cqlsh_localhost.sh create mode 100644 doc/modules/cassandra/examples/BASH/curl_install.sh create mode 100644 doc/modules/cassandra/examples/BASH/curl_verify_sha.sh create mode 100644 doc/modules/cassandra/examples/BASH/docker_cqlsh.sh create mode 100644 doc/modules/cassandra/examples/BASH/docker_pull.sh create mode 100644 doc/modules/cassandra/examples/BASH/docker_remove.sh create mode 100644 doc/modules/cassandra/examples/BASH/docker_run.sh create mode 100644 doc/modules/cassandra/examples/BASH/docker_run_qs.sh create mode 100644 doc/modules/cassandra/examples/BASH/find_backups.sh create mode 100644 doc/modules/cassandra/examples/BASH/find_snapshots.sh create mode 100644 doc/modules/cassandra/examples/BASH/find_sstables.sh create mode 100644 doc/modules/cassandra/examples/BASH/find_two_snapshots.sh create mode 100644 doc/modules/cassandra/examples/BASH/flush_and_check.sh create mode 100644 doc/modules/cassandra/examples/BASH/get_deb_package.sh create mode 100644 doc/modules/cassandra/examples/BASH/java_verify.sh create mode 100644 doc/modules/cassandra/examples/BASH/nodetool_clearsnapshot.sh create mode 100644 doc/modules/cassandra/examples/BASH/nodetool_clearsnapshot_all.sh create mode 100644 doc/modules/cassandra/examples/BASH/nodetool_flush.sh create mode 100644 doc/modules/cassandra/examples/BASH/nodetool_flush_table.sh create mode 100644 doc/modules/cassandra/examples/BASH/nodetool_list_snapshots.sh create mode 100644 doc/modules/cassandra/examples/BASH/nodetool_snapshot.sh create mode 100644 doc/modules/cassandra/examples/BASH/nodetool_status.sh create mode 100644 doc/modules/cassandra/examples/BASH/nodetool_status_nobin.sh create mode 100644 doc/modules/cassandra/examples/BASH/run_cqlsh.sh create mode 100644 doc/modules/cassandra/examples/BASH/run_cqlsh_nobin.sh create mode 100644 doc/modules/cassandra/examples/BASH/snapshot_backup2.sh create mode 100644 doc/modules/cassandra/examples/BASH/snapshot_both_backups.sh create mode 100644 doc/modules/cassandra/examples/BASH/snapshot_files.sh create mode 100644 doc/modules/cassandra/examples/BASH/snapshot_mult_ks.sh create mode 100644 doc/modules/cassandra/examples/BASH/snapshot_mult_tables.sh create mode 100644 doc/modules/cassandra/examples/BASH/snapshot_mult_tables_again.sh create mode 100644 doc/modules/cassandra/examples/BASH/snapshot_one_table.sh create mode 100644 doc/modules/cassandra/examples/BASH/snapshot_one_table2.sh create mode 100644 doc/modules/cassandra/examples/BASH/start_tarball.sh create mode 100644 doc/modules/cassandra/examples/BASH/tail_syslog.sh create mode 100644 doc/modules/cassandra/examples/BASH/tail_syslog_package.sh create mode 100644 doc/modules/cassandra/examples/BASH/tarball.sh create mode 100644 doc/modules/cassandra/examples/BASH/verify_gpg.sh create mode 100644 doc/modules/cassandra/examples/BASH/yum_cass.sh create mode 100644 doc/modules/cassandra/examples/BASH/yum_start.sh create mode 100644 doc/modules/cassandra/examples/BASH/yum_update.sh create mode 100644 doc/modules/cassandra/examples/BNF/aggregate_name.bnf create mode 100644 doc/modules/cassandra/examples/BNF/alter_ks.bnf create mode 100644 doc/modules/cassandra/examples/BNF/alter_mv_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/alter_role_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/alter_table.bnf create mode 100644 doc/modules/cassandra/examples/BNF/alter_udt_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/alter_user_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/batch_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/collection_literal.bnf create mode 100644 doc/modules/cassandra/examples/BNF/collection_type.bnf create mode 100644 doc/modules/cassandra/examples/BNF/column.bnf create mode 100644 doc/modules/cassandra/examples/BNF/constant.bnf create mode 100644 doc/modules/cassandra/examples/BNF/cql_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/cql_type.bnf create mode 100644 doc/modules/cassandra/examples/BNF/create_aggregate_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/create_function_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/create_index_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/create_ks.bnf create mode 100644 doc/modules/cassandra/examples/BNF/create_mv_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/create_role_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/create_table.bnf create mode 100644 doc/modules/cassandra/examples/BNF/create_trigger_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/create_type.bnf create mode 100644 doc/modules/cassandra/examples/BNF/create_user_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/custom_type.bnf create mode 100644 doc/modules/cassandra/examples/BNF/delete_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/describe_aggregate_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/describe_aggregates_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/describe_cluster_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/describe_function_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/describe_functions_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/describe_index_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/describe_keyspace_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/describe_keyspaces_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/describe_materialized_view_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/describe_object_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/describe_schema_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/describe_table_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/describe_tables_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/describe_type_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/describe_types_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/drop_aggregate_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/drop_function_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/drop_index_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/drop_ks.bnf create mode 100644 doc/modules/cassandra/examples/BNF/drop_mv_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/drop_role_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/drop_table.bnf create mode 100644 doc/modules/cassandra/examples/BNF/drop_trigger_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/drop_udt_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/drop_user_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/function.bnf create mode 100644 doc/modules/cassandra/examples/BNF/grant_permission_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/grant_role_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/identifier.bnf create mode 100644 doc/modules/cassandra/examples/BNF/index.bnf create mode 100644 doc/modules/cassandra/examples/BNF/index_name.bnf create mode 100644 doc/modules/cassandra/examples/BNF/insert_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/ks_table.bnf create mode 100644 doc/modules/cassandra/examples/BNF/list_permissions_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/list_roles_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/list_users_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/materialized_view.bnf create mode 100644 doc/modules/cassandra/examples/BNF/native_type.bnf create mode 100644 doc/modules/cassandra/examples/BNF/options.bnf create mode 100644 doc/modules/cassandra/examples/BNF/revoke_permission_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/revoke_role_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/role_name.bnf create mode 100644 doc/modules/cassandra/examples/BNF/select_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/term.bnf create mode 100644 doc/modules/cassandra/examples/BNF/trigger_name.bnf create mode 100644 doc/modules/cassandra/examples/BNF/truncate_table.bnf create mode 100644 doc/modules/cassandra/examples/BNF/tuple.bnf create mode 100644 doc/modules/cassandra/examples/BNF/udt.bnf create mode 100644 doc/modules/cassandra/examples/BNF/udt_literal.bnf create mode 100644 doc/modules/cassandra/examples/BNF/update_statement.bnf create mode 100644 doc/modules/cassandra/examples/BNF/use_ks.bnf create mode 100644 doc/modules/cassandra/examples/BNF/view_name.bnf create mode 100644 doc/modules/cassandra/examples/CQL/allow_filtering.cql create mode 100644 doc/modules/cassandra/examples/CQL/alter_ks.cql create mode 100644 doc/modules/cassandra/examples/CQL/alter_role.cql create mode 100644 doc/modules/cassandra/examples/CQL/alter_table_add_column.cql create mode 100644 doc/modules/cassandra/examples/CQL/alter_table_spec_retry.cql create mode 100644 doc/modules/cassandra/examples/CQL/alter_table_spec_retry_percent.cql create mode 100644 doc/modules/cassandra/examples/CQL/alter_table_with_comment.cql create mode 100644 doc/modules/cassandra/examples/CQL/alter_user.cql create mode 100644 doc/modules/cassandra/examples/CQL/as.cql create mode 100644 doc/modules/cassandra/examples/CQL/autoexpand_exclude_dc.cql create mode 100644 doc/modules/cassandra/examples/CQL/autoexpand_ks.cql create mode 100644 doc/modules/cassandra/examples/CQL/autoexpand_ks_override.cql create mode 100644 doc/modules/cassandra/examples/CQL/avg.cql create mode 100644 doc/modules/cassandra/examples/CQL/batch_statement.cql create mode 100644 doc/modules/cassandra/examples/CQL/caching_option.cql create mode 100644 doc/modules/cassandra/examples/CQL/chunk_length.cql create mode 100644 doc/modules/cassandra/examples/CQL/count.cql create mode 100644 doc/modules/cassandra/examples/CQL/count_nonnull.cql create mode 100644 doc/modules/cassandra/examples/CQL/create_function.cql create mode 100644 doc/modules/cassandra/examples/CQL/create_index.cql create mode 100644 doc/modules/cassandra/examples/CQL/create_ks.cql create mode 100644 doc/modules/cassandra/examples/CQL/create_ks2_backup.cql create mode 100644 doc/modules/cassandra/examples/CQL/create_ks_backup.cql create mode 100644 doc/modules/cassandra/examples/CQL/create_ks_trans_repl.cql create mode 100644 doc/modules/cassandra/examples/CQL/create_mv_statement.cql create mode 100644 doc/modules/cassandra/examples/CQL/create_role.cql create mode 100644 doc/modules/cassandra/examples/CQL/create_role_ifnotexists.cql create mode 100644 doc/modules/cassandra/examples/CQL/create_static_column.cql create mode 100644 doc/modules/cassandra/examples/CQL/create_table.cql create mode 100644 doc/modules/cassandra/examples/CQL/create_table2_backup.cql create mode 100644 doc/modules/cassandra/examples/CQL/create_table_backup.cql create mode 100644 doc/modules/cassandra/examples/CQL/create_table_clustercolumn.cql create mode 100644 doc/modules/cassandra/examples/CQL/create_table_compound_pk.cql create mode 100644 doc/modules/cassandra/examples/CQL/create_table_simple.cql create mode 100644 doc/modules/cassandra/examples/CQL/create_table_single_pk.cql create mode 100644 doc/modules/cassandra/examples/CQL/create_trigger.cql create mode 100644 doc/modules/cassandra/examples/CQL/create_user.cql create mode 100644 doc/modules/cassandra/examples/CQL/create_user_role.cql create mode 100644 doc/modules/cassandra/examples/CQL/currentdate.cql create mode 100644 doc/modules/cassandra/examples/CQL/datetime_arithmetic.cql create mode 100644 doc/modules/cassandra/examples/CQL/delete_all_elements_list.cql create mode 100644 doc/modules/cassandra/examples/CQL/delete_element_list.cql create mode 100644 doc/modules/cassandra/examples/CQL/delete_map.cql create mode 100644 doc/modules/cassandra/examples/CQL/delete_set.cql create mode 100644 doc/modules/cassandra/examples/CQL/delete_statement.cql create mode 100644 doc/modules/cassandra/examples/CQL/drop_aggregate.cql create mode 100644 doc/modules/cassandra/examples/CQL/drop_function.cql create mode 100644 doc/modules/cassandra/examples/CQL/drop_ks.cql create mode 100644 doc/modules/cassandra/examples/CQL/drop_trigger.cql create mode 100644 doc/modules/cassandra/examples/CQL/function_dollarsign.cql create mode 100644 doc/modules/cassandra/examples/CQL/function_overload.cql create mode 100644 doc/modules/cassandra/examples/CQL/function_udfcontext.cql create mode 100644 doc/modules/cassandra/examples/CQL/grant_describe.cql create mode 100644 doc/modules/cassandra/examples/CQL/grant_drop.cql create mode 100644 doc/modules/cassandra/examples/CQL/grant_execute.cql create mode 100644 doc/modules/cassandra/examples/CQL/grant_modify.cql create mode 100644 doc/modules/cassandra/examples/CQL/grant_perm.cql create mode 100644 doc/modules/cassandra/examples/CQL/grant_role.cql create mode 100644 doc/modules/cassandra/examples/CQL/insert_data2_backup.cql create mode 100644 doc/modules/cassandra/examples/CQL/insert_data_backup.cql create mode 100644 doc/modules/cassandra/examples/CQL/insert_duration.cql create mode 100644 doc/modules/cassandra/examples/CQL/insert_json.cql create mode 100644 doc/modules/cassandra/examples/CQL/insert_statement.cql create mode 100644 doc/modules/cassandra/examples/CQL/insert_static_data.cql create mode 100644 doc/modules/cassandra/examples/CQL/insert_table_cc_addl.cql create mode 100644 doc/modules/cassandra/examples/CQL/insert_table_clustercolumn.cql create mode 100644 doc/modules/cassandra/examples/CQL/insert_table_clustercolumn2.cql create mode 100644 doc/modules/cassandra/examples/CQL/insert_table_compound_pk.cql create mode 100644 doc/modules/cassandra/examples/CQL/insert_udt.cql create mode 100644 doc/modules/cassandra/examples/CQL/list.cql create mode 100644 doc/modules/cassandra/examples/CQL/list_all_perm.cql create mode 100644 doc/modules/cassandra/examples/CQL/list_perm.cql create mode 100644 doc/modules/cassandra/examples/CQL/list_roles.cql create mode 100644 doc/modules/cassandra/examples/CQL/list_roles_nonrecursive.cql create mode 100644 doc/modules/cassandra/examples/CQL/list_roles_of.cql create mode 100644 doc/modules/cassandra/examples/CQL/list_select_perm.cql create mode 100644 doc/modules/cassandra/examples/CQL/map.cql create mode 100644 doc/modules/cassandra/examples/CQL/min_max.cql create mode 100644 doc/modules/cassandra/examples/CQL/mv_table_def.cql create mode 100644 doc/modules/cassandra/examples/CQL/mv_table_error.cql create mode 100644 doc/modules/cassandra/examples/CQL/mv_table_from_base.cql create mode 100644 doc/modules/cassandra/examples/CQL/no_revoke.cql create mode 100644 doc/modules/cassandra/examples/CQL/qs_create_ks.cql create mode 100644 doc/modules/cassandra/examples/CQL/qs_create_table.cql create mode 100644 doc/modules/cassandra/examples/CQL/qs_insert_data.cql create mode 100644 doc/modules/cassandra/examples/CQL/qs_insert_data_again.cql create mode 100644 doc/modules/cassandra/examples/CQL/qs_select_data.cql create mode 100644 doc/modules/cassandra/examples/CQL/query_allow_filtering.cql create mode 100644 doc/modules/cassandra/examples/CQL/query_fail_allow_filtering.cql create mode 100644 doc/modules/cassandra/examples/CQL/query_nofail_allow_filtering.cql create mode 100644 doc/modules/cassandra/examples/CQL/rename_udt_field.cql create mode 100644 doc/modules/cassandra/examples/CQL/revoke_perm.cql create mode 100644 doc/modules/cassandra/examples/CQL/revoke_role.cql create mode 100644 doc/modules/cassandra/examples/CQL/role_error.cql create mode 100644 doc/modules/cassandra/examples/CQL/select_data2_backup.cql create mode 100644 doc/modules/cassandra/examples/CQL/select_data_backup.cql create mode 100644 doc/modules/cassandra/examples/CQL/select_range.cql create mode 100644 doc/modules/cassandra/examples/CQL/select_statement.cql create mode 100644 doc/modules/cassandra/examples/CQL/select_static_data.cql create mode 100644 doc/modules/cassandra/examples/CQL/select_table_clustercolumn.cql create mode 100644 doc/modules/cassandra/examples/CQL/select_table_compound_pk.cql create mode 100644 doc/modules/cassandra/examples/CQL/set.cql create mode 100644 doc/modules/cassandra/examples/CQL/spec_retry_values.cql create mode 100644 doc/modules/cassandra/examples/CQL/sum.cql create mode 100644 doc/modules/cassandra/examples/CQL/table_for_where.cql create mode 100644 doc/modules/cassandra/examples/CQL/timeuuid_min_max.cql create mode 100644 doc/modules/cassandra/examples/CQL/timeuuid_now.cql create mode 100644 doc/modules/cassandra/examples/CQL/token.cql create mode 100644 doc/modules/cassandra/examples/CQL/tuple.cql create mode 100644 doc/modules/cassandra/examples/CQL/uda.cql create mode 100644 doc/modules/cassandra/examples/CQL/udt.cql create mode 100644 doc/modules/cassandra/examples/CQL/update_list.cql create mode 100644 doc/modules/cassandra/examples/CQL/update_map.cql create mode 100644 doc/modules/cassandra/examples/CQL/update_particular_list_element.cql create mode 100644 doc/modules/cassandra/examples/CQL/update_set.cql create mode 100644 doc/modules/cassandra/examples/CQL/update_statement.cql create mode 100644 doc/modules/cassandra/examples/CQL/update_ttl_map.cql create mode 100644 doc/modules/cassandra/examples/CQL/use_ks.cql create mode 100644 doc/modules/cassandra/examples/CQL/where.cql create mode 100644 doc/modules/cassandra/examples/CQL/where_fail.cql create mode 100644 doc/modules/cassandra/examples/CQL/where_group_cluster_columns.cql create mode 100644 doc/modules/cassandra/examples/CQL/where_in_tuple.cql create mode 100644 doc/modules/cassandra/examples/CQL/where_no_group_cluster_columns.cql create mode 100644 doc/modules/cassandra/examples/JAVA/udf_imports.java create mode 100644 doc/modules/cassandra/examples/JAVA/udfcontext.java create mode 100644 doc/modules/cassandra/examples/RESULTS/add_repo_keys.result create mode 100644 doc/modules/cassandra/examples/RESULTS/add_yum_repo.result create mode 100644 doc/modules/cassandra/examples/RESULTS/autoexpand_exclude_dc.result create mode 100644 doc/modules/cassandra/examples/RESULTS/autoexpand_ks.result create mode 100644 doc/modules/cassandra/examples/RESULTS/autoexpand_ks_override.result create mode 100644 doc/modules/cassandra/examples/RESULTS/cqlsh_localhost.result create mode 100644 doc/modules/cassandra/examples/RESULTS/curl_verify_sha.result create mode 100644 doc/modules/cassandra/examples/RESULTS/find_backups.result create mode 100644 doc/modules/cassandra/examples/RESULTS/find_backups_table.result create mode 100644 doc/modules/cassandra/examples/RESULTS/find_two_snapshots.result create mode 100644 doc/modules/cassandra/examples/RESULTS/flush_and_check.result create mode 100644 doc/modules/cassandra/examples/RESULTS/flush_and_check2.result create mode 100644 doc/modules/cassandra/examples/RESULTS/insert_data2_backup.result create mode 100644 doc/modules/cassandra/examples/RESULTS/insert_table_cc_addl.result create mode 100644 doc/modules/cassandra/examples/RESULTS/java_verify.result create mode 100644 doc/modules/cassandra/examples/RESULTS/no_bups.result create mode 100644 doc/modules/cassandra/examples/RESULTS/nodetool_list_snapshots.result create mode 100644 doc/modules/cassandra/examples/RESULTS/nodetool_snapshot_help.result create mode 100644 doc/modules/cassandra/examples/RESULTS/select_data2_backup.result create mode 100644 doc/modules/cassandra/examples/RESULTS/select_data_backup.result create mode 100644 doc/modules/cassandra/examples/RESULTS/select_range.result create mode 100644 doc/modules/cassandra/examples/RESULTS/select_static_data.result create mode 100644 doc/modules/cassandra/examples/RESULTS/select_table_clustercolumn.result create mode 100644 doc/modules/cassandra/examples/RESULTS/select_table_compound_pk.result create mode 100644 doc/modules/cassandra/examples/RESULTS/snapshot_all.result create mode 100644 doc/modules/cassandra/examples/RESULTS/snapshot_backup2.result create mode 100644 doc/modules/cassandra/examples/RESULTS/snapshot_backup2_find.result create mode 100644 doc/modules/cassandra/examples/RESULTS/snapshot_files.result create mode 100644 doc/modules/cassandra/examples/RESULTS/snapshot_mult_ks.result create mode 100644 doc/modules/cassandra/examples/RESULTS/snapshot_mult_tables.result create mode 100644 doc/modules/cassandra/examples/RESULTS/snapshot_mult_tables_again.result create mode 100644 doc/modules/cassandra/examples/RESULTS/snapshot_one_table2.result create mode 100644 doc/modules/cassandra/examples/RESULTS/tail_syslog.result create mode 100644 doc/modules/cassandra/examples/RESULTS/verify_gpg.result create mode 100644 doc/modules/cassandra/examples/TEXT/tarball_install_dirs.txt create mode 100644 doc/modules/cassandra/examples/YAML/auto_snapshot.yaml create mode 100644 doc/modules/cassandra/examples/YAML/incremental_bups.yaml create mode 100644 doc/modules/cassandra/examples/YAML/snapshot_before_compaction.yaml create mode 100644 doc/modules/cassandra/examples/YAML/stress-example.yaml create mode 100644 doc/modules/cassandra/examples/YAML/stress-lwt-example.yaml create mode 100644 doc/modules/cassandra/nav.adoc create mode 100644 doc/modules/cassandra/pages/architecture/dynamo.adoc create mode 100644 doc/modules/cassandra/pages/architecture/guarantees.adoc create mode 100644 doc/modules/cassandra/pages/architecture/images/ring.svg create mode 100644 doc/modules/cassandra/pages/architecture/images/vnodes.svg create mode 100644 doc/modules/cassandra/pages/architecture/index.adoc create mode 100644 doc/modules/cassandra/pages/architecture/overview.adoc create mode 100644 doc/modules/cassandra/pages/architecture/snitch.adoc create mode 100644 doc/modules/cassandra/pages/architecture/storage_engine.adoc create mode 100644 doc/modules/cassandra/pages/configuration/cass_cl_archive_file.adoc create mode 100644 doc/modules/cassandra/pages/configuration/cass_env_sh_file.adoc create mode 100644 doc/modules/cassandra/pages/configuration/cass_jvm_options_file.adoc create mode 100644 doc/modules/cassandra/pages/configuration/cass_logback_xml_file.adoc create mode 100644 doc/modules/cassandra/pages/configuration/cass_rackdc_file.adoc create mode 100644 doc/modules/cassandra/pages/configuration/cass_topo_file.adoc create mode 100644 doc/modules/cassandra/pages/configuration/index.adoc create mode 100644 doc/modules/cassandra/pages/cql/SASI.adoc create mode 100644 doc/modules/cassandra/pages/cql/appendices.adoc create mode 100644 doc/modules/cassandra/pages/cql/changes.adoc create mode 100644 doc/modules/cassandra/pages/cql/cql_singlefile.adoc create mode 100644 doc/modules/cassandra/pages/cql/ddl.adoc create mode 100644 doc/modules/cassandra/pages/cql/definitions.adoc create mode 100644 doc/modules/cassandra/pages/cql/dml.adoc create mode 100644 doc/modules/cassandra/pages/cql/functions.adoc create mode 100644 doc/modules/cassandra/pages/cql/index.adoc create mode 100644 doc/modules/cassandra/pages/cql/indexes.adoc create mode 100644 doc/modules/cassandra/pages/cql/json.adoc create mode 100644 doc/modules/cassandra/pages/cql/mvs.adoc create mode 100644 doc/modules/cassandra/pages/cql/operators.adoc create mode 100644 doc/modules/cassandra/pages/cql/security.adoc create mode 100644 doc/modules/cassandra/pages/cql/triggers.adoc create mode 100644 doc/modules/cassandra/pages/cql/types.adoc create mode 100644 doc/modules/cassandra/pages/data_modeling/data_modeling_conceptual.adoc create mode 100644 doc/modules/cassandra/pages/data_modeling/data_modeling_logical.adoc create mode 100644 doc/modules/cassandra/pages/data_modeling/data_modeling_physical.adoc create mode 100644 doc/modules/cassandra/pages/data_modeling/data_modeling_queries.adoc create mode 100644 doc/modules/cassandra/pages/data_modeling/data_modeling_rdbms.adoc create mode 100644 doc/modules/cassandra/pages/data_modeling/data_modeling_refining.adoc create mode 100644 doc/modules/cassandra/pages/data_modeling/data_modeling_schema.adoc create mode 100644 doc/modules/cassandra/pages/data_modeling/data_modeling_tools.adoc create mode 100644 doc/modules/cassandra/pages/data_modeling/images/Figure_1_data_model.jpg create mode 100644 doc/modules/cassandra/pages/data_modeling/images/Figure_2_data_model.jpg create mode 100755 doc/modules/cassandra/pages/data_modeling/images/data_modeling_chebotko_logical.png create mode 100644 doc/modules/cassandra/pages/data_modeling/images/data_modeling_chebotko_physical.png create mode 100644 doc/modules/cassandra/pages/data_modeling/images/data_modeling_hotel_bucketing.png create mode 100755 doc/modules/cassandra/pages/data_modeling/images/data_modeling_hotel_erd.png create mode 100755 doc/modules/cassandra/pages/data_modeling/images/data_modeling_hotel_logical.png create mode 100644 doc/modules/cassandra/pages/data_modeling/images/data_modeling_hotel_physical.png create mode 100755 doc/modules/cassandra/pages/data_modeling/images/data_modeling_hotel_queries.png create mode 100755 doc/modules/cassandra/pages/data_modeling/images/data_modeling_hotel_relational.png create mode 100755 doc/modules/cassandra/pages/data_modeling/images/data_modeling_reservation_logical.png create mode 100755 doc/modules/cassandra/pages/data_modeling/images/data_modeling_reservation_physical.png create mode 100644 doc/modules/cassandra/pages/data_modeling/index.adoc create mode 100644 doc/modules/cassandra/pages/data_modeling/intro.adoc create mode 100644 doc/modules/cassandra/pages/faq/index.adoc create mode 100644 doc/modules/cassandra/pages/getting_started/configuring.adoc create mode 100644 doc/modules/cassandra/pages/getting_started/drivers.adoc create mode 100644 doc/modules/cassandra/pages/getting_started/index.adoc create mode 100644 doc/modules/cassandra/pages/getting_started/installing.adoc create mode 100644 doc/modules/cassandra/pages/getting_started/production.adoc create mode 100644 doc/modules/cassandra/pages/getting_started/querying.adoc create mode 100644 doc/modules/cassandra/pages/getting_started/quickstart.adoc create mode 100644 doc/modules/cassandra/pages/operating/audit_logging.adoc create mode 100644 doc/modules/cassandra/pages/operating/backups.adoc create mode 100644 doc/modules/cassandra/pages/operating/bloom_filters.adoc create mode 100644 doc/modules/cassandra/pages/operating/bulk_loading.adoc create mode 100644 doc/modules/cassandra/pages/operating/cdc.adoc create mode 100644 doc/modules/cassandra/pages/operating/compaction/index.adoc create mode 100644 doc/modules/cassandra/pages/operating/compaction/lcs.adoc create mode 100644 doc/modules/cassandra/pages/operating/compaction/stcs.adoc create mode 100644 doc/modules/cassandra/pages/operating/compaction/twcs.adoc create mode 100644 doc/modules/cassandra/pages/operating/compression.adoc create mode 100644 doc/modules/cassandra/pages/operating/hardware.adoc create mode 100644 doc/modules/cassandra/pages/operating/hints.adoc create mode 100644 doc/modules/cassandra/pages/operating/index.adoc create mode 100644 doc/modules/cassandra/pages/operating/metrics.adoc create mode 100644 doc/modules/cassandra/pages/operating/read_repair.adoc create mode 100644 doc/modules/cassandra/pages/operating/repair.adoc create mode 100644 doc/modules/cassandra/pages/operating/security.adoc create mode 100644 doc/modules/cassandra/pages/operating/topo_changes.adoc create mode 100644 doc/modules/cassandra/pages/plugins/index.adoc create mode 100644 doc/modules/cassandra/pages/tools/cassandra_stress.adoc create mode 100644 doc/modules/cassandra/pages/tools/cqlsh.adoc create mode 100644 doc/modules/cassandra/pages/tools/index.adoc create mode 100644 doc/modules/cassandra/pages/tools/sstable/index.adoc create mode 100644 doc/modules/cassandra/pages/tools/sstable/sstabledump.adoc create mode 100644 doc/modules/cassandra/pages/tools/sstable/sstableexpiredblockers.adoc create mode 100644 doc/modules/cassandra/pages/tools/sstable/sstablelevelreset.adoc create mode 100644 doc/modules/cassandra/pages/tools/sstable/sstableloader.adoc create mode 100644 doc/modules/cassandra/pages/tools/sstable/sstablemetadata.adoc create mode 100644 doc/modules/cassandra/pages/tools/sstable/sstableofflinerelevel.adoc create mode 100644 doc/modules/cassandra/pages/tools/sstable/sstablerepairedset.adoc create mode 100644 doc/modules/cassandra/pages/tools/sstable/sstablescrub.adoc create mode 100644 doc/modules/cassandra/pages/tools/sstable/sstablesplit.adoc create mode 100644 doc/modules/cassandra/pages/tools/sstable/sstableupgrade.adoc create mode 100644 doc/modules/cassandra/pages/tools/sstable/sstableutil.adoc create mode 100644 doc/modules/cassandra/pages/tools/sstable/sstableverify.adoc create mode 100644 doc/modules/cassandra/pages/troubleshooting/finding_nodes.adoc create mode 100644 doc/modules/cassandra/pages/troubleshooting/index.adoc create mode 100644 doc/modules/cassandra/pages/troubleshooting/reading_logs.adoc create mode 100644 doc/modules/cassandra/pages/troubleshooting/use_nodetool.adoc create mode 100644 doc/modules/cassandra/pages/troubleshooting/use_tools.adoc create mode 100644 doc/modules/cassandra/partials/java_version.adoc create mode 100644 doc/modules/cassandra/partials/nodetool_and_cqlsh.adoc create mode 100644 doc/modules/cassandra/partials/nodetool_and_cqlsh_nobin.adoc create mode 100644 doc/modules/cassandra/partials/package_versions.adoc create mode 100644 doc/modules/cassandra/partials/tail_syslog.adoc rename doc/{convert_yaml_to_rst.py => scripts/convert_yaml_to_adoc.py} (86%) create mode 100644 doc/scripts/gen-nodetool-docs.py delete mode 100644 doc/source/_static/extra.css delete mode 100644 doc/source/_templates/indexcontent.html delete mode 100644 doc/source/_theme/cassandra_theme/defindex.html delete mode 100644 doc/source/_theme/cassandra_theme/layout.html delete mode 100644 doc/source/_theme/cassandra_theme/search.html delete mode 100644 doc/source/_theme/cassandra_theme/theme.conf delete mode 100644 doc/source/_util/cql.py delete mode 100644 doc/source/architecture/dynamo.rst delete mode 100644 doc/source/architecture/guarantees.rst delete mode 100644 doc/source/architecture/index.rst delete mode 100644 doc/source/architecture/overview.rst delete mode 100644 doc/source/architecture/storage_engine.rst delete mode 100644 doc/source/bugs.rst delete mode 100644 doc/source/conf.py delete mode 100644 doc/source/configuration/index.rst delete mode 100644 doc/source/contactus.rst delete mode 100644 doc/source/cql/appendices.rst delete mode 100644 doc/source/cql/changes.rst delete mode 100644 doc/source/cql/ddl.rst delete mode 100644 doc/source/cql/definitions.rst delete mode 100644 doc/source/cql/dml.rst delete mode 100644 doc/source/cql/functions.rst delete mode 100644 doc/source/cql/index.rst delete mode 100644 doc/source/cql/indexes.rst delete mode 100644 doc/source/cql/json.rst delete mode 100644 doc/source/cql/mvs.rst delete mode 100644 doc/source/cql/security.rst delete mode 100644 doc/source/cql/triggers.rst delete mode 100644 doc/source/cql/types.rst delete mode 100644 doc/source/data_modeling/index.rst delete mode 100644 doc/source/development/code_style.rst delete mode 100644 doc/source/development/how_to_commit.rst delete mode 100644 doc/source/development/how_to_review.rst delete mode 100644 doc/source/development/ide.rst delete mode 100644 doc/source/development/index.rst delete mode 100644 doc/source/development/license_compliance.rst delete mode 100644 doc/source/development/patches.rst delete mode 100644 doc/source/development/testing.rst delete mode 100644 doc/source/faq/index.rst delete mode 100644 doc/source/getting_started/configuring.rst delete mode 100644 doc/source/getting_started/drivers.rst delete mode 100644 doc/source/getting_started/index.rst delete mode 100644 doc/source/getting_started/installing.rst delete mode 100644 doc/source/getting_started/querying.rst delete mode 100644 doc/source/index.rst delete mode 100644 doc/source/operating/backups.rst delete mode 100644 doc/source/operating/bloom_filters.rst delete mode 100644 doc/source/operating/bulk_loading.rst delete mode 100644 doc/source/operating/cdc.rst delete mode 100644 doc/source/operating/compaction.rst delete mode 100644 doc/source/operating/compression.rst delete mode 100644 doc/source/operating/error_codes.txt delete mode 100644 doc/source/operating/hardware.rst delete mode 100644 doc/source/operating/hints.rst delete mode 100644 doc/source/operating/index.rst delete mode 100644 doc/source/operating/metrics.rst delete mode 100644 doc/source/operating/read_repair.rst delete mode 100644 doc/source/operating/repair.rst delete mode 100644 doc/source/operating/security.rst delete mode 100644 doc/source/operating/snitch.rst delete mode 100644 doc/source/operating/topo_changes.rst delete mode 100644 doc/source/tools/cqlsh.rst delete mode 100644 doc/source/tools/index.rst delete mode 100644 doc/source/tools/nodetool.rst delete mode 100644 doc/source/troubleshooting/index.rst diff --git a/.build/build-rat.xml b/.build/build-rat.xml index d8268e4b89..da9c13d9ab 100644 --- a/.build/build-rat.xml +++ b/.build/build-rat.xml @@ -53,6 +53,7 @@ + @@ -67,6 +68,8 @@ + + diff --git a/.gitignore b/.gitignore index 584ace1a0a..9d9d4dc50d 100644 --- a/.gitignore +++ b/.gitignore @@ -68,7 +68,9 @@ Thumbs.db .ant_targets # Generated files from the documentation -doc/source/configuration/cassandra_config_file.rst +doc/modules/cassandra/pages/configuration/cass_yaml_file.adoc +doc/modules/cassandra/pages/tools/nodetool/ +doc/modules/cassandra/examples/TEXT/NODETOOL/ # Python virtual environment venv/ diff --git a/build.xml b/build.xml index 23fe5b0943..9b4b0868a2 100644 --- a/build.xml +++ b/build.xml @@ -254,13 +254,14 @@ - + - + - - - + + + + diff --git a/doc/Makefile b/doc/Makefile index c6632a573c..43acc1ee7c 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,268 +1,26 @@ -# Makefile for Sphinx documentation -# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -PAPER = -BUILDDIR = build - -# Internal variables. -PAPEROPT_a4 = -D latex_paper_size=a4 -PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source -# the i18n builder cannot share the environment and doctrees with the others -I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source - -YAML_DOC_INPUT=../conf/cassandra.yaml -YAML_DOC_OUTPUT=source/configuration/cassandra_config_file.rst - -MAKE_CASSANDRA_YAML = python convert_yaml_to_rst.py $(YAML_DOC_INPUT) $(YAML_DOC_OUTPUT) - -WEB_SITE_PRESENCE_FILE='source/.build_for_website' - -.PHONY: help -help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " website to make HTML files for the Cassandra website" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " singlehtml to make a single large HTML file" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " applehelp to make an Apple Help Book" - @echo " devhelp to make HTML files and a Devhelp project" - @echo " epub to make an epub" - @echo " epub3 to make an epub3" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " latexpdf to make LaTeX files and run them through pdflatex" - @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" - @echo " text to make text files" - @echo " man to make manual pages" - @echo " texinfo to make Texinfo files" - @echo " info to make Texinfo files and run them through makeinfo" - @echo " gettext to make PO message catalogs" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " xml to make Docutils-native XML files" - @echo " pseudoxml to make pseudoxml-XML files for display purposes" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" - @echo " coverage to run coverage check of the documentation (if enabled)" - @echo " dummy to check syntax errors of document sources" - -.PHONY: clean -clean: - rm -rf $(BUILDDIR)/* - rm -f $(YAML_DOC_OUTPUT) +GENERATE_NODETOOL_DOCS = ./scripts/gen-nodetool-docs.py +MAKE_CASSANDRA_YAML = ./scripts/convert_yaml_to_adoc.py ../conf/cassandra.yaml ./modules/cassandra/pages/configuration/cass_yaml_file.adoc .PHONY: html html: - $(MAKE_CASSANDRA_YAML) - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + @# hack until a local basic antora build is put in -.PHONY: website -website: clean - @touch $(WEB_SITE_PRESENCE_FILE) - $(MAKE_CASSANDRA_YAML) - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - @rm $(WEB_SITE_PRESENCE_FILE) - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." - -.PHONY: dirhtml -dirhtml: - $(MAKE_CASSANDRA_YAML) - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." - -.PHONY: singlehtml -singlehtml: - $(MAKE_CASSANDRA_YAML) - $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml - @echo - @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." - -.PHONY: pickle -pickle: - $(MAKE_CASSANDRA_YAML) - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -.PHONY: json -json: - $(MAKE_CASSANDRA_YAML) - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." - -.PHONY: htmlhelp -htmlhelp: - $(MAKE_CASSANDRA_YAML) - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." - -.PHONY: qthelp -qthelp: - $(MAKE_CASSANDRA_YAML) - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/ApacheCassandraDocumentation.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/ApacheCassandraDocumentation.qhc" - -.PHONY: applehelp -applehelp: - $(MAKE_CASSANDRA_YAML) - $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp - @echo - @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." - @echo "N.B. You won't be able to view it unless you put it in" \ - "~/Library/Documentation/Help or install it in your application" \ - "bundle." - -.PHONY: devhelp -devhelp: - $(MAKE_CASSANDRA_YAML) - $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp - @echo - @echo "Build finished." - @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/ApacheCassandraDocumentation" - @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/ApacheCassandraDocumentation" - @echo "# devhelp" - -.PHONY: epub -epub: - $(MAKE_CASSANDRA_YAML) - $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub - @echo - @echo "Build finished. The epub file is in $(BUILDDIR)/epub." - -.PHONY: epub3 -epub3: - $(MAKE_CASSANDRA_YAML) - $(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3 - @echo - @echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3." - -.PHONY: latex -latex: - $(MAKE_CASSANDRA_YAML) - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make' in that directory to run these through (pdf)latex" \ - "(use \`make latexpdf' here to do that automatically)." - -.PHONY: latexpdf -latexpdf: - $(MAKE_CASSANDRA_YAML) - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through pdflatex..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -.PHONY: latexpdfja -latexpdfja: - $(MAKE_CASSANDRA_YAML) - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through platex and dvipdfmx..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -.PHONY: text -text: - $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text - @echo - @echo "Build finished. The text files are in $(BUILDDIR)/text." - -.PHONY: man -man: - $(MAKE_CASSANDRA_YAML) - $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man - @echo - @echo "Build finished. The manual pages are in $(BUILDDIR)/man." - -.PHONY: texinfo -texinfo: - $(MAKE_CASSANDRA_YAML) - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo - @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." - @echo "Run \`make' in that directory to run these through makeinfo" \ - "(use \`make info' here to do that automatically)." - -.PHONY: info -info: - $(MAKE_CASSANDRA_YAML) - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo "Running Texinfo files through makeinfo..." - make -C $(BUILDDIR)/texinfo info - @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." - -.PHONY: gettext -gettext: - $(MAKE_CASSANDRA_YAML) - $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale - @echo - @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." - -.PHONY: changes -changes: - $(MAKE_CASSANDRA_YAML) - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." - -.PHONY: linkcheck -linkcheck: - $(MAKE_CASSANDRA_YAML) - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." - -.PHONY: doctest -doctest: - $(MAKE_CASSANDRA_YAML) - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." - -.PHONY: coverage -coverage: - $(MAKE_CASSANDRA_YAML) - $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage - @echo "Testing of coverage in the sources finished, look at the " \ - "results in $(BUILDDIR)/coverage/python.txt." - -.PHONY: xml -xml: - $(MAKE_CASSANDRA_YAML) - $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml - @echo - @echo "Build finished. The XML files are in $(BUILDDIR)/xml." - -.PHONY: pseudoxml -pseudoxml: - $(MAKE_CASSANDRA_YAML) - $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml - @echo - @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." - -.PHONY: dummy -dummy: - $(MAKE_CASSANDRA_YAML) - $(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy - @echo - @echo "Build finished. Dummy builder generates no files." +.PHONY: gen-asciidoc +gen-asciidoc: + @mkdir -p modules/cassandra/pages/tools/nodetool + @mkdir -p modules/cassandra/examples/TEXT/NODETOOL + python3 $(GENERATE_NODETOOL_DOCS) + python3 $(MAKE_CASSANDRA_YAML) diff --git a/doc/README.md b/doc/README.md index 931db7d8b6..608d236cb7 100644 --- a/doc/README.md +++ b/doc/README.md @@ -23,29 +23,39 @@ Apache Cassandra documentation directory This directory contains the documentation maintained in-tree for Apache Cassandra. This directory contains the following documents: -- The source of the official Cassandra documentation, in the `source/` +- The source of the official Cassandra documentation, in the `source/modules` subdirectory. See below for more details on how to edit/build that documentation. - The specification(s) for the supported versions of native transport protocol. -- Additional documentation on the SASI implementation (`SASI.md`). TODO: we - should probably move the first half of that documentation to the general - documentation, and the implementation explanation parts into the wiki. Official documentation ---------------------- The source for the official documentation for Apache Cassandra can be found in -the `source` subdirectory. The documentation uses [sphinx](http://www.sphinx-doc.org/) -and is thus written in [reStructuredText](http://docutils.sourceforge.net/rst.html). +the `modules/cassandra/pages` subdirectory. The documentation uses [antora](http://www.antora.org/) +and is thus written in [asciidoc](http://asciidoc.org). -To build the HTML documentation, you will need to first install sphinx and the -[sphinx ReadTheDocs theme](the https://pypi.python.org/pypi/sphinx_rtd_theme), which -on unix you can do with: +To generate the asciidoc files for cassandra.yaml and the nodetool commands, run (from project root): +```bash +ant gen-asciidoc ``` -pip install sphinx sphinx_rtd_theme +or (from this directory): + +```bash +make gen-asciidoc +``` + + +(The following has not yet been implemented, for now see the build instructions in the [cassandra-website](https://github.com/apache/cassandra-website) repo.) +To build the documentation, run (from project root): + +```bash +ant gen-doc +``` +or (from this directory): + +```bash +make html ``` -The documentation can then be built from this directory by calling `make html` -(or `make.bat html` on windows). Alternatively, the top-level `ant gen-doc` -target can be used. diff --git a/doc/SASI.md b/doc/SASI.md deleted file mode 100644 index a2fa717628..0000000000 --- a/doc/SASI.md +++ /dev/null @@ -1,798 +0,0 @@ - - -# SASIIndex - -[`SASIIndex`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/SASIIndex.java), -or "SASI" for short, is an implementation of Cassandra's -`Index` interface that can be used as an alternative to the -existing implementations. SASI's indexing and querying improves on -existing implementations by tailoring it specifically to Cassandra's -needs. SASI has superior performance in cases where queries would -previously require filtering. In achieving this performance, SASI aims -to be significantly less resource intensive than existing -implementations, in memory, disk, and CPU usage. In addition, SASI -supports prefix and contains queries on strings (similar to SQL's -`LIKE = "foo*"` or `LIKE = "*foo*"'`). - -The following goes on describe how to get up and running with SASI, -demonstrates usage with examples, and provides some details on its -implementation. - -## Using SASI - -The examples below walk through creating a table and indexes on its -columns, and performing queries on some inserted data. The patchset in -this repository includes support for the Thrift and CQL3 interfaces. - -The examples below assume the `demo` keyspace has been created and is -in use. - -``` -cqlsh> CREATE KEYSPACE demo WITH replication = { - ... 'class': 'SimpleStrategy', - ... 'replication_factor': '1' - ... }; -cqlsh> USE demo; -``` - -All examples are performed on the `sasi` table: - -``` -cqlsh:demo> CREATE TABLE sasi (id uuid, first_name text, last_name text, - ... age int, height int, created_at bigint, primary key (id)); -``` - -#### Creating Indexes - -To create SASI indexes use CQLs `CREATE CUSTOM INDEX` statement: - -``` -cqlsh:demo> CREATE CUSTOM INDEX ON sasi (first_name) USING 'org.apache.cassandra.index.sasi.SASIIndex' - ... WITH OPTIONS = { - ... 'analyzer_class': - ... 'org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer', - ... 'case_sensitive': 'false' - ... }; - -cqlsh:demo> CREATE CUSTOM INDEX ON sasi (last_name) USING 'org.apache.cassandra.index.sasi.SASIIndex' - ... WITH OPTIONS = {'mode': 'CONTAINS'}; - -cqlsh:demo> CREATE CUSTOM INDEX ON sasi (age) USING 'org.apache.cassandra.index.sasi.SASIIndex'; - -cqlsh:demo> CREATE CUSTOM INDEX ON sasi (created_at) USING 'org.apache.cassandra.index.sasi.SASIIndex' - ... WITH OPTIONS = {'mode': 'SPARSE'}; -``` - -The indexes created have some options specified that customize their -behaviour and potentially performance. The index on `first_name` is -case-insensitive. The analyzers are discussed more in a subsequent -example. The `NonTokenizingAnalyzer` performs no analysis on the -text. Each index has a mode: `PREFIX`, `CONTAINS`, or `SPARSE`, the -first being the default. The `last_name` index is created with the -mode `CONTAINS` which matches terms on suffixes instead of prefix -only. Examples of this are available below and more detail can be -found in the section on -[OnDiskIndex](#ondiskindexbuilder).The -`created_at` column is created with its mode set to `SPARSE`, which is -meant to improve performance of querying large, dense number ranges -like timestamps for data inserted every millisecond. Details of the -`SPARSE` implementation can also be found in the section on the -[OnDiskIndex](#ondiskindexbuilder). The `age` -index is created with the default `PREFIX` mode and no -case-sensitivity or text analysis options are specified since the -field is numeric. - -After inserting the following data and performing a `nodetool flush`, -SASI performing index flushes to disk can be seen in Cassandra's logs --- although the direct call to flush is not required (see -[IndexMemtable](#indexmemtable) for more details). - -``` -cqlsh:demo> INSERT INTO sasi (id, first_name, last_name, age, height, created_at) - ... VALUES (556ebd54-cbe5-4b75-9aae-bf2a31a24500, 'Pavel', 'Yaskevich', 27, 181, 1442959315018); - -cqlsh:demo> INSERT INTO sasi (id, first_name, last_name, age, height, created_at) - ... VALUES (5770382a-c56f-4f3f-b755-450e24d55217, 'Jordan', 'West', 26, 173, 1442959315019); - -cqlsh:demo> INSERT INTO sasi (id, first_name, last_name, age, height, created_at) - ... VALUES (96053844-45c3-4f15-b1b7-b02c441d3ee1, 'Mikhail', 'Stepura', 36, 173, 1442959315020); - -cqlsh:demo> INSERT INTO sasi (id, first_name, last_name, age, height, created_at) - ... VALUES (f5dfcabe-de96-4148-9b80-a1c41ed276b4, 'Michael', 'Kjellman', 26, 180, 1442959315021); - -cqlsh:demo> INSERT INTO sasi (id, first_name, last_name, age, height, created_at) - ... VALUES (2970da43-e070-41a8-8bcb-35df7a0e608a, 'Johnny', 'Zhang', 32, 175, 1442959315022); - -cqlsh:demo> INSERT INTO sasi (id, first_name, last_name, age, height, created_at) - ... VALUES (6b757016-631d-4fdb-ac62-40b127ccfbc7, 'Jason', 'Brown', 40, 182, 1442959315023); - -cqlsh:demo> INSERT INTO sasi (id, first_name, last_name, age, height, created_at) - ... VALUES (8f909e8a-008e-49dd-8d43-1b0df348ed44, 'Vijay', 'Parthasarathy', 34, 183, 1442959315024); - -cqlsh:demo> SELECT first_name, last_name, age, height, created_at FROM sasi; - - first_name | last_name | age | height | created_at -------------+---------------+-----+--------+--------------- - Michael | Kjellman | 26 | 180 | 1442959315021 - Mikhail | Stepura | 36 | 173 | 1442959315020 - Jason | Brown | 40 | 182 | 1442959315023 - Pavel | Yaskevich | 27 | 181 | 1442959315018 - Vijay | Parthasarathy | 34 | 183 | 1442959315024 - Jordan | West | 26 | 173 | 1442959315019 - Johnny | Zhang | 32 | 175 | 1442959315022 - -(7 rows) -``` - -#### Equality & Prefix Queries - -SASI supports all queries already supported by CQL, including LIKE statement -for PREFIX, CONTAINS and SUFFIX searches. - -``` -cqlsh:demo> SELECT first_name, last_name, age, height, created_at FROM sasi - ... WHERE first_name = 'Pavel'; - - first_name | last_name | age | height | created_at --------------+-----------+-----+--------+--------------- - Pavel | Yaskevich | 27 | 181 | 1442959315018 - -(1 rows) -``` - -``` -cqlsh:demo> SELECT first_name, last_name, age, height, created_at FROM sasi - ... WHERE first_name = 'pavel'; - - first_name | last_name | age | height | created_at --------------+-----------+-----+--------+--------------- - Pavel | Yaskevich | 27 | 181 | 1442959315018 - -(1 rows) -``` - -``` -cqlsh:demo> SELECT first_name, last_name, age, height, created_at FROM sasi - ... WHERE first_name LIKE 'M%'; - - first_name | last_name | age | height | created_at -------------+-----------+-----+--------+--------------- - Michael | Kjellman | 26 | 180 | 1442959315021 - Mikhail | Stepura | 36 | 173 | 1442959315020 - -(2 rows) -``` - -Of course, the case of the query does not matter for the `first_name` -column because of the options provided at index creation time. - -``` -cqlsh:demo> SELECT first_name, last_name, age, height, created_at FROM sasi - ... WHERE first_name LIKE 'm%'; - - first_name | last_name | age | height | created_at -------------+-----------+-----+--------+--------------- - Michael | Kjellman | 26 | 180 | 1442959315021 - Mikhail | Stepura | 36 | 173 | 1442959315020 - -(2 rows) -``` - -#### Compound Queries - -SASI supports queries with multiple predicates, however, due to the -nature of the default indexing implementation, CQL requires the user -to specify `ALLOW FILTERING` to opt-in to the potential performance -pitfalls of such a query. With SASI, while the requirement to include -`ALLOW FILTERING` remains, to reduce modifications to the grammar, the -performance pitfalls do not exist because filtering is not -performed. Details on how SASI joins data from multiple predicates is -available below in the -[Implementation Details](#implementation-details) -section. - -``` -cqlsh:demo> SELECT first_name, last_name, age, height, created_at FROM sasi - ... WHERE first_name LIKE 'M%' and age < 30 ALLOW FILTERING; - - first_name | last_name | age | height | created_at -------------+-----------+-----+--------+--------------- - Michael | Kjellman | 26 | 180 | 1442959315021 - -(1 rows) -``` - -#### Suffix Queries - -The next example demonstrates `CONTAINS` mode on the `last_name` -column. By using this mode predicates can search for any strings -containing the search string as a sub-string. In this case the strings -containing "a" or "an". - -``` -cqlsh:demo> SELECT * FROM sasi WHERE last_name LIKE '%a%'; - - id | age | created_at | first_name | height | last_name ---------------------------------------+-----+---------------+------------+--------+--------------- - f5dfcabe-de96-4148-9b80-a1c41ed276b4 | 26 | 1442959315021 | Michael | 180 | Kjellman - 96053844-45c3-4f15-b1b7-b02c441d3ee1 | 36 | 1442959315020 | Mikhail | 173 | Stepura - 556ebd54-cbe5-4b75-9aae-bf2a31a24500 | 27 | 1442959315018 | Pavel | 181 | Yaskevich - 8f909e8a-008e-49dd-8d43-1b0df348ed44 | 34 | 1442959315024 | Vijay | 183 | Parthasarathy - 2970da43-e070-41a8-8bcb-35df7a0e608a | 32 | 1442959315022 | Johnny | 175 | Zhang - -(5 rows) - -cqlsh:demo> SELECT * FROM sasi WHERE last_name LIKE '%an%'; - - id | age | created_at | first_name | height | last_name ---------------------------------------+-----+---------------+------------+--------+----------- - f5dfcabe-de96-4148-9b80-a1c41ed276b4 | 26 | 1442959315021 | Michael | 180 | Kjellman - 2970da43-e070-41a8-8bcb-35df7a0e608a | 32 | 1442959315022 | Johnny | 175 | Zhang - -(2 rows) -``` - -#### Expressions on Non-Indexed Columns - -SASI also supports filtering on non-indexed columns like `height`. The -expression can only narrow down an existing query using `AND`. - -``` -cqlsh:demo> SELECT * FROM sasi WHERE last_name LIKE '%a%' AND height >= 175 ALLOW FILTERING; - - id | age | created_at | first_name | height | last_name ---------------------------------------+-----+---------------+------------+--------+--------------- - f5dfcabe-de96-4148-9b80-a1c41ed276b4 | 26 | 1442959315021 | Michael | 180 | Kjellman - 556ebd54-cbe5-4b75-9aae-bf2a31a24500 | 27 | 1442959315018 | Pavel | 181 | Yaskevich - 8f909e8a-008e-49dd-8d43-1b0df348ed44 | 34 | 1442959315024 | Vijay | 183 | Parthasarathy - 2970da43-e070-41a8-8bcb-35df7a0e608a | 32 | 1442959315022 | Johnny | 175 | Zhang - -(4 rows) -``` - -#### Text Analysis (Tokenization and Stemming) - -Lastly, to demonstrate text analysis an additional column is needed on -the table. Its definition, index, and statements to update rows are shown below. - -``` -cqlsh:demo> ALTER TABLE sasi ADD bio text; -cqlsh:demo> CREATE CUSTOM INDEX ON sasi (bio) USING 'org.apache.cassandra.index.sasi.SASIIndex' - ... WITH OPTIONS = { - ... 'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.StandardAnalyzer', - ... 'tokenization_enable_stemming': 'true', - ... 'analyzed': 'true', - ... 'tokenization_normalize_lowercase': 'true', - ... 'tokenization_locale': 'en' - ... }; -cqlsh:demo> UPDATE sasi SET bio = 'Software Engineer, who likes distributed systems, doesnt like to argue.' WHERE id = 5770382a-c56f-4f3f-b755-450e24d55217; -cqlsh:demo> UPDATE sasi SET bio = 'Software Engineer, works on the freight distribution at nights and likes arguing' WHERE id = 556ebd54-cbe5-4b75-9aae-bf2a31a24500; -cqlsh:demo> SELECT * FROM sasi; - - id | age | bio | created_at | first_name | height | last_name ---------------------------------------+-----+----------------------------------------------------------------------------------+---------------+------------+--------+--------------- - f5dfcabe-de96-4148-9b80-a1c41ed276b4 | 26 | null | 1442959315021 | Michael | 180 | Kjellman - 96053844-45c3-4f15-b1b7-b02c441d3ee1 | 36 | null | 1442959315020 | Mikhail | 173 | Stepura - 6b757016-631d-4fdb-ac62-40b127ccfbc7 | 40 | null | 1442959315023 | Jason | 182 | Brown - 556ebd54-cbe5-4b75-9aae-bf2a31a24500 | 27 | Software Engineer, works on the freight distribution at nights and likes arguing | 1442959315018 | Pavel | 181 | Yaskevich - 8f909e8a-008e-49dd-8d43-1b0df348ed44 | 34 | null | 1442959315024 | Vijay | 183 | Parthasarathy - 5770382a-c56f-4f3f-b755-450e24d55217 | 26 | Software Engineer, who likes distributed systems, doesnt like to argue. | 1442959315019 | Jordan | 173 | West - 2970da43-e070-41a8-8bcb-35df7a0e608a | 32 | null | 1442959315022 | Johnny | 175 | Zhang - -(7 rows) -``` - -Index terms and query search strings are stemmed for the `bio` column -because it was configured to use the -[`StandardAnalyzer`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/analyzer/StandardAnalyzer.java) -and `analyzed` is set to `true`. The -`tokenization_normalize_lowercase` is similar to the `case_sensitive` -property but for the -[`StandardAnalyzer`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/analyzer/StandardAnalyzer.java). These -query demonstrates the stemming applied by [`StandardAnalyzer`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/analyzer/StandardAnalyzer.java). - -``` -cqlsh:demo> SELECT * FROM sasi WHERE bio LIKE 'distributing'; - - id | age | bio | created_at | first_name | height | last_name ---------------------------------------+-----+----------------------------------------------------------------------------------+---------------+------------+--------+----------- - 556ebd54-cbe5-4b75-9aae-bf2a31a24500 | 27 | Software Engineer, works on the freight distribution at nights and likes arguing | 1442959315018 | Pavel | 181 | Yaskevich - 5770382a-c56f-4f3f-b755-450e24d55217 | 26 | Software Engineer, who likes distributed systems, doesnt like to argue. | 1442959315019 | Jordan | 173 | West - -(2 rows) - -cqlsh:demo> SELECT * FROM sasi WHERE bio LIKE 'they argued'; - - id | age | bio | created_at | first_name | height | last_name ---------------------------------------+-----+----------------------------------------------------------------------------------+---------------+------------+--------+----------- - 556ebd54-cbe5-4b75-9aae-bf2a31a24500 | 27 | Software Engineer, works on the freight distribution at nights and likes arguing | 1442959315018 | Pavel | 181 | Yaskevich - 5770382a-c56f-4f3f-b755-450e24d55217 | 26 | Software Engineer, who likes distributed systems, doesnt like to argue. | 1442959315019 | Jordan | 173 | West - -(2 rows) - -cqlsh:demo> SELECT * FROM sasi WHERE bio LIKE 'working at the company'; - - id | age | bio | created_at | first_name | height | last_name ---------------------------------------+-----+----------------------------------------------------------------------------------+---------------+------------+--------+----------- - 556ebd54-cbe5-4b75-9aae-bf2a31a24500 | 27 | Software Engineer, works on the freight distribution at nights and likes arguing | 1442959315018 | Pavel | 181 | Yaskevich - -(1 rows) - -cqlsh:demo> SELECT * FROM sasi WHERE bio LIKE 'soft eng'; - - id | age | bio | created_at | first_name | height | last_name ---------------------------------------+-----+----------------------------------------------------------------------------------+---------------+------------+--------+----------- - 556ebd54-cbe5-4b75-9aae-bf2a31a24500 | 27 | Software Engineer, works on the freight distribution at nights and likes arguing | 1442959315018 | Pavel | 181 | Yaskevich - 5770382a-c56f-4f3f-b755-450e24d55217 | 26 | Software Engineer, who likes distributed systems, doesnt like to argue. | 1442959315019 | Jordan | 173 | West - -(2 rows) -``` - -## Implementation Details - -While SASI, at the surface, is simply an implementation of the -`Index` interface, at its core there are several data -structures and algorithms used to satisfy it. These are described -here. Additionally, the changes internal to Cassandra to support SASIs -integration are described. - -The `Index` interface divides responsibility of the -implementer into two parts: Indexing and Querying. Further, Cassandra -makes it possible to divide those responsibilities into the memory and -disk components. SASI takes advantage of Cassandra's write-once, -immutable, ordered data model to build indexes along with the flushing -of the memtable to disk -- this is the origin of the name "SSTable -Attached Secondary Index". - -The SASI index data structures are built in memory as the SSTable is -being written and they are flushed to disk before the writing of the -SSTable completes. The writing of each index file only requires -sequential writes to disk. In some cases, partial flushes are -performed, and later stitched back together, to reduce memory -usage. These data structures are optimized for this use case. - -Taking advantage of Cassandra's ordered data model, at query time, -candidate indexes are narrowed down for searching minimize the amount -of work done. Searching is then performed using an efficient method -that streams data off disk as needed. - -### Indexing - -Per SSTable, SASI writes an index file for each indexed column. The -data for these files is built in memory using the -[`OnDiskIndexBuilder`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/disk/OnDiskIndexBuilder.java). Once -flushed to disk, the data is read using the -[`OnDiskIndex`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/disk/OnDiskIndex.java) -class. These are composed of bytes representing indexed terms, -organized for efficient writing or searching respectively. The keys -and values they hold represent tokens and positions in an SSTable and -these are stored per-indexed term in -[`TokenTreeBuilder`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/disk/TokenTreeBuilder.java)s -for writing, and -[`TokenTree`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/disk/TokenTree.java)s -for querying. These index files are memory mapped after being written -to disk, for quicker access. For indexing data in the memtable SASI -uses its -[`IndexMemtable`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/memory/IndexMemtable.java) -class. - -#### OnDiskIndex(Builder) - -Each -[`OnDiskIndex`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/disk/OnDiskIndex.java) -is an instance of a modified -[Suffix Array](https://en.wikipedia.org/wiki/Suffix_array) data -structure. The -[`OnDiskIndex`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/disk/OnDiskIndex.java) -is comprised of page-size blocks of sorted terms and pointers to the -terms' associated data, as well as the data itself, stored also in one -or more page-sized blocks. The -[`OnDiskIndex`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/disk/OnDiskIndex.java) -is structured as a tree of arrays, where each level describes the -terms in the level below, the final level being the terms -themselves. The `PointerLevel`s and their `PointerBlock`s contain -terms and pointers to other blocks that *end* with those terms. The -`DataLevel`, the final level, and its `DataBlock`s contain terms and -point to the data itself, contained in [`TokenTree`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/disk/TokenTree.java)s. - -The terms written to the -[`OnDiskIndex`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/disk/OnDiskIndex.java) -vary depending on its "mode": either `PREFIX`, `CONTAINS`, or -`SPARSE`. In the `PREFIX` and `SPARSE` cases terms exact values are -written exactly once per `OnDiskIndex`. For example, a `PREFIX` index -with terms `Jason`, `Jordan`, `Pavel`, all three will be included in -the index. A `CONTAINS` index writes additional terms for each suffix of -each term recursively. Continuing with the example, a `CONTAINS` index -storing the previous terms would also store `ason`, `ordan`, `avel`, -`son`, `rdan`, `vel`, etc. This allows for queries on the suffix of -strings. The `SPARSE` mode differs from `PREFIX` in that for every 64 -blocks of terms a -[`TokenTree`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/disk/TokenTree.java) -is built merging all the -[`TokenTree`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/disk/TokenTree.java)s -for each term into a single one. This copy of the data is used for -efficient iteration of large ranges of e.g. timestamps. The index -"mode" is configurable per column at index creation time. - -#### TokenTree(Builder) - -The -[`TokenTree`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/disk/TokenTree.java) -is an implementation of the well-known -[B+-tree](https://en.wikipedia.org/wiki/B%2B_tree) that has been -modified to optimize for its use-case. In particular, it has been -optimized to associate tokens, longs, with a set of positions in an -SSTable, also longs. Allowing the set of long values accommodates -the possibility of a hash collision in the token, but the data -structure is optimized for the unlikely possibility of such a -collision. - -To optimize for its write-once environment the -[`TokenTreeBuilder`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/disk/TokenTreeBuilder.java) -completely loads its interior nodes as the tree is built and it uses -the well-known algorithm optimized for bulk-loading the data -structure. - -[`TokenTree`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/disk/TokenTree.java)s provide the means to iterate a tokens, and file -positions, that match a given term, and to skip forward in that -iteration, an operation used heavily at query time. - -#### IndexMemtable - -The -[`IndexMemtable`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/memory/IndexMemtable.java) -handles indexing the in-memory data held in the memtable. The -[`IndexMemtable`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/memory/IndexMemtable.java) -in turn manages either a -[`TrieMemIndex`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/memory/TrieMemIndex.java) -or a -[`SkipListMemIndex`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/memory/SkipListMemIndex.java) -per-column. The choice of which index type is used is data -dependent. The -[`TrieMemIndex`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/memory/TrieMemIndex.java) -is used for literal types. `AsciiType` and `UTF8Type` are literal -types by defualt but any column can be configured as a literal type -using the `is_literal` option at index creation time. For non-literal -types the -[`SkipListMemIndex`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/memory/SkipListMemIndex.java) -is used. The -[`TrieMemIndex`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/memory/TrieMemIndex.java) -is an implementation that can efficiently support prefix queries on -character-like data. The -[`SkipListMemIndex`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/memory/SkipListMemIndex.java), -conversely, is better suited for Cassandra other data types like -numbers. - -The -[`TrieMemIndex`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/memory/TrieMemIndex.java) -is built using either the `ConcurrentRadixTree` or -`ConcurrentSuffixTree` from the `com.goooglecode.concurrenttrees` -package. The choice between the two is made based on the indexing -mode, `PREFIX` or other modes, and `CONTAINS` mode, respectively. - -The -[`SkipListMemIndex`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/memory/SkipListMemIndex.java) -is built on top of `java.util.concurrent.ConcurrentSkipListSet`. - -### Querying - -Responsible for converting the internal `IndexExpression` -representation into SASI's -[`Operation`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/Operation.java) -and -[`Expression`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/Expression.java) -tree, optimizing the tree to reduce the amount of work done, and -driving the query itself the -[`QueryPlan`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/QueryPlan.java) -is the work horse of SASI's querying implementation. To efficiently -perform union and intersection operations SASI provides several -iterators similar to Cassandra's `MergeIterator` but tailored -specifically for SASIs use, and with more features. The -[`RangeUnionIterator`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/utils/RangeUnionIterator.java), -like its name suggests, performs set union over sets of tokens/keys -matching the query, only reading as much data as it needs from each -set to satisfy the query. The -[`RangeIntersectionIterator`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/utils/RangeIntersectionIterator.java), -similar to its counterpart, performs set intersection over its data. - -#### QueryPlan - -The -[`QueryPlan`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/QueryPlan.java) -instantiated per search query is at the core of SASIs querying -implementation. Its work can be divided in two stages: analysis and -execution. - -During the analysis phase, -[`QueryPlan`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/QueryPlan.java) -converts from Cassandra's internal representation of -`IndexExpression`s, which has also been modified to support encoding -queries that contain ORs and groupings of expressions using -parentheses (see the -[Cassandra Internal Changes](#cassandra-internal-changes) -section below for more details). This process produces a tree of -[`Operation`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/Operation.java)s, which in turn may contain [`Expression`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/Expression.java)s, all of which -provide an alternative, more efficient, representation of the query. - -During execution the -[`QueryPlan`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/QueryPlan.java) -uses the `DecoratedKey`-generating iterator created from the -[`Operation`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/Operation.java) tree. These keys are read from disk and a final check to -ensure they satisfy the query is made, once again using the -[`Operation`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/Operation.java) tree. At the point the desired amount of matching data has -been found, or there is no more matching data, the result set is -returned to the coordinator through the existing internal components. - -The number of queries (total/failed/timed-out), and their latencies, -are maintined per-table/column family. - -SASI also supports concurrently iterating terms for the same index -accross SSTables. The concurrency factor is controlled by the -`cassandra.search_concurrency_factor` system property. The default is -`1`. - -##### QueryController - -Each -[`QueryPlan`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/QueryPlan.java) -references a -[`QueryController`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/QueryController.java) -used throughout the execution phase. The -[`QueryController`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/QueryController.java) -has two responsibilities: to manage and ensure the proper cleanup of -resources (indexes), and to strictly enforce the time bound for query, -specified by the user via the range slice timeout. All indexes are -accessed via the -[`QueryController`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/QueryController.java) -so that they can be safely released by it later. The -[`QueryController`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/QueryController.java)'s -`checkpoint` function is called in specific places in the execution -path to ensure the time-bound is enforced. - -##### QueryPlan Optimizations - -While in the analysis phase, the -[`QueryPlan`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/QueryPlan.java) -performs several potential optimizations to the query. The goal of -these optimizations is to reduce the amount of work performed during -the execution phase. - -The simplest optimization performed is compacting multiple expressions -joined by logical intersection (`AND`) into a single [`Operation`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/Operation.java) with -three or more [`Expression`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/Expression.java)s. For example, the query `WHERE age < 100 AND -fname = 'p*' AND first_name != 'pa*' AND age > 21` would, -without modification, have the following tree: - - ┌───────┐ - ┌────────│ AND │──────┐ - │ └───────┘ │ - ▼ ▼ - ┌───────┐ ┌──────────┐ - ┌─────│ AND │─────┐ │age < 100 │ - │ └───────┘ │ └──────────┘ - ▼ ▼ - ┌──────────┐ ┌───────┐ - │ fname=p* │ ┌─│ AND │───┐ - └──────────┘ │ └───────┘ │ - ▼ ▼ - ┌──────────┐ ┌──────────┐ - │fname!=pa*│ │ age > 21 │ - └──────────┘ └──────────┘ - -[`QueryPlan`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/QueryPlan.java) -will remove the redundant right branch whose root is the final `AND` -and has leaves `fname != pa*` and `age > 21`. These [`Expression`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/Expression.java)s will -be compacted into the parent `AND`, a safe operation due to `AND` -being associative and commutative. The resulting tree looks like the -following: - - ┌───────┐ - ┌────────│ AND │──────┐ - │ └───────┘ │ - ▼ ▼ - ┌───────┐ ┌──────────┐ - ┌───────────│ AND │────────┐ │age < 100 │ - │ └───────┘ │ └──────────┘ - ▼ │ ▼ - ┌──────────┐ │ ┌──────────┐ - │ fname=p* │ ▼ │ age > 21 │ - └──────────┘ ┌──────────┐ └──────────┘ - │fname!=pa*│ - └──────────┘ - -When excluding results from the result set, using `!=`, the -[`QueryPlan`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/QueryPlan.java) -determines the best method for handling it. For range queries, for -example, it may be optimal to divide the range into multiple parts -with a hole for the exclusion. For string queries, such as this one, -it is more optimal, however, to simply note which data to skip, or -exclude, while scanning the index. Following this optimization the -tree looks like this: - - ┌───────┐ - ┌────────│ AND │──────┐ - │ └───────┘ │ - ▼ ▼ - ┌───────┐ ┌──────────┐ - ┌───────│ AND │────────┐ │age < 100 │ - │ └───────┘ │ └──────────┘ - ▼ ▼ - ┌──────────────────┐ ┌──────────┐ - │ fname=p* │ │ age > 21 │ - │ exclusions=[pa*] │ └──────────┘ - └──────────────────┘ - -The last type of optimization applied, for this query, is to merge -range expressions across branches of the tree -- without modifying the -meaning of the query, of course. In this case, because the query -contains all `AND`s the `age` expressions can be collapsed. Along with -this optimization, the initial collapsing of unneeded `AND`s can also -be applied once more to result in this final tree using to execute the -query: - - ┌───────┐ - ┌──────│ AND │───────┐ - │ └───────┘ │ - ▼ ▼ - ┌──────────────────┐ ┌────────────────┐ - │ fname=p* │ │ 21 < age < 100 │ - │ exclusions=[pa*] │ └────────────────┘ - └──────────────────┘ - -#### Operations and Expressions - -As discussed, the -[`QueryPlan`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/QueryPlan.java) -optimizes a tree represented by -[`Operation`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/Operation.java)s -as interior nodes, and -[`Expression`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/Expression.java)s -as leaves. The -[`Operation`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/Operation.java) -class, more specifically, can have zero, one, or two -[`Operation`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/Operation.java)s -as children and an unlimited number of expressions. The iterators used -to perform the queries, discussed below in the -"Range(Union|Intersection)Iterator" section, implement the necessary -logic to merge results transparently regardless of the -[`Operation`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/Operation.java)s -children. - -Besides participating in the optimizations performed by the -[`QueryPlan`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/QueryPlan.java), -[`Operation`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/Operation.java) -is also responsible for taking a row that has been returned by the -query and making a final validation that it in fact does match. This -`satisfiesBy` operation is performed recursively from the root of the -[`Operation`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/Operation.java) -tree for a given query. These checks are performed directly on the -data in a given row. For more details on how `satisfiesBy` works see -the documentation -[in the code](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/Operation.java#L87-L123). - -#### Range(Union|Intersection)Iterator - -The abstract `RangeIterator` class provides a unified interface over -the two main operations performed by SASI at various layers in the -execution path: set intersection and union. These operations are -performed in a iterated, or "streaming", fashion to prevent unneeded -reads of elements from either set. In both the intersection and union -cases the algorithms take advantage of the data being pre-sorted using -the same sort order, e.g. term or token order. - -The -[`RangeUnionIterator`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/utils/RangeUnionIterator.java) -performs the "Merge-Join" portion of the -[Sort-Merge-Join](https://en.wikipedia.org/wiki/Sort-merge_join) -algorithm, with the properties of an outer-join, or union. It is -implemented with several optimizations to improve its performance over -a large number of iterators -- sets to union. Specifically, the -iterator exploits the likely case of the data having many sub-groups -of overlapping ranges and the unlikely case that all ranges will -overlap each other. For more details see the -[javadoc](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/utils/RangeUnionIterator.java#L9-L21). - -The -[`RangeIntersectionIterator`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/utils/RangeIntersectionIterator.java) -itself is not a subclass of `RangeIterator`. It is a container for -several classes, one of which, `AbstractIntersectionIterator`, -sub-classes `RangeIterator`. SASI supports two methods of performing -the intersection operation, and the ability to be adaptive in choosing -between them based on some properties of the data. - -`BounceIntersectionIterator`, and the `BOUNCE` strategy, works like -the -[`RangeUnionIterator`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/utils/RangeUnionIterator.java) -in that it performs a "Merge-Join", however, its nature is similar to -a inner-join, where like values are merged by a data-specific merge -function (e.g. merging two tokens in a list to lookup in a SSTable -later). See the -[javadoc](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/utils/RangeIntersectionIterator.java#L88-L101) -for more details on its implementation. - -`LookupIntersectionIterator`, and the `LOOKUP` strategy, performs a -different operation, more similar to a lookup in an associative data -structure, or "hash lookup" in database terminology. Once again, -details on the implementation can be found in the -[javadoc](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/utils/RangeIntersectionIterator.java#L199-L208). - -The choice between the two iterators, or the `ADAPTIVE` strategy, is -based upon the ratio of data set sizes of the minimum and maximum -range of the sets being intersected. If the number of the elements in -minimum range divided by the number of elements is the maximum range -is less than or equal to `0.01`, then the `ADAPTIVE` strategy chooses -the `LookupIntersectionIterator`, otherwise the -`BounceIntersectionIterator` is chosen. - -### The SASIIndex Class - -The above components are glued together by the -[`SASIIndex`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/SASIIndex.java) -class which implements `Index`, and is instantiated -per-table containing SASI indexes. It manages all indexes for a table -via the -[`sasi.conf.DataTracker`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/conf/DataTracker.java) -and -[`sasi.conf.view.View`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/conf/view/View.java) -components, controls writing of all indexes for an SSTable via its -[`PerSSTableIndexWriter`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/disk/PerSSTableIndexWriter.java), and initiates searches with -`Searcher`. These classes glue the previously -mentioned indexing components together with Cassandra's SSTable -life-cycle ensuring indexes are not only written when Memtable's flush -but also as SSTable's are compacted. For querying, the -`Searcher` does little but defer to -[`QueryPlan`](https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/index/sasi/plan/QueryPlan.java) -and update e.g. latency metrics exposed by SASI. - -### Cassandra Internal Changes - -To support the above changes and integrate them into Cassandra a few -minor internal changes were made to Cassandra itself. These are -described here. - -#### SSTable Write Life-cycle Notifications - -The `SSTableFlushObserver` is an observer pattern-like interface, -whose sub-classes can register to be notified about events in the -life-cycle of writing out a SSTable. Sub-classes can be notified when a -flush begins and ends, as well as when each next row is about to be -written, and each next column. SASI's `PerSSTableIndexWriter`, -discussed above, is the only current subclass. - -### Limitations and Caveats - -The following are items that can be addressed in future updates but are not -available in this repository or are not currently implemented. - -* The cluster must be configured to use a partitioner that produces - `LongToken`s, e.g. `Murmur3Partitioner`. Other existing partitioners which - don't produce LongToken e.g. `ByteOrderedPartitioner` and `RandomPartitioner` - will not work with SASI. -* Not Equals and OR support have been removed in this release while - changes are made to Cassandra itself to support them. - -### Contributors - -* [Pavel Yaskevich](https://github.com/xedin) -* [Jordan West](https://github.com/jrwest) -* [Michael Kjellman](https://github.com/mkjellman) -* [Jason Brown](https://github.com/jasobrown) -* [Mikhail Stepura](https://github.com/mishail) diff --git a/doc/antora.yml b/doc/antora.yml new file mode 100644 index 0000000000..4ce17d5f6f --- /dev/null +++ b/doc/antora.yml @@ -0,0 +1,18 @@ +name: Cassandra +title: Cassandra +version: '3.11' +display_version: '3.11' +asciidoc: + attributes: + sectanchors: '' + sectlinks: '' + cass_url: 'http://cassandra.apache.org/' + cass-docker-tag-3x: latest + cass-tag-3x: '3.11' + 311_version: '3.11.10' + 30_version: '3.0.24' + 22_version: '2.2.19' + 21_version: '2.1.22' +nav: +- modules/ROOT/nav.adoc +- modules/cassandra/nav.adoc diff --git a/doc/make.bat b/doc/make.bat deleted file mode 100644 index cbd1d1dbbc..0000000000 --- a/doc/make.bat +++ /dev/null @@ -1,299 +0,0 @@ -@ECHO OFF - -REM -REM Licensed to the Apache Software Foundation (ASF) under one -REM or more contributor license agreements. See the NOTICE file -REM distributed with this work for additional information -REM regarding copyright ownership. The ASF licenses this file -REM to you under the Apache License, Version 2.0 (the -REM "License"); you may not use this file except in compliance -REM with the License. You may obtain a copy of the License at -REM -REM http://www.apache.org/licenses/LICENSE-2.0 -REM -REM Unless required by applicable law or agreed to in writing, software -REM distributed under the License is distributed on an "AS IS" BASIS, -REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -REM See the License for the specific language governing permissions and -REM limitations under the License. -REM - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set BUILDDIR=build -set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . -set I18NSPHINXOPTS=%SPHINXOPTS% . -if NOT "%PAPER%" == "" ( - set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% - set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% -) - -if "%1" == "" goto help - -if "%1" == "help" ( - :help - echo.Please use `make ^` where ^ is one of - echo. html to make standalone HTML files - echo. dirhtml to make HTML files named index.html in directories - echo. singlehtml to make a single large HTML file - echo. pickle to make pickle files - echo. json to make JSON files - echo. htmlhelp to make HTML files and a HTML help project - echo. qthelp to make HTML files and a qthelp project - echo. devhelp to make HTML files and a Devhelp project - echo. epub to make an epub - echo. epub3 to make an epub3 - echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter - echo. text to make text files - echo. man to make manual pages - echo. texinfo to make Texinfo files - echo. gettext to make PO message catalogs - echo. changes to make an overview over all changed/added/deprecated items - echo. xml to make Docutils-native XML files - echo. pseudoxml to make pseudoxml-XML files for display purposes - echo. linkcheck to check all external links for integrity - echo. doctest to run all doctests embedded in the documentation if enabled - echo. coverage to run coverage check of the documentation if enabled - echo. dummy to check syntax errors of document sources - goto end -) - -if "%1" == "clean" ( - for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i - del /q /s %BUILDDIR%\* - goto end -) - - -REM Check if sphinx-build is available and fallback to Python version if any -%SPHINXBUILD% 1>NUL 2>NUL -if errorlevel 9009 goto sphinx_python -goto sphinx_ok - -:sphinx_python - -set SPHINXBUILD=python -m sphinx.__init__ -%SPHINXBUILD% 2> nul -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -:sphinx_ok - - -if "%1" == "html" ( - %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/html. - goto end -) - -if "%1" == "dirhtml" ( - %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. - goto end -) - -if "%1" == "singlehtml" ( - %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. - goto end -) - -if "%1" == "pickle" ( - %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the pickle files. - goto end -) - -if "%1" == "json" ( - %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the JSON files. - goto end -) - -if "%1" == "htmlhelp" ( - %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run HTML Help Workshop with the ^ -.hhp project file in %BUILDDIR%/htmlhelp. - goto end -) - -if "%1" == "qthelp" ( - %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run "qcollectiongenerator" with the ^ -.qhcp project file in %BUILDDIR%/qthelp, like this: - echo.^> qcollectiongenerator %BUILDDIR%\qthelp\Foo.qhcp - echo.To view the help file: - echo.^> assistant -collectionFile %BUILDDIR%\qthelp\Foo.ghc - goto end -) - -if "%1" == "devhelp" ( - %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. - goto end -) - -if "%1" == "epub" ( - %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The epub file is in %BUILDDIR%/epub. - goto end -) - -if "%1" == "epub3" ( - %SPHINXBUILD% -b epub3 %ALLSPHINXOPTS% %BUILDDIR%/epub3 - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The epub3 file is in %BUILDDIR%/epub3. - goto end -) - -if "%1" == "latex" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "latexpdf" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - cd %BUILDDIR%/latex - make all-pdf - cd %~dp0 - echo. - echo.Build finished; the PDF files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "latexpdfja" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - cd %BUILDDIR%/latex - make all-pdf-ja - cd %~dp0 - echo. - echo.Build finished; the PDF files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "text" ( - %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The text files are in %BUILDDIR%/text. - goto end -) - -if "%1" == "man" ( - %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The manual pages are in %BUILDDIR%/man. - goto end -) - -if "%1" == "texinfo" ( - %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. - goto end -) - -if "%1" == "gettext" ( - %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The message catalogs are in %BUILDDIR%/locale. - goto end -) - -if "%1" == "changes" ( - %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes - if errorlevel 1 exit /b 1 - echo. - echo.The overview file is in %BUILDDIR%/changes. - goto end -) - -if "%1" == "linkcheck" ( - %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck - if errorlevel 1 exit /b 1 - echo. - echo.Link check complete; look for any errors in the above output ^ -or in %BUILDDIR%/linkcheck/output.txt. - goto end -) - -if "%1" == "doctest" ( - %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest - if errorlevel 1 exit /b 1 - echo. - echo.Testing of doctests in the sources finished, look at the ^ -results in %BUILDDIR%/doctest/output.txt. - goto end -) - -if "%1" == "coverage" ( - %SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage - if errorlevel 1 exit /b 1 - echo. - echo.Testing of coverage in the sources finished, look at the ^ -results in %BUILDDIR%/coverage/python.txt. - goto end -) - -if "%1" == "xml" ( - %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The XML files are in %BUILDDIR%/xml. - goto end -) - -if "%1" == "pseudoxml" ( - %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. - goto end -) - -if "%1" == "dummy" ( - %SPHINXBUILD% -b dummy %ALLSPHINXOPTS% %BUILDDIR%/dummy - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. Dummy builder generates no files. - goto end -) - -:end diff --git a/doc/modules/ROOT/nav.adoc b/doc/modules/ROOT/nav.adoc new file mode 100644 index 0000000000..4c80ecafc8 --- /dev/null +++ b/doc/modules/ROOT/nav.adoc @@ -0,0 +1,4 @@ +* xref:index.adoc[Main] +** xref:master@_:ROOT:glossary.adoc[Glossary] +** xref:master@_:ROOT:bugs.adoc[How to report bugs] +** xref:master@_:ROOT:contactus.adoc[Contact us] \ No newline at end of file diff --git a/doc/modules/ROOT/pages/index.adoc b/doc/modules/ROOT/pages/index.adoc new file mode 100644 index 0000000000..183bf9e339 --- /dev/null +++ b/doc/modules/ROOT/pages/index.adoc @@ -0,0 +1,48 @@ += Welcome to Apache Cassandra's documentation! + +:description: Starting page for Apache Cassandra documentation. +:keywords: Apache, Cassandra, NoSQL, database +:cass-url: http://cassandra.apache.org +:cass-contrib-url: https://wiki.apache.org/cassandra/HowToContribute + +This is the official documentation for {cass-url}[Apache Cassandra]. +If you would like to contribute to this documentation, you are welcome +to do so by submitting your contribution like any other patch following +{cass-contrib-url}[these instructions]. + +== Main documentation + +[cols="a,a"] +|=== + +| xref:cassandra:getting_started/index.adoc[Getting started] | Newbie starting point + +| xref:cassandra:architecture/index.adoc[Architecture] | Cassandra's big picture + +| xref:cassandra:data_modeling/index.adoc[Data modeling] | Hint: it's not relational + +| xref:cassandra:cql/index.adoc[Cassandra Query Language (CQL)] | CQL reference documentation + +| xref:cassandra:configuration/index.adoc[Configuration] | Cassandra's handles and knobs + +| xref:cassandra:operating/index.adoc[Operation] | The operator's corner + +| xref:cassandra:tools/index.adoc[Tools] | cqlsh, nodetool, and others + +| xref:cassandra:troubleshooting/index.adoc[Troubleshooting] | What to look for when you have a problem + +| xref:cassandra:faq/index.adoc[FAQ] | Frequently asked questions + +| xref:cassandra:plugins/index.adoc[Plug-ins] | Third-party plug-ins + +| xref:master@_:ROOT:native_protocol.adoc[Native Protocols] | Native Cassandra protocol specifications + +|=== + +== Meta information +* xref:master@_:ROOT:bugs.adoc[Reporting bugs] +* xref:master@_:ROOT:contactus.adoc[Contact us] +* xref:master@_:ROOT:development/index.adoc[Contributing code] +* xref:master@_:ROOT:docdev/index.adoc[Contributing to the docs] +* xref:master@_:ROOT:community.adoc[Community] +* xref:master@_:ROOT:download.adoc[Download] diff --git a/doc/modules/cassandra/assets/images/Figure_1_backups.jpg b/doc/modules/cassandra/assets/images/Figure_1_backups.jpg new file mode 100644 index 0000000000000000000000000000000000000000..160013d76fe287ff97d965d8e2cdd8a5f683d63d GIT binary patch literal 38551 zcmeEu1zc5Km-o4Jilmf;G)Q+|5GfT2=@1c+?#@dnN{57kgaXo_bR&WwAe{ozT>{c@ z@BI$=gg!I#zBBX9yzk8SdHfw*cb|QBueI0uueA?y6gdrCydke74?rLg;2!u7K+fXn zD9Oqisj92UE8UU<9{>QJ;w?)%dz6a+U~A{%q^@v{PDfXd4zn9T0k8oKfENIaO`IK+ z@5pNa;H4xdOXmz`I-~!*_J;wmBmfxTR8*y-`!oIDMG=}fIJp1-L>0`d@>?>WAyozEGB z?9-oVf4=)?n*A#P5ZMFACi>5``_BQO@(}=#kNug(m<|904*{T}=ZF4~ovjxO7Z(RH zZfja6RxuX{p0$(8UD!mZxcV%$8}cUA7e*%-Ryy}tBniY*`S)(+t|B0(K$O9 zo0!pY{&f-mr(gV`SwFPns=C<&Gbb}UuqrKZm08-EgVSwiYUyHWZ%1co_ixScfAX~- z+HgjGU)LZ(oQVKPjJSY{JtP3?#wP%c7#Bb_NClrj{+PF0*jm6D=V{X}eP8z=4L(2r z`_mtkDDWqWv!yxRS+cCU2AzqkliL{$^2FI6bN~k+07w7|fCgXySOHFe4-f{#0ck)E zxB;jD8h|cv7cc=V09(Kba0h&V03a9$1EPU=APGnVGJ#y62q*z6fjXcGXazcfUSJ3q z2d04qU=7#;_JI>nkYPgbA;b_02rYyO!U5rfh(M$ua*$gPb%-wH9>g4C2XTe?K!PA) zkXT3(uA?5IVW1JC(V=moiK8i^X`-2+IimTYg`*{*<)BrdwV(~4 z&7f_eA<*&BsnI#m#n6?|b56VP9ym!p3`A3|S1-^akfAj4q65XMl%(8aLA z@Wu$oNWmz^c!$x4F^92-iHS*p$$=?}se);Y>4F)I`5dzVvk|i&a{==Z3m1zPiw{d4 zOApHqD-bIID-Wvys~>9#>je8EHWRiOwhFc>wkLKJb|!WWb`SOf_6ZIl4hxPXjs}hu zP5{m`oFbeLI1@PEaB*?3;ELj^;acMQ<37WEgZmM82KNY$2#+047S90B6)zGm8}A+7 zXS{Ft`1s8D()fD#F8Go7x%kcallX@hh%azmP`Y4x0d^tzLdAvt3!4Pk1WW`n1a}F% z2oeZN33>?DFJfP0z9@Uq_@dv%RaWN?uGpM1D*`MG3M+%ep3+z1{)9vhxa zo^f6x-W$AuyfwT#eC&KCe93%+{P_Ix{4oA1{%rvc0W*PAfl)zXL1n?mg6{?4Lc&5$ zLPbI=!i>WAgkK1ch>(b=iiC@N6h#-kCJGa+6Fm|W5_1tN5&J66DQ+#EC%!DfB4H+x zDKRH`MbcRErR1~}ozy+4bg5}5J=7Tb3OXyzAZ;rBT6#%_O~y*5KxXqA&o!rO<<|~m z#bkYD-(5$&u5dl{dbb>roTglo+@$;!d2{)E`7H%O1#g9Sis*_r6=M`flrAfoDCH_` z-4MRvd!ywh-pxBVlWxx5V!!2dt40|``G)dS<%!!&x9x6MssJiVDo<6usIsU!s@AGu zsHv(Yt1YVYs{5$7-66hXbSLl5zQ#3;D2;JVR!vvU_gVy623omV2in)QW3{JsxOIGW zI&~>^Ep@B(F!i+bUhD1Y%jw7KFBk|K1RD$+vKV?8w%?_^Yjd~Wh``9$sPrECJ?(pW z_fCyfj9(e=-B-H*;{KM2tVyEDnyIvDoau_0q*<)l(gVo{u@9EbCC#6juUJ4W5-ip& zWi68|x2+Vd(yR`wRjjkEkv7^k#kN?s_iU@}i0rKGTI^};J?#4&I2?i@4TJEJDgdTPtpFG(;Lp+zf)TNp>ezMM)Be4zli;WFF2SzyZlUgq9^syN{dz1UN`zHsXhZKi7MEYmw0-&V-SqtiK^jR%u7Y2a(TbUT( zuixv{!~e71`yl;ey%5mEID6R&Oh@^R#vwT?3pg{N&Y%7MzpAmNoy#2ydj~pICwn?x zVJ@CCGvQyme%V;ysQj|A{<1Xw(7}OUHrC%X&VCrTUpCe+8|#;i^~=WkWn=xav3}WD zzih1kpKL5eP!Bq@O@99$If@(yWC08`bPRMf3=DJ(OiTE+=|GrZoHV)Y( zatcZ&W)@a9b^$>lVG&U=+3Rxh3W`cM?r3OgX@jb@iK*EGa|=r=XBSsDcMngmpofow zA3q5RjeQyypOE@0(jbw6=Y0@8};G92y=O{X8}^ zJ2$_uxU{^oy1nylcW?jT@aXugUl7o+{Qdggv%mC<5bPHU8X77Z=2^cWDDL2mN{EI| z&x=7MqlRhhNPLAa0E^^W%*(e;*bMyYTcr1$`f$h?1!kDG&$@QrvwvU50{>Gz`=euj z_G=8lLxq5ohe`-Qf#W#g#OC?bGW@=sC59}3mRG##$ZIz6R+>XhWEnvAP2^V4aKtFp z1$UP&0Ca=V&9?)Jy6+BJ^u@mgSd^oMZZ4hPgo8O*z+qb_24Lb(l8-IY41FT??1!4yx68%elyW^bpSssc__xCgBE ziE!n}b^5&`{ja@1qww)mvxJ7WTtg2J)Y-&j=XE9V=xq6h)S7BZf;iQ| z+bZ4|l8&spYGDqJcs${I#a|?N7^wqgddCp=Q;-0iI?i0~940j2bS;n9O1bi7CyPgB z^l^D6y4b7DmH9@*!#IsYotbS0SEn{2mxI}$=ux9;gU71EorwJHHUVn%4)`%}36Gz} z$dA?FZA*&eVLD)1LA9y+`OcGLZ)a%?iK*mlEB?jPdhuRJN@MLQzrt~`PcI~jV{vUP z+z!4p7Yaa!PwqdLG7VIWGYgFtUHc$d^}H*`tvZ3=%Cv+6p57%Kzi@e~E#~JOw^Hxj z)DJfG=nW1}7a!%46+$%;6=ANa&$RV^F%er|V1duRuwiO)m8UC~c!7_LzX|HT1GgL# zig!l~v>yM+;_wLSYh@9t3s70mN+ z)*sKaQTX=Y`O|b%@ka1*_>mF!-CaOPXHhD3LUq*m$?=J!H1N(qcTgJZlgytBMh06* z!A}s4%B~~j;PmsWxl!42JG{((sx-lp_pF#)5one21YDDp3&)vPtExlvooz4=u zB#vyc3Ne9stQ3q-dm%|cw^-2;tqU!k$TeE@V6m7;(H@#-$2fYMZ{Bx6cXdsXfKny- z6EX&Vx^7^ZKh_&in%0_ZQ~u;zRC@^tl=~SrsB|I@kbqt?O;M*KC6&*$d9FRCQBgWb z*@e`jxkd^)7n@?oyh^vX`Tj3j-D$hSQNIyC-Yrm;{fYz%jvNQdDOeU5u-Bw9Za9)p zK*e~7pLNe2^+Nom?l~di?m_u3XYZt=N@;hF)RXTt*wyC%tzReoL^9y^6|6u{^3Lv8 zc{jw@tuBCewf>u$Vfx9{PoC&hQ8{NkvB1rZo=XupYZO<#lfn52UFOu!W@A-a1T9=c zi}Fbw*=Si^P)~*a3l(hT=WQP+Bl$Z<^yAAb_oj|dBd-_3VMZf4op4Q?%yNa&#`q!@ zMa&qxeyjt6hIxk^G2*d|Z4=V1ijocoxwsbELr7k1MPOv!lIIW0d`4XMteM?kzaS|7 z(ub+DKG4{A4U_}8kH|s37vR!Z1o^%faMI@h`9ArK?^yvGo)%xfxIiE5Av?bvtw^ZX_P1)vzp!6M^eVkE^8kEv<>^KE-SKrYn$KF^Z;^C z6ONH=0Z6q^^GG3pdooquD#_0Ant9T6ov=|x*^cFHcb{Q4xt2;;)mCbGYTErYBp_GL z@@9C+EBlj(U5ZC~O5s9e3dfUm4EV^GC8;vPa-Sx!BpivRgtdWClB37?1I3_gxVo-% zAPdi@^wG*l5?JYDj)80e-ftL}itkzgm{v#T#WyY;7bggoMwjYSK=JJF3Mx2U$8;~w}&}>a@L7DcF~VAtE()iim9*KV7Kyl zEJ@&e8s?Nxriu6H$zE={&K)brrgV~xNLho~&YP^)bsCv&OLa|s9^-q3auVE$`%YpQcA^BT1042Hmy(w?gRfk;x^g zI7oS2^FSehC(#_gGLS@m6oflcEC3K!`@9{=!tr?`UbLK?H6;OYfN)t()nI7>GfRDyEJ&mNRq9_i;Y8~84?WsT)c);78TOo&sX-=k){ z_K~SjfPcZK-n;L7J^SOG%k49fV$bEa)+u+cHBop<7bz&TXeSlug@Q&%Ir2zY2Ii4pXae;m!ZjPJJQu{!u`$nLb+` zibk{|U2gM*C(Ls%d+yBg)v;wB7ORXrc&a-zUE5D1D)dgLoxS}e`mx^!DrqGtRSaCy zM8-F}8@%y0858^?M@e-z)rW{5D_b0J-pl5@-25#A?eyJ@BuDfrK_jAgq3!OVDQz4c zv=I19hp>)9I=s{ZPg~uhI{eYUPur!djw~vEtbi!~qm#Jb_H00i(N^zvwPo^3P9 zXWI-b1!wR{9Hh%5168X8_rR~+840|UQ|r9)fw-OiJ>Au|UYwPztrtUn^h5PokA!%? zw)r@3S`=tE1G-%NSb6Oiw27GWm=e<(!)2Vz zmuZe#6YnVoY$GCrXxa9&-8im%?iFy#>W()K8r4rn#6RfovdxI3Qk)I#!x)Otrt*sQ z-BH}#bh4;5HVvVx)=zoT(R)kVGxU}nHQug>$OMEgCUsBfyuI{~K~1JFqOtDO@h@u5 z6sYFN`xGY@djV8eok2Ec{Y`WO=d$~|=rat{-)L?;3(leuR$am7Nj675~&s}f}?c#8U89Z1%*hr zm1Fd0dr-CcUf5Y##h~7DzLWg6kpLzOFSu{l^)`1>+^rW)2k<)=Y3i*R?le|$g+189 zub#NeH@(}+(>z&3xM+IYAg8OLeuOzvu%d3@rFfH@HH*`oDx=A8;g_N`t(k$})Png! z1Ye@PWtxeJVtm^E^tIBvWlU6*@_p8xu@Y;}8;3^va{Oa;&Z4p<%<4P^USFkB;~V6M zzG2=ikDKdQx5jqnc+nH4yqEzgeN(G1ago_K)=q@I*_!c*c9m2*!Y6(zSP-{U*S2Uc zICavLx1FTqZi!e-U?x?;MHvQ+@<)Q!rED7RB}_=*Axx_kTKS+2?pBWk=JVcd6R(Pi z#?o$Bw=?b-9w@lFB@@IrEWaynMv;~I$PrFymvrrp&HgZrPRHI#m$MXCb%S>@r_}oy zPQ67@7SGVqi&s1v)XL)`nm)1!KGggYk-1*v%maG7uV$2m?$Fy(-)D-tgnli+Uo`DC zTSY4EU^>5N&3dAgO~En~QPfr1X~UAJxO;o;Yq8dO!=gn@Ls?yKLQ+qZZhxI|A#0xY@I=d1GyZuNi`!iWtD~S|Jrd6#&XH`=ZoA+191>4+ z&Vg(afUvr*X`s-9CTr$U(AN+5kU8?3Uirx_$K1gLf#(D5Az=?I>7Qs~T+?_IovGk~ z!!R8GHG6Mut#W3tyC619rFbtp&8TI5H*5-LbzfCS=0c@?mc+HDJ7#rH`3>^)LLyNG zOdl`adgL2cR_#ex&vAFV<4|j@ePkWy1LI51`O?I0E{gpOMG8U_#y}M&1zO&&+hl67 zxgr~|Mme}2+AITW$3^e5#^SZXH3`97nLLG;R$8@)E)S_bvYFtqZE?KFHjG+2p~`1o zu6YH8LeDiCh{Lw=^a_%`Ow{;JU;`1F#<5bxJ7iZUQZ-1`c`nA@Xphd<`)F;V(Qsn< zM$Ca@UzWmNAkfdA=OWN16SP;TEqtZY^+5j=4!g|fw&=cbICYGu%$g;a(7ftSkbZYX zwV`F_e)Xe|T+E$h(X=&vK3UhyS?Gf~k`DtvB@R%0#yl3{6QSK+%kerH(pa%=oGCnh zDC((+;C{EiK%?8~vhu;fh|reP-bZ0(s!}&Bhx9?TiQnN1CHoRNEbNa?)r|h>r9>#- zx|GKhCt)o?M4%>F6rEEWG@Hl-$PY$>(T!pSQ6fbZN33RMh)l#t!#s zxsHveg)ik3L2t0v7T(CLNq9FlX}mHVOk>=!yV7;f4)DXL zD`oJ49OVcYiY78G4E;^Yh%gi>dL%_y(gm%ksH*SBhhL!}4b8hXZI7CPU;BojQEDhN zkM()$1^I;J`_V1Iivr)8zNEfX>UN98EaKOeziHgC;MD$QVkNZXZTH&sF@sKi8D~ay z5uAGgi%=I=ENt2c?GjJ!__49!^>tTyqIX-Viu0ZUPJpOLkIG$+SAthw8M7*ttgQ%_ z=vH)wd3)El0j&dEU)s>ZU$z@iyRkIz8D<|k4Rfkmxfd=?&gr$vr|U)h zJ(x7r-L9f#0ufS%%H`kp$Ci<@&gA?x>v3XYC40O#1?q3F+w*2HCIT^0+`UVZ`69LA ziA=7>k8d|%T;(i9QFtDrzi=4@c8)cl?FQAlRNfjloyes`@7QP^?p9i2VX!wIUDDNB zH={IskB_PnrFL_+lGZXJjLy6I1{+;2J+AGt;>u*X_WAzL!8|^cl$r33Papq))h4&a zSF$>jm*r$`<#yU80jRtqvbO}HVWa>ftq+{lesAhYI(pinr9NC`niUAzq%9O8Xz+^z z8h55nkJVKU+WP%3LnmnUE`iT2Aan?JIV50sm<0S;AU;?iiOd1Pus;;}`F|J=2$@2` zMulAYg#!ZR|NC)3=T6$GLV(f64fz(r2aZ(H{B#hfjR)I}tp&a*(0Xn-+z zY5taXqJIM7B3P$y;YYBqbFc`V6ET>V(aG`DoZ5L43(lMC&+tdG<{w!NCK@McQ?$pX zzChyvg@vfEonX~er&evB2TuBtz|=4jpo}_eqNd4tdtD&3KRhY^^M%E;@m_5>8~Yp- z=vA1X(aGV|oR(B~+9Wtbm4}1gXN@e<{?N2}s{DG)w`hk7_O^#j-#V9WqG=Y04aa_G zGBTW`?MCdTE%x9aHZ{|vmSrh_FmTLCemnNZ!vEJ-c&WgzC4R;e|Gp)j zPj$wV=~#&0SN;&}_a&))E>SekrHeG-k;%yp$YHG@hrQi*LF_gj>@~J#oO7biIadM- zeJ zWCmH@P|6R|5=Aqw@JGp}m#^i1CMAFC6Sh`f#ShZ=|F-U`LU)9Mq&TAKfcBV=a^rmT z3?9^AZKtM0E1cfkgzlOOx*!;@Bgk}Kg|==#cqz$pkwRMIgNlY%z6#tcr9lB09b9h)R(ew@5 zBf*7b;$3>2<|=iiW$aAWH*+$_bY|q;?-6f$Q*sqLyzTGPRX>cn9(+93VQ8*=volLO z5TizhF>lJ{)zVc08`na;`#7wx{Lk-fV-PFss)Pq+BZ0m*Lmj!$!1AcISQ@TC_V(p0&3y4cwU44Z znK#NcD}K_b{V$~MlQUQb8M*VO+}%>c@^3O0XGvWN;bZGX^)P=@qM ze-wki>OR+1aSgO;!KqIL9lQ5VqTm$xZs!VO5x*gtN6+n#3<#!kNm>IVx&p(!swPJ| z?DU94O&Xm>-BDKBkaWyGU8UK}LN;NdnGFmG zpO@Zga5BnF{gcn~wq=*K)HdIK09oL&^37Po8*271Gc?wr^PUyp0s@yIxPUBd9jld5 zs!9&r_)0OaqU<6|5?Ye7=NLw%Psqr|BLM z?ftb}&UO5MDw`BJe@HmUE!MFj8@_ZYVSB6#Emgk%qwd^2w^(diww0$FhRlC%{wvw$ zj)JZxJ@eZbX&{h)J60b>3|@g*iMs88Ig77XK3HJ)PAIWrAZSulvoWS<{JRno;hDbT zo|)Xm-Z7o}THh45$f2pbCx1J3^TB{wtVmp0QBFoJHO`Ae{^so0LD`VyiVolu$agrr z)9lc2xGTwIia-LNO}-q>3BW6(y=nQA?Jrv1wT~xV*Cuw^DJ&HS^)0ri$6A{6$0Qa)TxLB z-i1I9L&HwATa3P~WP*F(5%{xIPP^nueP-y?Si==0kfzK6Zk_E&phZh7x4?R-rG`Q9 zbsRPJet^U?C~LRhjmcu3?Wv$WW&PR8hl17|wadGs?!IsD#|LsJxED!F*t1w3tGmqB z;A=cx^)mW96+_Jky_HBC%YEdKfK-wS90@!{0#9;b6?JC`dI|_MC9okHacb+YX!>O@ z8EoT3>#OveUVc{_12wujxKG0nsWewHxba}1h>_le@8Y&%%QSklW2_g(n94mXF|!t4 zgC<5{!pt`xv+fG3cD&m|qj~i-vj$(&_jW>|Hp@(Y`>Xn7g&OzxjHsUS_;yZ4-6nPK zI3{@&Mm}>EFrM%X@E8%-a(l4y#qeh{CKvCQrSaX;_=j3|i>K<7=ApYDQ4^8Fi$1W* z8Yavwyt(b7#B-DJlSg>aoTM-s?P1~sZ26DAa!_M&`Wn&+=4CcBHan<%0) z?~&OM)TBrAd0p^IS`)40R5MsRtoh*5&P_&@?dZ*%Mw-X|yog1?ls(9efc>@-z{)s{ z8udrXC#MGhnqjjh=v^G$B7BWo!I0zp$Qj7sNjlp0o}ffz3M) zG_KR0V>m?v-;Iz~>+~p!mCtCfmWDYbATO(}GJ9QR#tcLl8TszQ9(>Mp5>TI%|0Wjn z5DcsHZePc}QhbV2VNq22Y$t+6Zb;x}?N<^;?GY#0+$j#rE)4zk*xO1Lmw>My2~ypo z64MedS{*-l=|0ENnM?m+aD=Bb+W-j|t4M6WCl$GwCP)N{VP2l#*7|5WDpfCc-MAxm z1MZg=#(u}i_5jgX9P@r`{PrYsT|eF(->BPst2|}qc&!fC&{@KRg(X~QnH<%0+D&F) z7xl(0`*H7>V|gatO1zn}K;%z)K+9#R$imMIF!UBlCUn1_?ACvNPx~8}(Wm%Hc_)?h ztG9vm48VQlgWwUfMq40WVefYST51^cz*l{J?yNT7J_*!Vf71lwqM#Yl>-Eo|x0m$|X6mnmG3-UOLhl5QoP+&$8%3uglH1C>DN`u zBHSp|$nUFc)u+s1kgy4&Tf7uwQK!LmqTpboB7w|r+TI3a>HLL<&a~eUu-#Ovuix?I zazBRGiSK{5KMK13sfPFeuUcS{c}v=k=t|>0K@|v`M~|qSyB-!Llq;}LINL`vSFiA=knL^^%;)57Cs_F!#_}hg#<#*k@%vtmM3ZN zJHhF8eeqI`L>2Ov8^bLFJl0cu0X8a)1Xd)5CP&b7@YejO+kW4V&%*#lzVF9jKj}01 z{4&3An14JD!|{BZ4^B>mP{ zWTUOS)H{9Uo>j~_!^ku6GC!fX#ijr7`p+WQ^?CX)f5dsP%g+L`_rKW>^U0&6L$|Q7 z*p`9MP^WY0s+DLA7W=B?eysFnNBO`HK{!cngUUv-&ni+m@;#O+U1KRo_)2!^2IDqv zN>}TLaP8`gC>>~ejC@o>Br zymBD=MJTLHlb~#MYWM1D+5ut!2}Jenrx+m~`RXGOV@P0o)n|K?OUaG9PeW=T9|`mp z=fkGPjS!LwW3KkcWUeaU0W3=-(6+o3M_06;r)#kg@ zf7;dlP|ij~lB)8=){yHwfbQ2keh-cNhuWn-vlj4=tQ!^gUE>b>D4Z4v$XX2+6r=JX zf%lwdAHnluDWDdWp>-bLlk>})|2;zMXEX7CWfVixHghg>lqFh>9@X>glzWkU2%UDc z`HBk|kPT_da;qv%g%4ikkKUx(Vh{x@&K}txb=IVVtHG~;Ll!}#Y>n_2LIQ_8NMOU& zAa-3v!aK#*{O%Y1(J^ILPXP!0Ymep=NrN`RwR0h|nPf$40_^82emR9#0a4$%QGFS0#4GdcM}*XfWZO3w&XGE$V%3@u8An@i8!t z1g4w86Uu$>Q!oNF9lsHQ2R$*Ag*Spt!vUKHf&(Xp)UoT-+ncU} zR@Jry1~m;sS#RnG5{5N{dbE^Idz;<*2|9SZwAIc-P!b9=DBVYYj)YUZ{|^n6`?Xu1 zg>wJB;6#I^mXK6jd}hUsg=*J9lNL2nyeW>|3F*@=m*g`Hpn!mehsR=+4)i^=LgA2= zHWxOVZjKLL^>ZsYRL#e)2+GG^l#b7ZJvp4c3+FI8d2oPu)TNI&0YhEp20a=P(qQbg zQ9|0W+GSg9^E+`L5TEP8QxT9TCaPN10h2thw!VhdgWisb41=^}fQ#26OC4Frj zpx8ahzfuE3nQnFW+j1G*IG(M&u~2pmGh&>P;4qOEPRWsXzK=N#9zGvX`3uZ3NcR7L z82c?A_8$sV{P%)GA3dhvcOyWwk{ne3F^g)ygVXIEGm2sIU?>+eFBpwSpn17BtCaWD z2>gYQY$FCd?V{aMY2Uj zY!l3E{|U=GwMDGDclmT<4qc5@QJ0;{mBxLcpe6Ig^%8=Z;=y3S>w&Tj71fg30rXkD zCKBr_KBuLZ%z%J^N;jqD3)s0C+b-9TfNHf8Q{6yBR$PT@6ZsU!r+(m)$ika64}adL z0Z-L*JjB)eZFlGU_NwT;ZxUuNT0^eXU`$Y1xHbp)LmwA+ct8>xFBF&$n3fPTysOxE zc$cV(9iulb_fG#9q!{VtbQMGz}1u{{0cI#9M-`tTkANGol` z>OPx)aqk}f@mo@X;-kww@SrF}1nKw)aTbb?odY%qXo3ERzE`z|=LQy&N=S+Tg79Z0 zQ0CW$^8GB$&-<+Oe{sb5e{3VwxhshT)G}bB^5Ax{=6&vr447-hz^4LzkP%$jRLAO0-uRCRuVRR08!>Td@skI>J- z_Pm7Q4^2Rnh^A)aJB!afy243C7xm*JY5VsslJ2dA`O0IatfAH^A&pL3a*FmsO4+mZ z6Pl!b8oBh_y4hF@=?{<+7C{5G8PI#O+-F#Hj-tnAw{+*huzp@C>2H6*-T!#F`|pf- zUMgcB5~wJc39-v8Pry#_n3uy3rl1ZQyq6>>DL-;6gl6A}+jE=}{pybJff{hNZ4||- z_<6q7l(U#*41#&=;I`yr4%)e@6SnjV)-7ICjJ#t;9Dbd!l)A<%Or3Ct;nx`=mk#!EK1~rnejA-RCB+IpDE8jM0m_hGFe& zd+wrF{a(L5S1Gk6YM-{#v~eN}Q9+QJ-C*CQp{dlN}dS{b5 zX5DinNJ2QLb0$J^;I51MW88fWk@?~5Q-+#sI3{R7}%nR1_xmWxJ|Nh!K8A<8hibP7$EjC^$*cbq(>#E3#7rT6Ml_xkpTgjW3nsi4dG zWi|MH157NAA(wnh)AnC|M4fnf%{!?OUh0^A+CW!gtwFnUgw3a)<|gumwqd3W=Fx9= z62W0(rXe=1nXMRebL}&mNlQc`#8w`Op03|Br>y|F(qs@6}@esdZ;nR|gJb zrY?HCe1x$StALXysU*pfis)|~L>OKe%)~?(74;=R3mmt4_QW;z@GMZ(5&PpR71m*& z=K={^kEl>t(rGe}-Sc2JL#}oLqZd*hz!p|Fp_6Zrz0;mvah6%~4`uTbDf&y_%OEnLY}+&;eT^=30X#$OyK^*?gP zrD+R#8d^cSS&4XPon2)9ZgpxaOlQjrYQH~LbFMl5J#P&8fQKJzmglbJ)U7I$>bht= zK3eT3r`eJpo4tp)H@xe`7e;J4TA&L%y%blDOW?bwp^+PgLT7#W{ai1V^%J|oesA53 zBy0?I#ZkUDduR?;aOV*znuimT!^wxOcf{}VJn%Yq_AA7x4oh6`{jt_oi(>W z9fi||Q4TTRyIh7){Au?q{=%z;VjcU#$Dg^bZW^azo|Igli9=j@dJazik2;6=AJYnd zitPI5I70G;U>6w&BpX5q_TxKJ3OY{co*;orZiZD7eu5jo*aHpq?rS*|j4uF==VB9; z^VyF#K8!BgGcs`|E`Kpa0{$rCWO^kvZ1u+6Pq-2egJP^Q%t~kv_}tUnSq9Myr5^$) z(U{WcfQi0^;Np-DRx-1IaHLoyI;BvD%!Y8U(=0|Es+$$aRBSnKoFm)7tM8|cDf7goH& ziR!nsJR+3?IRM;FItPk3Tv_odh%=Wj43Bx?nA@J%EhH4;Q>&hR1c;N!*h0adcTO!(Z{!WZHsDl< zz%dvCE&FhUuaVG)6FNq$GF13=lm2<(7_K>bSh#uYwMR=|V=q-$pcdu1*Q^s7)Te~2 zTU}afmaz|7KmsEQP@3-+)DEAtw4^%WR;z5P*#kfMjUp6Q4LMfwp8;6atOq za5y40!_2#J-92H1inq2S-pJ0&9COT{Q}f?LLmw?5~>dPiVLz^@Q?I0QAL_ttsd z2uLXV&K3hqa70oCRwdsDEF!XRB-9D>cs?HzqkmVqNI1owB!-#O1l2l@Gp$t+ZZ&h^K8uukcb3n{K-kln&J*t;a{YYo z9FsVLYqCDg@Pv>1dC?xpEeSx_6v2cQ*(x7%sE+zQ=$Q1V$!68Q9&F#O803}VGsS!v z(LDs3hGJ8P*q5!>W75jaQp8(JtawXxmn->fL|jg;-`Gx*SO0uxU0N^;JeZ<<0LLAH z9TE~C0aAlPBoJ)(HB0IB@MSv_a;4cyodvb!%MOmKVl>ku_=N_is(q(sl=@7q#WR_j z3Q4TC!wNs69h5g z=W9!pcp|P1vcVc`n$ZOwd#U_E_9X@-(vTX9pc-gv ztN&xo4AaFo82wW3Uk=-u)*X5}Itxt+*+M_rW}seuE^@l;@=8!GHR7jjX6?nq{{*zk zAhMj>4+v7VRj@O9 zpy|t);bDGS^&%XvcdWT7S)bZjjC;54wXQ+MxJgPs{{^3(Yiuqddz?2w1gv&oub$of z#fPgICtPN@&)yk;pPtjitha)vwHWOZ_rtafSj)R-_YEP)VJC*g7Vkc(>6NC|6 zadui1m>52h1YW&CP`yA&?VHta?JunE=Zmdd+REiAW;6_QIi@~e)0xEGN(h^tucCxL z+>0Hd@)@p5ptxxwBEmOKqatJY`17e8$O@8R295Y&R!tzH>=&5F&j9HEcyAsHSb>!T;pw+YnAs+hw3+q9Q9*mD890!NJf8y66nPS zedH*`KDY}vF&bb>QyAo0pRTBqC$=nVGE60^BVBvs2WzdNr3_@=+Lxi-2BQhaJ#+WU zMU3vS$5uS1FKvF#f*`cygRSDh4nu_w-4TyGpO9%K!As(3eDq z%W+*oC{MSJYZ?*@dwZ7W_OMGAg^M>Xod5RQC-n>AG0LPh8Mf9>YN%282-XbczMgva zAOVB%BW+&p(p6>gQ(LzT`F#?%LFL!|hrvc-ZXUC_7($P0T>7OwV8}KF;e! zeuKDt%JuHL9b)k()BEez;?mo9lk;y42d{SH-%@rYFA-)R;QPSQ)@Y9(^d|L%*9$dM zNn0n_p)`Zxp*5QaHQgj4- z4b8~%7-=4hOw61tDm1gJc@<<$`r(r$V?;C#q&5M~U%H!sghMh&z324G7z-RV9S&=a z`k@m2C{-eB=am&2pJzmtj6K)Zo3ufHopF?rie9~3bWyjxObA_H`I9SD#-WQd47cXl zj|uFos2Y!$p$E7|a5DDp7|?aM;f`q7WG|mOeM)=ss2CAOQbUltI`k8CQq}!W#b`MK z4x?O|UKhIUuahk*UzLGKN_=J>O*{O?>3(tsuN5h@Bwif%s4wDTie$YqfZNXSMpKT6 zNQuQC_^OF3T-4J3*}~JUaUY*WV`S#BMs4X3xHw0Y%7PbWi9fwHCN(j@Zl{;IMh+;T zy4||VHe%qB5>dGENqe~FQKqvT*PCq#$HXU6os8;H*xI78>KAmr`Ij#rtAy+psxK67 z%vXmxQp7QR$sEq=bv6B_=AQGh-5?+)_0{v&houUGMg5cg-hn$D5}Zt#eF_dhJFhsM zuDs|GuBnsAVvV}xB;5XRVyQm9z*&l{z9RKRUBB@DvC2h4_x*a&Me|5TU0w=a>L(4# zwTk0)yij4ao@KF!z2b+&C+dsVw%72bIu<|MZql}&;FRf4a8sBy+cOeD$m#V-r#>H! zDAo<4hZC;RS}{Qs`ihAk%w9|2yohswfH9zHDRg3x+jjTF#L=B45zFk_xYEKi_ASYe zBzk>Q$0J~rdVZKY+!L0#XY#2|X7;A_$@u4j^3Sai`<+;ms~t0SZ>g{)z7%Cc9C*63 z!-=D{pA>)f?_(Ak+oHttO4q-c+@(GXeq);_uzi1*X%PG7#(f=LaG%rn`<2cz7Vh^Mj4->US+3K- z4W8JLfbE@_BY`Yl)qV6TE9j2Ea^qgd(h-x@GIU4W05&QL+chpI{BdVf#tN9T4hJ1& zcN>p+hFzt|ELCO|%zh5+f42Oy%HE5~J=eIGN&|kaBoQ&*qeGU;(YLvWwLVjo{3$+E zmSe0V`cpIGlSMPa>US(SZFIz=!(XGw?Y0n7Ch&}28kJ*-z4;`$b+SrI$?V61LxZ*n z9&<2!D>eB8Ep}51Gj_C?X93VP;qVLf`1W$^b!TU%c6jnC&3&QZaYjMfx1EkWj;sN% zPp-cHV#)%cbZF4AiRRH4rE?X@;XXCX9JOL@os~4&(7l&W6Xj0lTh*?m^W+|%C|acT zlVNV#b+f^zG9xH=lXK@2-zOFD-rR3vjJcUEwsOI@DRSoSXdfC(3YV}cU%2FEAsM|w}Uak3g-2bP&^9*WgYxj6W z5RSqDkq#PZq99-cG}4hKLLidRMMMON7*TqQNJk(P0Tl#9ItfJxfdGc0ROv{BP@)i# zB2_|7xZC49bB<^3JMX7^&&-|sVSn0t)?Rz<*?T?fdH(<3idhs#b|P)sN?zJ<+!}HY zn~HEf^twyJ>4oL9J&uVNXkILkp2(pUJ6j)^kiv9D!kQy=b-$u$HTALa;+2Ye}BKzfqKdSIH zoje5dO(C4d_Nn))NOFdRv{Bbf9IcGHl&71Odx|Em38QFMPMMv0$w8eL*&IZ&<2l$D z)S}ZC9&9X5gwy*|V)z`xTXt&hP3{U(4Cb6T35Rb>*3HFLY*( z-+xh_@c=qh2lvZ3R@;9EfB5&N*@;d8x^-e%s@chx5l@&m!dPi%1g`KH9xj6NZWMiP zMN|$PAof?pzHLt2uu#rL5sv2~gxLlSllwFOluJSK^LHjK^!3moB zrH$>uTwFhf$I`_cB^aqdO+%>LdJB3%Y-e~+IMT2soR2i>pxu*;&L9z9>qgR?{i-9( z72+GjrP14%+Pw84qulLCCd!YJ(N!XITRyKm{p~?(Ltf~FRIq6<%{^J$#M@E3xj8j{ zcqV!%I!UM0&fdUVTu!uZ+y25Vd?2_-4Kfs#8FQzlrf`NBlVKijFOR*FvLe*rGU>!? zu;2v4H!N^IKxvbEvfL996xi$y@r2~4DIGnEG}K6M^kC>=bxZXvv%L)=l<+}8ha zZkZoSsnqsukZkx!p!2p_RVy;6%BvH_n%Jp)J?;ue@7c2f^Fd}!B~WeG_e_Ppmu2|c z)rDixbLf;5dXlkX+r8~qmlSHDT-99pAtCP&?Exf-3zl7yOs$bcM&Kyirf2gQJF^k^ zC1$@f&VurH$6|X>5}llcLqv#JIP46E`qKiG#?({rHX9K2@hfWT=Y9AEus8{M_fNVN zN|lyJy;fbH$5;#zRJ<^+AjWKE$EVr|e=Xa!@afpuE9#?>C+O>Yb5hRr(&i5T1woA*7eiB{V2vS`;+%iJF+Fp(z% z_W92p25HWb2dbkthhUsGVcWs+G3hr0nveASJ@k6jk(#>0J+pqIwrmhRb-NFs81<}N z?(Nr@^2}s50^ivyE+-_+7#!ts73Hi3EQrCip;>pMdb&F_tUoR>@?OeBE-02%QqqpA zx0RJFQzo%m;|hSO1nX`}#NJDEsM2=o<510a_RAs;VnTTJsNc ze&;U8?Mpt{7#uoXTn(`73ggXm`9S|V_Hg~VNLM_)w*hic2BiKBNE4JSkm|k2`?cLC3R&gg&JEFgy+32$Tv*zS3QG#BX%i88BIv4 zJSD?a`%dbpmR%vNKZ<=mIN_uehQA% z-U_A9?PFPp{S@WZA^haULKnfCL$leBi*LU4-kX&3X(Vps13OoGkw;(dtoMw^>N9Y6 z6u$(Uw%f?tr)}L-!K0su2)F6rHJ+hVQwY?ZlR(KbMto_!@?caLUiVRNKKP+|A-h_T zS*AgDsx0%(r$QU(+}7Zi5>>U+8~(moHkESjN-;wn@1}14KHDsvUXhS8YpBtI-3T$v zG+VM`ChUDnP!UkPgPjWHyy_wqobEhAkQFVi^*2}_8`WV!`&sPQIBV=eVUloKhQ&7d zJKQVhjZux>>lUdNWtTCEbj---VAOO4uXt6Q0M|(!zf;Ez8m{ZJmuTB=Ko}me>gVsw zI}@X=^6t#8ml+*0WOO#ZK}?3TX$Ji+C<;ZW8s=zhJ^r|Wo*TACF+d_o+qZc47|A;{ zeg*Q7lB+AT_KIsOfb+P-k-IU4tbC1+1lZP9yzjN2d|-Rzb+ze%pkq}Y_8dKhKKdr% zbJjHi1H+e&oTtVFYfE4m~>Fs=$F5{c6J!&_}-a0QVygn zF)%mzmLz`>5BSZ2I(^S}I}H;Z24h`uBe-nu2Hpm`U-e-i!G7?j+7MWlf9F&hX?eEm zL$o|Be&p@)Bg11cQF|pWldBx82FuvLoxZOrsqw-?r*Y);g=GA17{+fF zC!|T_s3}lt;4b@I1z+Fi1ACho<(TZ@E9gW-U1v?I+&t3Es<5y}oh=1Z zY7CEYC~VTR@@|?TT5@`1Kh3E z?E6H`Z;ygKH4S!a#1*eP1=1t448?q%E`C0GT2<2})6DqAS*56zcPG zaGVwrU#RyS@K;qsW($DLORU4W?r$^IJigAq+6840RyZdI^+J=rpUfjZ_P6|&ebA;M zK@TG3!pGeJ|ATTc2*J%;=cG)Z77UFUoh9Pey3w>JTy&S#0q360nqq-#Vtv@0Rr$(V z-L$&Aqy6CG^rX!p=AY7^Vr9x`W#UH{>UED|&tE{j;s4X#5sgZFbPt}uWK{t&^JaH} zigczwYMVK+qYJVshCd^2GXuYo7PryM{E8!rr0Ed~AOa8taAH{pJ|JFg>#px?+n}jB zz-fWG#m#lVt3&z*6bek)p5v|3N=eh>6eb{z0h)#}vVo>>q$P3EMl`72cA-2=t8lE< zlb%*mC364TN!yhLsFc4LwO`d>^c+$3 z8r4WZ3Xf7|GQospH96ug>h7%G!d_yIaxu$&(F1` zti7KC!#NG?H#qnQf`fzmD^&hn7o<~*aQgJei<@*{uo?hv%4b=5^2F+*8?ZA3Fu0L9 b|7qypuK&_lBB%clf^miYnX@ literal 0 HcmV?d00001 diff --git a/doc/modules/cassandra/assets/images/Figure_1_data_model.jpg b/doc/modules/cassandra/assets/images/Figure_1_data_model.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a3b330e7a391146bcc8ce6098fa44f566f8a80bd GIT binary patch literal 17469 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 RXQ$wwV|B{^FWBhu{{>4UePRFr literal 0 HcmV?d00001 diff --git a/doc/modules/cassandra/assets/images/Figure_1_guarantees.jpg b/doc/modules/cassandra/assets/images/Figure_1_guarantees.jpg new file mode 100644 index 0000000000000000000000000000000000000000..859342da5e6555ee08d15a14f439f29112fd4f55 GIT binary patch literal 17993 zcmeHu2UL_xwr+Kxo18(C(2{eKjATKAO3o@-XmUhC=oMC?Eg`AOe7u zjhFiceKiAsD;laQC@-AQG5%G)jsaXx01OML>!47->i;f8VdL)U4FE(3Cw#m( z4oCX>*x@kjJPt?rqV4=}cm#*poqb%;IQ$KVsa@=>ya0d`AJ==^**M^^Fb)%Y8tAFu z@EHK`iS7S@t^a_%?fh}`1VF{jJ-`!f@8FH%w&6jENJ~qh)b0G7?YzAObgXQgtUPT| zDsC?BR;~d6{M7mQSAg<(ZBe*ImJpGakPr|R#4Z2t5fbwA z^Akkd*$5sl=BA7^jW@uJ$eIlK9IqP*O#Z0t}1 zf4zzS;UE5CT7Q@azn>xMm}TkbzQ@mTj9g-S@;J05RU|p36Bp?22TUe1kWDN z4=(~Q5ibu9i}wm|6mJ3VD*}O_MQ|Y`5$Xt2gd^e_A{vo~C`B|O1`+d!Z6p#&kK{wj zA+?cKNN;2W@)7bWvJp9iTtI%qC&FjJ7sXe@H^XHuun)q$VDheXh7&l7)JPzu!Qgx;S}L#A|fJIB55LBA~aDb z(L)x4M7zY4#Jt2R#FvPDh+~NJiJOSu5Pv2iA>kxZBrzlLCW#>_AbCkLP4bPD zid2wPgVdHZgfxY;l5~jlBN+i12bmJt6|z9GM6%~({bXz81mv9LD&$t=!Q?6AHRR*u z+Z0q3A{5#bE)>xeg%q6>%alk;PD)iuTgsc1*_1CS=c!;+Y*Z>#HdHsLa;RQWEl?w< zxu`X$9jWh97gP69Z_rTEh|w6)_|v4&G|7D2w&{xsFWq>pAGUzh+F{CrRVpwCOW|U>L zVT@udXPjVyGVwC$F-N8>g5~sh{#W_4riZseM*1Rzucs)>78DY=mr5Y**Rh*;?2( z*jd;wuwQ2{VxQn3;E>{Q;7HlDJ0=@!80<(g& zg69Rp1*-%<3b6~B2|W;M7djLc7j_oT5uOyG6wwq37pWE566F=O5ls;tIZbj}?R3cL z>eHKId}4ND>0+X62hR+bKt zu9x1Gk&yA0DVO;qDTI7XrK+K7vg))NtD3!9 zk=n*N@pISCHL2sNYpFj_AJ;gkVWUx?v7src8Kl{&MXaT-m8>;)p7*@x`PvK63z`?= zE=*nIxafMZN*icvXvb;4)#1|d(5cf!=<4XE=q~Ds=v~)q*Qe6A&@a^gYM^WoYcOfZ zZRlgzVnk+i$*90+$M~!<#(2g=$Rx<5+myi+ZCY)HG&3^GGut*-HBT^KxFmil;?me< zuFL+HJFhTYalX=EL1tlP@!S&6(%7=l^1GF`RhHGZwT5-7^@fd#O_I&3t)gwb?TVe8 z9ma0ys@zq~)n$7*`#Ad*2L*>jhc&bcIvKs`sP35IxZ|Yll<#!pZ0ua>g70GKQsYYL z>g3w$#_Z)zYvEixZndb%Zy6jc$O^qW{JwDt%w|r)O<$Y6pzxf&Y zJ@=>ZclGZH;0?GFuoS2kn0pO=&E{Im^;6fwuFnQ31w9Ui1X~BUgs_F&3|R<07y2ZO zFw7~eH(WRz6aM9f@r~M>CvS${oWFJMR#60LglEL~ZQ0uyk?=@#WZ#|BcOKn2jIxdD zx+{D)@$UC%o9M24BKIENJBqm)(-$idn|>d0-}V031BC}qFcg?T%zWI1xXO4`d{q3G z1dD{uM6tw-B*G-0q?w23A67qNe{}!R_hg6U(G=yB(p09@JE=QqwrNA@is>a8Co}G5 z>}8@eUq3$gxH5|~D={09?VG)rW0cdLE0tT2$B=h7?;zhbf98qalhy*sf`US(!q_5c zkx$Xe(@ReWiq95Tmk5+RE~PEK`wTqudG?{qvTUqetGwm8)bo-Gj*3()6*j68QW;RW zQRPrIQ*By3Sfg3fQY%}FtrM)vuRm3v(m>M?`-1Sr%@;?FfsNZu?oDgW_RaGx7A=!6 zObCa1(t6d=rq=edU8%jXL$0H~Q>L?~ORB4?TcW$NN4y8yE8dIkljy7Lm+Y?| zkRGTVJTv%WNMWdX`0Q}oh{j0w=*7{&F~hOf9mZz}37 z`P;;4rs=GAJnu?pBxV|B&(8MD>Ca8h+sv=N_j><*;pQUAV&W3ZQo*w5a{Y?h%D@Nn z4-2dAtNUva>lEv$AGtqPd{X?>vthEau<5yZv=#lC{&W5pu`ey#I@{Af1nM|8PKoOWefwvh zuDJSW+ye#B%wMCxe#1?;mg9l|u;2Pb;J*E3Tr-ki<67hJAIF8@LX2bbY zj{5?~0o0GSzkKRgpR{o5!aI5lXjP+Mr<97}Y{*1By z!{F=>>-J}i^=FLrXN>h{jP+-X^=FLrXN>h{jP<`M#!|=epySx&FP}%Rk0yZ%K)~@3 zcyI&)4}nA?@CnHY2?+=YsY%I*$xl$z(Vd{CrDZtD!NS1E#zaet;zzM@a`Eu;(6a~# z3vdf_aPx26AAGNsR#+FxEW{}xc|S)Q4^rR2WXH9gPa0T3J8n>a?}b~a1+ME zC2eu#FB}d6h2iFl#3vvm!U0Tcp*LE$hwJUA|k3<<)u12_d9W*WW04ffO4p5X+9v?u8388|q(xOsTR#3dx9q-9jjs;Zq+*U;2AFf=m8 zQEMApyQ}sNXh$z^A74NJfWR9!Z$;dWyc30qi%&>QdiW?gD?2AQFaJqFVfph4Y-Lq- zO>N7|)>m!q9i3f6!y}_(d&hb~aDnAt%1_Py zN-qkWUQjq321g$21%dkE9vB52@019FQb`wS`&p|?3 zcClHG&12PmX!iFh7XA-u_Pb)g^qK&~FbK|gFbbdm_Tt;9ZSC2T9qyMkw~^rNlR)I6m#5xd39Jkxr6$-pgnIy{w)Skx=77l_rURM^1A63#soeH-YZ2n$~Q z_&LLjdiOTTa49tiS8hkro%!1y(Dw_P+K|*UVQurN8Ja*%-n8Y*YOhiHSL#RBNxh;c zt0|PXEKlEruOnex1?`YnRcpYfRqF6{^ATxLe&nH!X^B4U6yfLeIg`!RMWLMt-FlUr z6N%E|S|>LV_Nr-G_evKslB8$*`gf{VUy*6;lJFIku4)~c?Kx@(6rjflKly|>A)2%T zp7Vx+tJ0loPnMRWuQ5;=l_&aDnRn~+HYP4}T<&_u-Aq4oxG8l6T!K`k^2Pl>aOEw$ z`)w)JkpWsC(0R)FFghk3SU8d~#xsbAZr7e@xKs=XeG1;8`||j9qG&^)mm)H$YO&9w zU-L}wJ3*0jnE}ZABY@r0T?%==Hvn1qxcfZ%^U%FRi|*+820-^Y*fp)_wEmE4?|NEC zLqnDDGy9kc#k=khV#E;!YMso4%*J{}|@PEpmCR}klFnjm7 z=2+vwAIj^4&y8;m9JY3@ziA6tQA8X8p@lY&>F9t)$%`W(q;RK~{&Vn^v}MToun2^w ze_mu)YO1A|BI#%2f#K_U+tgqdrF$bah9{RO?IoRj1t`2;7O^@W#kkYx7acf&aK-uv z^c6-E^)E{+W=*Ydik!#e`>`C$0=f0S7fWr4-Z1t&woZ`%OiP0GAd0fV-=T6x7xl zup7N{bgZ{*!nq+OM5(20x#9~kL-bc`AF$q{uB&@SScuTzdPWWD73=r&;Fv04cM*iP zEoj_Bs?LAV*6*gkfV`dv^{(5tmMVNDqEAUxh{Hwkk@r=7)g4@MMCP zkS)#J_Sq+58><`P=boUVXJ&4MB|oDGgU2AnJ4P#H;$Gyuu-+SyHxJaKmwfmFOQFVo zU+T;NY%rYLNQyOirlxC4MhDuyU;k-dtVAVRh^rXz_@F`q&KOwHk*m*mDN^p9yqt(6d0O?RBmP8g?t?t~B>+vP8=6`ITL62vwfSQT6i{FdpgG$rr z7-KkH2km6|p1o(Wa~}(g_H?n2a8^apb6gBIS`9_0OTklbqzZVy`muVKu!cF_!+v*8 zBu*zBPxR4aG92Re0nh;4={u=aW=D@my@`719ykEi*za*(qK+hFs)FSLaf1l>jp&h{ zrUDQ>7mAvA_f{dnWU6tRB@HNcX;DJj98Eg#At;tWP*iZK9qqb9nejGrP0b`OG5a7$z&lvXH7wt8=<%a5C=v)>V1J80W8^xj|H z&Lk2y3gyqAvdC2u+Iy+U^fgzwzR>_;Mx^W;*JsBDk1l02Na#>#n+c1u^U*iD)2%zL zr0Srk&!FPuLG#{$ezvO;*)v!v8Fq{7nM-zoDm{&;u@SFe-;!EPIcvQ$J)NEDMJ48} z5@Y%?!y=xY6Dx}3T8Ga@?gzcx&V*-tL!)VC3 z4XdUmsK~iFzbz{c4M-$=TxcL~*%G*qP*W8vS>s$Qv7DHE<>bah&e@TzQ&`i79BDJa`sD!+!+agB&0|nLH@sxyMEvq3rWw5c$!=@eVzLp@YHtY^^A&#g#MHG|p89-FRKH5Kxgpu8`O*7+>DnqW*3t+llmcIH^qd=?->gf|7TR zN5DJSFm<8lBbsijh-OD}Cw57{Fg)}A=_pKO4!bnCFITWh(xv6;H62Q6k;Le~r+3y* zgruWA5IC0cL%8S*9x3W6(!T0sf*z;a!{A$oHx19DbHzWd;7zef<~5 zKC)slvtQ~=1uy&MF+IhoQ40&iCUf=$FnOegiCiBw6n|g(Vd&sOw&utFy?5X5t-7em z78O;WGBU!32wJ3(j;~hSvQ~PnyP>#it1=blE0iKzvo|bC5PZpHeno>~s#TKhR7}u^>kULwt{^&R|H#Fj#@HSqm8j!+$x;+@^%)JECRo3yfNoRZiwX zqHVG^)T?3ekovwu56u}=*G8ZYO!w|HBWXlYe=d5c?KeN!H`Q+UobCB({F5kD1t-+=uhQFYvbcfp3ozDGbV_=&1Wf31l<7N2) z3o$36OZdh;-1(jb&h}snd43?R*fk{}#28ul{3N@s79`xn+TWB|O+wM&F&$sbLpH2& z?8^z>mu?IzGJ);jVCb$lRN?Ke1$R43-LBLjvy6wvE7`YhjSq*>?6r^~vDe$uLU9+% z&BrZ2xudj29&+nw*|6V&c%`R$=f#pO4_oC9dGFZOnh#tk_i)c9lGNS~b!RM*9sR7i zQ^U*SEtYdIE#Z-TmZOjH!B~zZJHNZfjaO1X+5Hb9p0*%VkcoIim`ZHvaS@-%Rl4&_ zCfsHrRp?^ zV^KvS$(O5KltHR$ixA6f5O)G zC%uu=2b*6q@%{xe##~-GIBK>T{McsBobiGh(KQph=h%ijcG1vF8m!s2w0)xj(P3d3 zDe=v9Cu8Fd$5+&@mnM}4ezsVrXTP&9Mn-+<4O+%Ee&XhdICjsJ$BUZPz6k^lI%?UT z_j^k6Lr{qtPn~u!7m7$OnoGGXJyXhyWD|Mz$V!wi@$&b8+phHPf$u%E{SE?-zQ+T_<_5>>RK_*1~ro3V+oNwhB~ zZs2>q&k9z~WBan%q|Qj`d|AEIq?U#Y<eN(no{rhvho$Bcf-^pbp#QTLP`>H3uY zh=hgim2XGjC3F7IL_!AN!s>Lr_v$qJuuarE?Kp$F8|uRXTpZ>XV|c0xtX<8F?j;D< zDMboOlyStu9`E~Bi{~^3T`{h3G1G$N2T%lD(J^kGIuX3lDN(g>|OrQi4wy2nZ`u1wT_QXUnTJ|pN8us!JKA%J~Rz>yS3?&Q!-ixF>$;5IZh zb{B|ud-&y~{SCK;(TW0b+J_o0KC+$YDmro)7N6~jW!;w7&H>NFgu?3H0ll{N>fT|p z#F>n*jhd$yt~Xp8!4e;V>p?u=h2OqH@sE5+A#XBSb#Mhp*WS0trQdpSrQw5F#1GQ{ zPnDsep@s%m%kE%Wy`I163=+L}=IOvKA;1}s~MWSas z<#>l*n@t5g{W`!RKKj1L@{?WLn0$`QCFa-6@q5Xva9a#u!Z^S<$%q^hcTNm9=b+29 zgEFukiIK$~adC^}qTewAz48J?=dhz6#ic6J`(6Oh={b3AhHOKc}^v^VV*6(28_MDl<}enIs0)3d_|X&GcI z3Y&t`9+e*Cq}DZkQlgJY)}+O}nW3FQ2x34C*(I#{ zZ|BtiE8XHBTrgkird@M;qoPF@A9^!X$C%=aDQ#m@8>;XZ7gTyG1*QC3Agx0zIr%dHBn$FTaa?T{JkGnNW^m8m^4>HDnBnC%m zE+D5A%z!r6LFrKRu7%K*ZGj&r1pKGVL`6k`r2ksFV9Lxs67rm%*;a|;rL`0*7qjiX zme{-iu4nMCnZ!YXpZ4{QwBSb|R*TcLM2^{&LF@>GZY)jZH^>*E#~N+0CU1JmF;`60 zn;*PhczB?3#&^ZYsf1#|NZMY|-aRXdx8vlj)^i*FWd24^n$OOCfiF|3Sw2!C_n)S3 z56$=P*7}y5){nRvBYT%WsCKmewWvGYJRZRpOU;b)OIV*k@im#4G?KSvoIGl?)t0e3 z=d8)#zN|Hl=MvJy7Q9XVnjJjt{a4U~Kb(WVi;5IDWa8KVetjDlim|vKI6(g9YT}0c zy5s*TLh~O5Ln_6q>W)B?tlWS(X)l)s`w@799NZUo@Xy*)cgZe)?wK@RbJk~-lB|*I zJDei+>!TpY+zJY_$yacEO1gMf?qxs+t;}Vtdt{hU!JZYxm$^j9ofS$Lt6F>5Id)~V zalT*2dNc5xylD3qcS$lI*EL?v(kBxF>#6roIJ}<4sO}F|OB*xKgq|D9^H?^q)`AN5e(vy}20 zwdP5kniQjWVM&xg?XzZeBwxGr8~$rskbP`m6ki!1AJe_JQ`}im)<5iqvmGx%V>vdm z^v)#OqjGw6Frd{l7{1OmSnhAO_WYPAjq{z+?I*t96E^oiQzktczZp^NZ@s5+D(+&P z=Z>$*<+XrBwzSyoCf<+zeacpa0- zS8A{CB=KLbPGaZov>D(&*~t#%)Jx3Ihnvh{uJtfZCVkFFy+_DVv#0{@uk;@r`>MPS z3W|%%ncl4Q)*P@`vxR-6xEL~R^%lK7s3~DAT*S9bt*h#6jeCK=JT&KYM9s7j`OZ&= zCYE|s=|x*S8iM*Ew`;?uMnCX~`&i}Mdu3N`eMH4LaG0__P{}Sm6(1eWd;Z7u)%(q8 zX-yKdyv3wES;F7BRg^U`q-4!bRbCYFy=B$r%FU$0*LFt__|?Xbe;*zG0K4Mutt(PmQE#3?G5PQQP{on-U#w8C23=G(p?nTyQpGi4>C!GWs|XkXIXF?qjDG zu9qrt`oR%^Fb!X^4px)9RrqFtov`P<-J{7*vKTFq9exe@#ix2lpoI^40LNN8D5s+KBH{S`@O6=d$; zUR5OcLlm3)#QsNK@R!iD>lRNgp~T?k3=zpC3TEse5dK4&&} zU8v~ow`&(hzU(@ee7WnwxybiEe0SE*iGY-Y*y+Y5-ljXpZOmx!tOXJ-5G6lLjX>VdFCqQ96INrW% zH*lvEHOy9BU$^0?8YG_l($D?~FmI|P9f3Qx(SEeb+R6?7#2z=oWywfZPbBA+f5l8C z9d=dj%N>D^?A}^IMK0LFDVuj;VRz#9jP99Y7jfrMb($i>J7e1C@UMb$EZaZj;`i^n zGb@eNO6jh1BlW*Za1rZ=8aGpR8{nA7C`X>_y~V3=E!r|QHnC#8{z74CwDTB=ihj+o z&{F*^;<2$Zv)~VsQny0pXUfa*_;=NIBWH@qRDBH+a^~MmZkBxr{ylB5+FqJH+Lw{< z#1PTo7vRGcA^0&jT+2xxcAB5PwF-Ah2pd`X1P z;$fWecl{E_34t{&tKwD3yEb0-XzvSHjClm+Y)AD~!nKd(#Q0!x>%CWZpjHCTZDRKb zWQ(##fAQ+^w9dlSuSrNlnWt6468QnPwdn9u6fxot^XRx9HHw6#wc6aPSuAo)9xKiN zrbbY_y&`^Xf7kiY-v+DUl6c*N&icX37Tag9&i9QV=hL@fS<)-3&p&^cl#~1e$MAds zYaDSCTdm%X{HQlK^uCE?a#C!q&M++A{JC23XB!w3a6f(d5{}I}CO?a-{+sJH;)ioo zRaFIAe=x$|I;`Kk8ike}aX(Qnljj+s#j`!3@y;||drYT^V_Nq{{Ai6Z(vlL-F0NB4 zo2fT*O0>OyA2b~HU|_~@;zwEwk`j`&JQ1C!{lsA}X!v#NM8((T#i`96+t{Scm6#ht zc{enM2h?2FTuxC?JY(mTxSxU$mTI})cu~eM>PH#{a?fg(g=}R|%q;j$u36g~{`;nF zq3;W%fgktnL#P}c?!On&GKNo$5*aSv!d6@yYNw`MVPF$J^^ltm9wOIz6B==|KmuchC(j zEEJaE?z^Z__cN`&^-u8-zh$ObtI8wZ5Sq6$sb9|FjijcvHjTy6y11!0)5=4pfv2U5 z^;Lu39iQy)_X@O_wUx`>Z+b3F&qX@Vl`66={xeGyHq~D{B$iU1z z(;pX{IzC7En7+s2gz^z^P@l)UgD9IzCfe19U6MCjlQ2&p{ffWVTPh6c;M|7U=zRALWTiT<2S~i8N zlxwV@dG;-h*nSVuF*4 yojtR!k_%xwgYElSV_=I3VZi=KP5(S2YBT>1yZA>~!QVw4{&x%M>MF7vz4IALa-3rJp>DMaCZw3+yW#df#B{gf#47z1W#~xYqW#D zCg;vQnK}2)y))mu|GV@4XY=ju)wOHaUTanDs`XoI6*u2*7680QvI?>Q2m}J2!2f`o zB`jS9X=xKxbro5K$1?B>0DvX`*xJq>0S^Fd?OdGHgm&>egO~wbN~h51^`nt zX9pz>Sxo?bD9A|DI>Rg7(!U?469Bv=02pPLSEZ%>z5Jh|@XZ{YTmS&13a`y;ZsBYO zr(eM7=k6{Jx8(IymPSCjrJdjm!fCQw+Uhr&?Ps0eXvtgJ+}6$}2i zoHW&?;j}0KpkZ14LO=b5cCqk)^9cab_70v-)>hA4Xqn8IX}Ry;7owH7aDQ&$;=-i_HUpI-cHt^b_3?c3jK z9I5^6GZ4wZ?`6N=`+J#vCIASXz;zS%d)d=B08keK0Ay3Ym(hO!0NfV-P>;Xe_at*vNpi>1{yY0X@n+-_<3J8}Dg3}67b01-eA&;WD*6TlAe z0D^!BAPL9-j{p@w6VL;U0W;tkU<)__?tl*v2!sNWKpc<+qyp(cHc$YR0+m1=&Plgh1jT8PH>pI!F)n1Y`xW z1G$2HK*69$Py#3wlmRLLRe%~mZJ<8TFz7pI5wr<91f3%wB48m9Ay6aSL*PUZLXbjG zM9@SqLa;(`MDRj*fe?f68X*&*7@-!S4WS=l9AN=r8{q^IK*U5OLA-;=jwpmEji`dC zk7$YLgy@GDftZY#iCBu*h}eTTinxHdgZKjp1&I)e7Kt561W6uA3&{-05y=lJ3MmyS zAE_3p6KND_5$OQw8W|gz3YisI7+C>X7ugEg9XS*^895iZ2DuA)9C;P_6a@u^1cebr z5JetE55)$>8zlky^t*9fYtEezE zOf)bW51K5RKAIg`5Lz-?AzBOC2--T@1v(x&1G+G}3c5MECweS;HhLra5c(?m1qMC_ zBZe4;CWZ}0AjWHqQj9K)8H^)LOw7BO_c7HltuX^IUt^YI_F^t#{=g!@V!@KeGQ@Jl ziowdm`h@iz>j)bg`yRF=wm!BCb_{j_b_ezxHVlUlhXY3e#~jBW=Pgbx&IryPE;=p) zt`x2@t`}}HZWZnj?hYP0-aR~NJX1VBytjA_c$0W1_=Nb}_$v6e_)++U_nnU0?BidSdvPT36gVCYEmgu3(|1XQqmF9GcrmtNiqwv2(mJ=ak6uA zT5=h32zfkt9r-K;5(Nu|8ihMW8buey4kZz#2&EZi1Z5@V6cqv$3za&RH&qtZ0M!XK z4YeG#1N9r~4(c5m5*kSw8=6-%Ei{{8La;d48vF{}3f`h6rj??7PWzg+llI^a)gAde zu6Hu-e7SRRm+`LF-JrW=cW3D^=!EDj>0Z&b(;d)*>6Pex=!@v57|(-MtM)GDZbPFUBIq876Ed2_{FTOr|kr6lNi22=ja9uPg{G{4CE{-m(m_ zBCrauTC=`q9cDvjyU%9FmdQ5Bj>Rs;?#5okzQ{qs@t7lsqmE;blb%zbGoG`D^O}pF z>p538*EBZ)_ap8g?ndrI9u^)mp0_+>yx6?5y#BoPyih(?J`27yzHj`5{7U>`{O$Z# z0)hfg0;K|*g7kt<1m6ix3K0pZ3PlO^-bcRw;J*L;=KDW{1%zFMD~0z(*hL^Bg(4fG zjG`8z*`mv0cg0M_GQ<|dX~mz2e-K}gxFcaIktwkxNhfJ8nJc+2#VlnbRV=mlfa`(N zgPI3t(!$cd(w`n8K9qYH@$icbfsB?+s?411U0EyHBH05uemQTsPx8p}it_RDlM2)d zW(oxg2ag0F`9A7Y#8T8yOjTTZ%<|ajaibD~(j%orr5R-gWjp0M6+lHnB~fKol~L7E zwMh*{O;zo!+L}7Ix{rE~2BC(DMxn;3<^#=G&1o$rEmy5}ZCq_b?E>vHorgLJIt#j- zy1u&odK7xrdiDCK`r7)r`X>f521y31hWv)1h7(4NMjl3e#uUcSjX#>;nwXkYJwbk= z^Q7>}rKyT(rs>I3g{SYH9+*j+rI>A-OPaqj-?R|3NU&J96thgQ+^`a}O0?R1Ch;u! z*^afeb*eSgM&2gf<_w|&$%EWH*LhxMi)Q=8w!x0T4r147Ph;<4KkUHj5bChtDD0Tz zc;KYyl>t3>6Io?R# zX5Q^ScYFeU7Ja3BGyFh)PyO2c>HJ^#uLj5kVj9eopH8S^Dp zAT})yCC)BxB3>dsKLJ0%D`7cNDY5ny?W>4a$4MqheaU>u=_wc~t|<$zAHS}DL;oi3 z&1LGd)bY0u-j=ku=G)(sb(d$n^6M)*rrQ$Ys=K-pfqRLdkN=TFchX z?#U6#DafVBjm*8uv&&n^SI_S(5G*Jtq$-RpLMU=A+AKCK{#x>|q`s8BG^329EV3LZ zcP-zlcv3M@saV-wB~(>f%~1WWhOj207F6q5drb-KgPCTw7h7!Y4vJ7`Q-3vr_HKux!t6Fxa`nX;_FD2fc)ehQXQO#jcJu3&!Pe@w!}i5a=q~>5yFI48>V3)mfdk!x zRj3p6<}m7r{3!33@3{R$^2Tt#JbQz1CsBwP^=0kAj~F0K$jgpMv-o`t~We2MU1r zmo`!0zy9sH`q;le_bHtI^|>H8#JIiL240Tv7kU=wwk_ZmK>fV-Z{Mn>)^;u$&+Hv& zRh{fragJ zC&u~{WBrM-{%^uq@^Cxo7MuLr_szGPX+Ro4K|)4BMnXYBMnOeILBqhqz(7aGAi}}L z!XqUjBO@guA)%mV08>!XQIU|)veDArV`OGwCI_=~u`_WoFflXTHUffs6EV;*2r)1S znJ7ponEuPh%_jgK4bTTZAcF1y2>2jGe9%oN0ERP+40qbXkAJh_KnRF%eo@iTF)-m3 zYVZIA5F#Q15+X7(65NXn@`YaqknoWS?r=+?5UQD?-gPA635?G`qkB-%Myx)3K+pTs zDF_{dgp`b&g5e$`6Eh1Rzks07ePQW`GO}{=3Xe22wX}8MrnQ;5g{9RqYa3@5S2uSL zPp{w?A)#R}!y^(BUnM1{ynd6KnU$TBo0nfuSXotFQ(ITx(AeJ5+11_C+xK~7bZmTL z^4s^R#iiwy)wT7F%`NER(ecUY8SKaTty~~Du>7~>Xh9>ixiY0Pz0R z_1Hfy))PK0;dsB&VQaxKd$~>b5S_dItWuk^l^(!{QC=h*)U_hJtSTSNVUZyogtG zqQvC~7H-SB>J+)H?I&w4=_K}Ew7h-?^3Mfy&?0 z3_px|P-Ul+Ak)E${f>o>1BYy#{|n|b7f!PItvYv7*?HXvG^{$p=86s;1!nYynIAT5 z4)~f#$nuNtrCnrGV{!@JCcn7md&YSj*@}z)&cx<)M8CT{-;+*GJ(^ox7GKajK~|Z_ z;*I9E4DxPLNwctBo=c=XRS}hYl--1!ed9<~I{#^!BmpOt6^8fsroQiTD}ejm_4WcvOvmFSh_O#o66SUx_mQC&dmDZry{{8lLrM%634dS zbAbTdE6RViuTiuM3h4#GrlD|+SG%zlzn(FBSpj-U&7&2xUZ71&ovr;?RgS2RAd@M1 zNkzb_XOM1zV@>SKxT+XJfDoV~!?fv)Q9051O1t}x3_z?sq&|Adkk@AGU}+@i88d~J z={d(EWlAL<&>)G37lG471wI-BdC8`4^?iryg zL>hQ%lE@Z4*cH%+M_ljb*xx-1mAM+paA#kA=ezV^A2`;nnu_b6wS+S4p=Y+vbjz4fQrJez75eO|IJvk}J(d5uMfxMNXSEL|||OM}RCU*`)KFGoe`{6^}s z_y_f61?QT(HKTdnFUt$Q9CI){-Qy;c5pl0oNp{X-&l`XM{avVYM}Nk9bpu~bxwj4hQ;W`g0*ASq&MV#Au4MP* zq~6cOf!JBUyVot18Yr>CXOoz$4)Hs&oixwCPS3OvlN2d7Z%tuXRX9lZ@yOs~eY{l!br!kk9X*S{HmX&jeeHxb?L%HCpVI56YDRKQ z@G(FHXbK7p&lIA&U&d52%b7pX3ZyDPrE(I+k8?sN!YXlG(Sr!vWjQ*;b)CLkNcnvBt_uXG>WXdVxDm<0uWB=OW zY(D6E_q)3XO; zorL3q-xYGTkUfXmLi5Bkeig^;Yvt5B;z~-1Cqa`$dMA*Fe zR0a{tZ76%nBUzyGdVH*S?fYqZ^;?fxbo6@JV4Ju{foQIDj`vOb!Kt}9Q)l3lYw2Kx zi{63eua}DX*5wAq^9CY0gGt@%aXi6T$q5pe7zBzk4sx_U9RX7*^sS?% z3l|1_ann=85o_Zm%~hCLRc2>VL*tc1IJ_ZBCjQ$d#_h`UlX1G%!Zn#5Y0p-IL`sw` z(!R+Fp68Lob@f-wkKD^U#cS5=#bGn!9jgrywz z;q@JHSFii=e0jf=n)2i1hYPWc=e^n+Ai!1MHPKMdy7v5Q#MTloQX&_aRf&?-o(d-> zBMk9FY0q`zHSwStUy8uGl0Z#u+iyc*xaQ3V|Bb1i>m7UzhcAR#Ki9zk+@A~K&vFFH z>1X?F>$MF$$f*KRuUDQ;BbkM&W2AWnq3u9o8!9J`w<8UBMRgp6tOO6+iR0BW5CmnO zP$+<2@2eK($n| zdmV%MCDR9l2%spRf8&B;Gfiho|8NHX4kEW_p=G!C%NH-)mzu!0b2Y#1mk5KuEaMZh z8GmPB|6v_3Z#K2G8l`KJM>?Bw$vi~<_N51-pH@a)P~_oZVQ}{vQVesRl_S6F(|1nv z6~*y9&31^a%)PY7w4+7U%NR^RW&lRe)D@X5eKtf1l zwefNi;m@OI$V0#D%Ts5}zWHwCR7}ZSE5S$IAG}sdNgJ{44>v#zYy9Xk)7#+-XzUfG zUh1tJe^C41>kh;O2xj!Xb4AxciOLm*-C63_ot+88^-mod`X010f$xodYg#L9w1eKa zETPRT4uEsqBPcL2$HJ}jJkHQ~S~hN$Lu7=u~GTQjfg{m?22}7O2k{k^}1} zUA*<|PQr^_Ma=JHlaQzz^kF@r{zBBxm@4<#EjkZW(NLSQ(Q1~~BO{~6VBnqmv0lEq zH+m}kp|f%xUMHe(1LyD?eF62zWGqcCRd;LyFpfU3HhKUV|W4ksR}v2QR-o z$Xu{Bc8p3G(2Et*n}6t{5mIAuLCvaM-cVm(TV7pT-+;!DOr}Ml+JHfp-`B0oJIYAx ze*5Ny=ik0&$F{(2pZ{Yc^KTiS>!LE2PsU8g6M(^$YEp5T4+&O=p;3D#uM5+;o`Wha zh5(A*bPZDcew?t%>r16m)wpzS+7#3)N7NOqHb#0HF1R% znVbqQ;Zq^G*rz8QbTjz7TD#4h=Il?ybd%S$Sc&4AjJc+TCFTeo20pdpLeU63xgVzf zcvvGsuoXTQKuV{!xh}33;G8 zh`dXxrnS+Zg>b)YqWCMat2!A04zI?Z$v*Cvu#4#9!ZDEPpN;+hL1*PYM$5RkFxde^ zk3{Y2(c!jl4F2zLfLW z7~=18t+je;LgjPkG(TfPw&X)|7@DgA`W@{XAP_5XzJQu_jBolvOud_OR$vRWNg>6> zS&G)haSLtXD?(x1r#Q#dbf+7@!_P%x#y&^;118p|0w8MX!_@q&L=yVhl{kVSV{cT#oX<4XO zh7oaQnRq1~rTWdJR7&Sm_jmq%{MOTuvDX**GhJlITIxc(i8^RUJd7NgdI#wp(VX&) z!lmVhkU9F4wRDZvt7W*2VygTAG))!Q4XMwJ*ivA}ADH%zH=OQpMeK0Ja(=LkO%*|| zGDdL}c>^GCiDP|CG=Ul302Z$a8RkOw{QA6_35dO9FCFBl>&b_5)gGy-&)6u75Wo<- z_1$Ac`ALd$_oBZ%t*=Q8XU_$D3DSJHHbbeatvgd$HD+bJRJ{QxT;4yLJoA!^G}s{> z4h%7n<-oBNi<$JOfW3%(KH(Wyp_#GPi2`m(>e!!k9$VBsa1gWzpR@n{)H!> z|7EKD*O;_*7?wFHVeW0U?Iw6O4$~sBv!BF0b57;Eb&t9oBY^GS3?lXB`q0l)ijjR; zb#+k|t4TpDvFa)a&GDCd%QpaNtq*&4+oCW1)%2BxXn!7fP97B#?h5SXCo;i&&X4)3 z8CqLZ=uvp0ymKFfoW1%&m)$mTuM5c(-!H&X zn^jB3mDkloy4{c8;8I!w`^0;Qz@u?sN-&8k)h_)>0VZk^=~_~Y1B$E_ zH%<21q{Pd@av^(mkm#Lu7)d&bsB}(&3CX4C#1mC6JH9srKP2X8pX8sf)roRLP1@4v z>Mz)nYp_VaPuX&6PAjHMQepROrhY3nA%N*Tfb!8Of6UQ0;ozds?LN5yTzdvu1Br2B zE!B%=_LJnF$O{dsH26152p_z@25(=JQ?^jUdQ?XjjZ^Ki{U#x?d!>7--chMF7Eouk zgP8(rsG?+wLLXY=#{lb{Z1FsD^P!Bsb8YqDn6*M11Dc6nW(qBKLhaF$CMNsp$Z7BC z`{Fwjho~C6@$*wPg^&Is2w#V1+b`fv`Pz{doQ9F4`D9bTq!BC78HDf!$ zczcP4lb~7R7Tj+;VP{XH4jix6Ru*WQ$7OL02$}Qa=U_eEVEngz2akC?ARS5_5SSSIaOwSyq$wblhq%j$zF)mx6Dx1kaZHo>hbM%)VXv0hNw{j7xWF_z-gg zGLf3Lq?!y7pc8LhCvi~dVO`zgHj{{MFCgYgc3ZxS!oh zDP3ipJ+ra$y;~nqFiXefQQBB)gTlAkY#zAVHazz);SgL$vN;c=H zhxho!p02VNFBn!eYh1b--UF39@p_sR8KRN$xAkzPbQ1Mt#(1PLXDQru(2DPtM*J2$kuC#x*5)0w zunS+E#D=9t&5=$x*B68Nvu}W%KJ;a>(^Gk2CB5Sh>U*n=)ilw_gJ&<>E;_zl zVlT53cAvA@_|Y`$EiNcf`c!_JpK;yFI~EJ4niS1k&JreiRUl1?aJ;MUxH;CpgDo(hx}N+U>h+xYfhE&lj=130!M=?DCc)=;W` zhpPXtJm7zp-T&)aYtHI1mKdv9QL;CPOsAzOf8gEgi4>Er3duRh3q5Ydcvfz$&rsP0A!TfmpPh|$ z6K@?Q&SpNc8CVxL!q;f?!x_0`u%dUvq@PT|UNf3E6!@`c(j=0ma(_8bLVsf;vr)a` z%WQiDQ!Z_01UxeG56&`Cs8wKTNloxlYuM4fq@~x_)^wZp`J5V5{iBQ*b00n1Xu@Rf zC2E@~<+-TCAW)p1?%EWAk@j<|m&GlLS1iuqckJGn?BChx7_)5p>C4bbgq^j4r&9!` z=7QZ^(n)lECQ@IR?fZ}3mxJEf{Nk9lOnYpC;p2178g%q{(pKj&)H3;j$+yHd>fG1~ zflJ3dG{$5HM`2Tby1G9&_Eh!$CtY^H>Ypybe+4(Hu?AG7>pZQbG!}qSEJzm)k|k=6 zO~&ULq;-G~#{(B!f#7bZkEmVyR1z<$y}iX~@I9BJ^`dLvSl;hHi~oqvn+U@}k?)2% zE}~u1Wr{iv*z-qD3JOOb9ZnJo(ytr^CZMj5rH2kz_} z{|IznwFa8b^@%2QbNQ#9maZ{;>H|9tL^#=L?alF4<1OrSUy^lrH~m0C8supR>b{y~ zSVT7fmfrIG(KJt$HjCiQ7GG=ZHNjh%kQ(i#n#sejGuHS93Vg$#o4F`u(S~SO%)M9C zW23#?oP6k(15s5(H`XnE#ZR4K+UudsyqU14eYSkm!gHVTxO{4UyuDfztvI8f=rYeg zvn;KPPh6CUn8Sv$U%F{ibUJJ?ochKoEfvW(mE4G|dk7kb>=Q^PJTaOfP&yMIwJFy9&W!H#M?FhTQF`{xFD`lc*W9w|81L}pq_vB9AN+I9(LY@l{~!68^G|%$`{hRVPN-!U zX{&0&b5mtSS@Qe%ZLgPoSvy-;zRU?gyWcNhTG{UuSr{oAnG4MX1QQ{_v&kGfUAxgX zl~|k5n^@y~1Ztb0%1!=IQsa=UhB2MK5!>u->!-N=$5t1e7b_0m$`o?D!-*hNHu(_< zh54TV7eJ$^lzUbCzWI;$@b#>ao+&c|_^+HtCQE zsXwDboR6RTh^tanH(G4FQ*0{FZo90T8IFR$L#-73bl7%oyx;m$b3)$@iNM-%Qo6fef0n$l0TrHv4@+NK`pf-W0V>AF8!03`q2fY z#zAcv^IO$}uK91GqZ0;ByqM{aOXY@TyjpH!RomT{L^5@|$V>HR-P3~vQ)`d?J*hqn zwcxHA*BPp7yTOy!N_8!f<&mt2Q6{c8FY{GeTJ@{sE&dqD`g0-sKN$}szvhNwr-U?f z7HoS(2HIL6KKevsc&tUUBab*U`NrqYusu5;>w9NI^2tjn?lDdUst@)jj<}MAa@65> z6PF47+f|m~UUh0eh^%w5O@v4re&@6Kou&i7pr+4rQC_ddQzSDZSe^f&<@Pr$JH&xz z?fGvel%mYVgNIW#6Y3kWcQz92j-Gt*DW_FnieQ4eVWafULDokx9cr%)x{5Xqdncfe{I=v1 zu=~^Zt-z(iMh4xar~YKsVDv8Rg3+?$AEm4DNzGq3lo8&4>!EJTs)L6oksSps+*e^u zepZ&hfWQgy*sIplS(6Lr3(g&J_e;f=o;A-jZHd*|JwYq5dqk_`-;nv=g%=IoyEw_y zkv1BAr}QElIBU>cj@2(7kn>id#AkGDB{f%}(%UwtodKBXX%1 z+wuC<@n)Fbp+erZoQ`n=SeIlc3py$?l&oe)H+*<6WIp8AQ-{(hY^$p<^GBCZ+#iA~ z#-7mNuE}f6gTdUaoDK-vkqw@H~*D*dusk1EqM zP}5Gd>uZIRpJ)ciI;#HkKfJiuJ}Kf0_!~p`Z=wBv1fTWhXvaw(esyKnTH?uxu1>kf z`IA^xMA+gD@Dki*j5Wgloqgha*#hAYmgyk#cUWiV!>uP*Zm2oUH-HMv*;F$W zDL88EBITmvCDQ{+s_>_+~w=3=fGW* zq+;wqM-3O1UTUShKTDJ4_PiL^)Ec#y+<(rt^CIF{zx{wCw1wipEjBA3RKlJhNSEPb zF|^c~-dzW&Wcl1f|Na)C{?}LZ+tr^n0ooe)TvYY+ESzu3vf-J#{+3%h+b~%AYV|~8 zf0Tb>SfMCdgvN}d3JUI!?w#PHv?rR%L%2|S^W=4`c1S(r)f|foOrJDt1&rGaSwCqj z2XS9t?^sQJWQoxB?Q#8fgzgFsr(vd%eV?rllkNIKae8Xe(11CUt@ue|Uqc+%T5+K) zQvB}0$;#pUjLn3ajrLS@FN$YvLS>eq|LZ-(a&WX)l4nm>xJ3EMK9Wa`xXR9;9($>w zW2AL=ANslDk1@^ICZ|RA=id6i47cC10@j58$?Sn&U$(y_6j)aAc4eC=*dHm!$qxs3 zvJowxl<{7r-ih|Zex}});vLL4Dxp3?ZbF}K%nj4YXF?7T4TAK#yny1iiww%C)Ew+( zEODZ!IGnlJ=CJfRn;WiXa1&s1I7xvgfygTNZTpVPeHfz7qgjcvjuSC>a)eU#ScWb? zD-*{8PTA_rLweOuD^&PVvHC|~0^%DW^zA_?TF)u_iS)uKPv zn-SXw7uss}&Udp=@VoHngXB@&l_kX3?G;)is&PZ?7b+Tk1?J`JLltwvqtq%GF@~ZL ze9;Hdy@&0aZh#Tv?4d<#PybE%wM*u*8=#$AqKDd=*gWC$Rca{^t&cr)W)p#;1iCG1d_u#)XTLr$b4HH?OrjNG>5=colAN3VG-5#GW0#{TgWQbIk=jE(^mXNhg2C(07n@Tx#%gObeZXI?d z6MeJXfq!&QnKvrN3tzvFel4qx_ex^n`kpWC{9)PPb@C-HIqbW8!R9=fABEAgRE6;q zvI$t1#c4?0k)I6eS#kfo17)-8QtCiboh&M+-cOhAFAcV1!DoVF_MXGYe>T)m);Y~)eP6%0AXqO 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 IjzE0=A06=;dH?_b literal 0 HcmV?d00001 diff --git a/doc/modules/cassandra/assets/images/Figure_2_read_repair.jpg b/doc/modules/cassandra/assets/images/Figure_2_read_repair.jpg new file mode 100644 index 0000000000000000000000000000000000000000..29a912b49693db7b87a243266e8a66df4ef8b327 GIT binary patch literal 45595 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